参考来源:Vitu.AI

简单地回顾一下,上一节课我们初步认识了列表(list)和元组(tuple),这两个批量存储数值的事物。

这一节课我们来学习一下循环(Loop),这是一种重复执行某些代码的方法。我们会了解到for和while两种不同的循环,以及如何有效地利用列表解析,这一python的高级属性。

 for循环

首先,让我们来看一个例子,还是我们熟悉的列表planets:

planets = ['Mercury', 'Venus', 'Earth', 'Mars', 'Jupiter', 'Saturn', 'Uranus', 'Neptune']

for planet in planets:
    print(planet, end=' ') # 在同一行显示全部行星的名字,以空格做间隔

从上面的例子里总结一下,for循环需要指定两个要素:

第一个要素是,要使用的变量名字 (在上面的代码中,特指变量planet)

第二个要素是,要循环的范围 (在上面的代码中,特指列表planets[]

在上一节课,我们讲过in, 用来判断一个数值是否在一个列表中。

而在for循环里,in是我们用连接上述两个要素的关键词。

in左侧的对象是第一个要素,in右侧的对象是第二个要素,即是支持循环的任何对象。基本上,它可以被认为是一组东西,我们可以循环它。

除了列表,我们可以循环元组,下面的代码,相当于在帮我们计算“2的6次方”是多少:

multiplicands = (2, 2, 2, 2, 2, 2)

product = 1

for mult in multiplicands:
    product = product * mult

product

同样,我们也可以循环字符串里的每一个字母。

没错,上方的循环会显示Hello World,这个所有程序员都知道的,如何进入编写代码的世界的初始口令。

range()是我们常用在循环里的一个函数。 事实证明,它对编写循环还是非常有用的。

例如,如果我们想重复一些动作3次:

for i in range(3):
    print("重要的事情要重复三遍. i =", i)

 while循环

Python里还有一种循环,叫做while循环。

和for的整体循环不同的是,while循环是直到某些条件被满足才会被触发循环。

让我们来看个例子:

i = 0
while i < 10:
    print(i, end=' ')
    i += 1

while循环里的参数是对布尔值(booleans)的判断,当这种循环的前提条件被判断为false时,循环就停止。

像上方的代码中,当变量i等于10的时候,循环就停止。

列表解析

列表解析/推导/生成器是Python最受欢迎和独特的功能之一,这个功能充分利用了for循环。

让我们来看一个例子:

squares = [n**2 for n in range(10)]
squares

上面的代码简洁明了地帮我们罗列了0-9这十个数字的平方。

如果不使用这一特性,我们该如何用python实现呢?

squares = []

for n in range(10):
    squares.append(n**2)

squares

是的,正如上方的代码所示,我们得先创建一个空的列表,把for循环里的每一个值用list.append()添加到最初创建的列表里。

我们还可以在列表解析里添加if的条件判断。用我们熟悉的列表planets来举个例子:

# 我们需要名字小于6个字母的行星

short_planets = [planet for planet in planets if len(planet) < 6]
short_planets

再看一个和if条件判断并相关,并对列表里的元素做了一些格式转换的例子:

loud_short_planets = [planet.upper() + '!' for planet in planets if len(planet) < 6]
loud_short_planets

上方的例子是不是看起来有点复杂?没错,因为正常人类都是一行一行得阅读代码。

让我们把上述的例子分行来看看:

[
    planet.upper() + '!' 
    for planet in planets 
    if len(planet) < 6
]

这样,我们想要做的三个操作就一目了然了,让我们按照对人类阅读逻辑友好的顺序来解读:

  • for循环的范围是列表planets
  • if的判断条件是列表里的少于6个字母的元素
  • 将满足条件的每一个元素都变成大写,并在单词的末尾加上惊叹号

同样地,细心的你可能注意到上方的代码没有赋予一个列表来存储循环的输出结果。当然这种做法不是特别的常见。

让我们再来看一个类似操作的有趣的例子:

[32 for planet in planets]

是的,没错,在上方的代码里,列表解析被用于提供32这个数值出现的次数。

更有趣的是,列表推导与min(),max()和sum()等功能相结合,我们可以把需要多行代码才能解决的问题用令人印象深刻的单行代码解决方案。

让我们一起看一看同一个问题用python的三种不同解决方案:

需要解决的问题是:一组列表里的负数有几个?

# 方案一:不使用列表解析

def count_negatives(nums):
    """Return the number of negative numbers in the given list.
    
    >>> count_negatives([5, -1, -2, 0, 3])
    2
    """
    n_negative = 0
    for num in nums:
        if num < 0:
            n_negative = n_negative + 1
    return n_negative
# 方案二:使用解析列表

def count_negatives(nums):
    return len([num for num in nums if num < 0])
# 方案三:使用解析列表并使用`sum()`

def count_negatives(nums):
    return sum([num < 0 for num in nums])

是不是看起来有一点复杂,没关系,我们这里只是想展示python作为编程语言的易读,简洁和使用的多样性。

我们会对这一门美妙的编程语言慢慢熟悉起来的。

原文地址:初始python【今天开始写代码】第五课


VituTech
1 声望2 粉丝