• 1.9.控制结构

    1.9.控制结构

    正如我们前面提到的,算法需要两个重要的控制结构:迭代和选择。Python以各种形式支持这两种方法。程序员可以对给定环境选择最有用的语句。

    对于迭代,Python提供了一个标准的while语句和一个非常强大的for语句。只要条件为真,while语句就会重复一段代码。 例如,

    1. >>> counter = 1
    2. >>> while counter <= 5:
    3. ... print("Hello, world")
    4. ... counter = counter + 1
    5. Hello, world
    6. Hello, world
    7. Hello, world
    8. Hello, world
    9. Hello, world

    把“你好,世界”这个短语打印出来五次。在每次重复的开始时评估while语句的条件。如果条件为真,则将执行语句主体。由于语言强制执行的强制缩进模式,很容易看到Python while语句的结构。s

    while语句是一个非常通用的迭代结构,我们将在许多不同的算法中使用它。 在许多情况下,复合条件将控制迭代。 片段如

    1. while counter <= 10 and not done:
    2. ...

    只会在条件的两个部分都满足的情况下才会执行语句的主体。 变量counter的值需要小于或等于10,并且变量done的值需要为False(not False为True),以便True and True结果为True。

    即使这种类型的构造在各种情况下都非常有用,但是另一个迭代结构for语句,可以与许多Python集合一起使用。 只要集合是序列,for语句就可以用于迭代集合的成员。 所以,例如,

    1. >>> for item in [1,3,6,2,5]:
    2. ... print(item)
    3. ...
    4. 1
    5. 3
    6. 6
    7. 2
    8. 5

    将变量item指定为列表中[1,3,6,2,5]的每个连续值。 然后执行迭代的主体。 这适用于任何序列集合(列表,元组和字符串)。

    for语句的一个常见用途是在一系列值上实现明确的迭代。 如下

    1. >>> for item in range(5):
    2. ... print(item**2)
    3. ...
    4. 0
    5. 1
    6. 4
    7. 9
    8. 16
    9. >>>

    该语句将执行五次print功能。 range函数将返回表示序列0,1,2,3,4的范围对象,并且每个值将分配给变量item。 然后将该值平方并打印。

    此迭代结构的另一个非常有用的版本用于处理字符串的每个字符。 以下代码片段遍历字符串列表,并且每个字符串通过将每个字符追加到列表上来处理每个字符。 结果为所有单词中所有字母的列表。

    1. wordlist = ['cat','dog','rabbit']
    2. letterlist = [ ]
    3. for aword in wordlist:
    4. for aletter in aword:
    5. letterlist.append(aletter)
    6. print(letterlist)

    选择语句允许程序员提出问题,然后根据结果执行不同的操作。 大多数编程语言都提供了这个有用结构的两个版本:ifelse和if。 一个简单示例是使用ifelse语句实现二分选择。

    1. if score >= 90:
    2. print('A')
    3. else:
    4. if score >=80:
    5. print('B')
    6. else:
    7. if score >= 70:
    8. print('C')
    9. else:
    10. if score >= 60:
    11. print('D')
    12. else:
    13. print('F')

    此片段将通过打印所获得的字母等级对名为score的值进行分类。 如果分数大于或等于90,则语句将打印A.如果不是(else),则询问下一个问题。 如果分数大于或等于80,那么它必须在80到89之间,因为第一个问题的答案是错误的。 在这种情况下,打印B。 您可以看到Python缩进模式有助于理解if和else之间的关联而无需任何其他语法元素。

    此类嵌套选择的替代语法是使用elif关键字。 将else和下一个if组合起来,以消除对额外嵌套级别的需要。 请注意,如果所有其他条件都失败,则仍需要最终的else来提供默认情况。

    1. if score >= 90:
    2. print('A')
    3. elif score >=80:
    4. print('B')
    5. elif score >= 70:
    6. print('C')
    7. elif score >= 60:
    8. print('D')
    9. else:
    10. print('F')

    Python也有单向选择构造,即if语句。 使用此语句,如果条件为true,则执行操作。 在条件为假的情况下,简单地继续执行到if之后的下一个语句。 例如,以下片段将首先检查变量n的值是否为负数。 如果是,则由绝对值函数修改。 无论如何,下一步是计算平方根。

    1. if n<0:
    2. n = abs(n)
    3. print(math.sqrt(n))

    返回列表,有一种替代方法来创建一个列表,它使用迭代和选择构造,称为list comprehension。列表推导允许您根据某些处理或选择标准轻松创建列表。 例如,如果我们想要创建前10个完美正方形的列表,我们可以使用for语句:

    1. >>> sqlist=[]
    2. >>> for x in range(1,11):
    3. sqlist.append(x*x)
    4. >>> sqlist
    5. [1, 4, 9, 16, 25, 36, 49, 64, 81, 100]
    6. >>>

    使用列表推导( 又称列表综合 ),我们可以一步完成

    1. >>> sqlist=[x*x for x in range(1,11)]
    2. >>> sqlist
    3. [1, 4, 9, 16, 25, 36, 49, 64, 81, 100]
    4. >>>

    变量x采用for构造指定值1到10。 然后计算x * x的值并将其添加到正在构造的列表中。 列表推导的一般语法还允许添加选择标准,以便仅添加某些项。 例如,

    1. >>> sqlist=[x*x for x in range(1,11) if x%2 != 0]
    2. >>> sqlist
    3. [1, 9, 25, 49, 81]
    4. >>>

    此列表推导构造了一个列表,该列表仅包含1到10范围内的奇数的平方。任何支持迭代的序列都可以在列表推导中用于构造新列表。

    1. >>>[ch.upper() for ch in 'comprehension' if ch not in 'aeiou']
    2. ['C', 'M', 'P', 'R', 'H', 'N', 'S', 'N']
    3. >>>