Python 循环语句
- 可迭代对象
循环是针对可迭代对象的操作,可迭代对象指每次可以返回其中一个元素的对象,包括字符串、列表和元组等序列类型,字典和文件等非序列类型。可以使用迭代器和生成器定义可迭代对象 - 迭代变量
迭代变量命名模式建议使用迭代变量和可迭代对象指定相同的名称,但是分别使用单复数形式(迭代变量使用单数,可迭代对象使用复数)
for 循环
for 循环用来遍历可迭代对象,如列表、字典,即使用迭代变量依次访问迭代对象中的元素,一般将其带入到缩进代码里进行处理。
for 循环是一种有限迭代,即循环主体的运行次数已提前定义好(对迭代对象中的每个元素运行主体一次)。
python
# iterable of cities
cities = ['new york city', 'mountain view', 'chicago', 'los angeles']
# for loop that iterates over the cities list
for city in cities:
print(city.title())
Announce
- 以关键字
for开始 iteration_variable in iterable,其中iterable表示被遍历的是可迭代的对象,literation_variable表示迭代变量(即当前正在被处理的可迭代对象的元素),使用关键字in迭代变量从可迭代对象中取出元素- 以冒号
:结尾
while 循环
定义
while 循环是一种无限迭代,即循环重复次数运行前未知(但并不是无法终止循环的「死循环」),并在满足某个条件时结束循环
python
card_deck = [4, 11, 8, 5, 13, 2, 8, 10]
hand = []
# adds the last element of the card_deck list to the hand list
# until the values in hand add up to 17 or more
# pop is the list method to remove the last element of it and get this element
while sum(hand) <= 17:
hand.append(card_deck.pop())
Announce
- 以关键字
while开始 - 后面是一个布尔表达式检查条件,根据布尔值是否为
true决定是否运行循环主体 - 以冒号
:结尾 - 每次进行循环前先要进行条件评估,为了避免进行「死」循环,需要在缩进主体中至少修改测试条件表达式中的一个变量
中断语句
控制何时循环应该结束,或者跳过某个迭代。使用关键字 break 和 continue 实现。
break 语句
break 语句使循环终止,跳出整个循环,执行下一行代码。
continue 语句
continue 语句跳过当前循环的这一次迭代,从头执行下一次循环
迭代器 literator
迭代器是一种表示数据流的对象,可使用生成器创建迭代器。
生成器 generator
生成器一般指生成器函数(也可指函数生成的迭代器对象,即迭代器),即使用函数创建迭代器
python
def my_range(x):
# 生成器函数,生成一个从 0 到 x-1 的数字流
i = 0
while i < x:
yield i
i += 1
Warning
- 关键字
yield(而非return)使函数能够每一次返回一个值 - 关键字
yield使函数每次被调用时都从停下的位置继续 - 关键字
yield将生成器函数与普通函数区分开来
调用生成器函数
python
print(my_range(5))
🔨 编译结果
shell
# 打印出存储迭代器的内存地址
<generator object my_range at 0x111a2d938>
输出数据流的值使用for循环
python
for n in my_range(5):
print(n)
🔨 编译结果
shell
0
1
2
3
4
对比
- 可迭代对象(如列表),是可迭代(每次取出一个元素)但不是数据流
- 迭代器则是一个数据流对象
生成器的优点
生成器是构建迭代器的「懒惰」方式。当内存不够存储完整实现的列表时,或者计算每个列表元素的代价很高,你希望尽量推迟计算时,就可以使用生成器。但是这些元素只能遍历一次。
由于使用生成器是一次处理一个数据,在内存和存储的需求上会比使用列表 list 等方式,直接全部生成再存储,节省很多资源。