如果需要重复执行某项工作,可用 while 或 for 循环来进行。其中 while 循环可依照条件来重复执行。而 for 循环则专门用来走访容器中的元素。
While 循环

n = int(input('请输入一个正整数:'))
k = n
while n > 1 :
n = n – 1
k = k * n
print(k)
使用 break 与 continue
break 用来跳出循环,而 continue 则可直接跳到循环的开头,略过后面未执行的部分。
i = 1
while True:
if i == 5:
i += 1
continue # 直接跳到 while 那行
print(I, end=' ')
if i == 10:
break # 直接跳出循环
i += 1
print('结束')
while … else …
while 也可以有 else,它跟 if 的 else 很像,就是当 while 条件为 False 时,就会执行 else 区块,然后结束循环。

for 循环:走访容器的每个元素
for 循环可将容器中的元素一一读取出来做处理,其语法如下:
s = [0, 1, 2, 3]
for i in s: # 每次由 s 中读取一个元素,并指定给 i
print(i, end=' ') # 输出的结果为 0 1 2 3
像以上这种「一一读取出来」的动作,就称为〝走访〞。凡是可走访的容器都可以用 for 来走访,如果有顺序的,例如:string, list, tuple 等,就会依序走访,而没有顺序的,例如:集合、字典等,则是随机走访,但每个元素都只会走访一次。
for a in 'abc':
print(a, end=' ')
print(' in str') # 输出为: a b c in str
for a in {0, 1, 2}:
print(a, end=' ')
print(' in set') # 输出为: 0 1 2 in set
for a in {'a':0, 'b':1, 'c':2}:
print(a, end=' ')
print(' in dict') # 输出为: a b c in dict
在走访字典时,其实读取到的是键(key),若要读取值、或键和值,则可用字典的 values() 或 items() 等方法。
d = {'a':0, 'b':1, 'c':2}
for a in d.values():
print(a, end=' ') # 输出为 0 1 2 in d.values
print(' in dict.values')
for a in d.items():
print(a, end=' ')
print(' in dict.items') # 输出为 ('a', 0) ('b', 1) ('c', 2) in dict.items
用多个变量走访
以上 d.items() 传回的是「元素为 tuple」的容器,因此每次循环中 a 都会被指定到一个 tuple,例如:(‘b’, 1)。此时可以用索引来读取 tuple 中的元素,例如:a[0], a[1]。不过若想要增加可读性,也可利用多重指定的技巧,用多变量来承接 tuple中的元素。
d = {'a':0, 'b':1, 'c':2}
for key, value in d.items():
print(key, value)
使用 range() 来走访数列
range(m, n) 会传回一个「由 m 到 n 但不包含 n」的数列容器。若 m 省略则预设为 0。但 n 不可以省略。
for i in range(10):
print(i, end=' ')
for i in range(1, 11):
print(i, end=' ')
另外还可在加第 3 个参数来指定递增量。省略时预设为 1,若指定为负值,则数列由大到小排列。
for i in range(1, 10, 2):
print(i, end=' ')
for i in range(9, 0, -2):
print(i, end=' ')
使用 break、continue 与 for … else …
for 和 while 一样,也可以使用 break 来跳出循环,或是用 continue 来跳到循环的开头。
for i in range(1, 20):
if i == 5:
continue # 直接跳到 while 那行
print(i, end=' ')
if i == 10:
break # 直接跳出循环
print('结束') # 输出结果为 1 2 3 4 6 7 8 9 10结束
for 也可搭配 else,当 for 走访完所有的元素后,会接着执行 else 区块,然后才结束循环。如果在 for 区块中使用 break,则不执行 else 区块。
s = “asxldjf;laszdjf”
for c in s:
if c == ‘k’: # 如果找到第一个 k 就显示找到讯息,
print(‘找到 k 了’)
break # 然后跳出循环。
else:
print(‘没找到 k’) # 如果全部找完,未发现 k,就显示没找到。
for 的多变量走访
「for 变量 in 容器」的运作,其实就是每次从容器中取出一个元素指定给变量,所以也是一种指定运算,因此也可以使用「多重指定」和「自动解包」。
person = {22: ('张', '天才'), 23: ('王', '子帅'), 24:('陈', '美美')}
for person_id, (lastname, firstname) in person.items():
print(str(person_id) + '号-' + lastname + firstname)
用 enumerate() 产生元素有序号的容器
内部函数 enumerate(容器, 序号起始值) 可传回一个将元素加了序号的新容器,例如:原来的第 0 个元素 ‘a’ 会变成 (0, ‘a’),第 1 个元素 ‘b’ 会变成 (1, ‘b’)…, 序号若省略则从 0 开始。
drinks = ('红茶', '咖啡', '果汁')
print(list(enumerate(drinks, 5))) # 输出结果为 [(5, '红茶'), (6, '咖啡'), (7, '果汁')]
for sn, drink in enumerate(drinks):
print(sn, drink, end=' ')
用 zip() 同时走访多个容器
内建函示 zip() 可接受多个容器作为参数,然后每次读取这些容器中的一个元素,并打包成 zip 容器传回。Zip 会一直走访到其中某一个容器读完为止。
drinks = ('红茶', '咖啡', '果汁')
prices = (35, 50, 65)
matchs = ('饼干', '蛋糕', '三明治', '松饼')
for drink, price, match in zip(drinks, prices, matchs):
print(drink, price, '元,建议甜点:' + match)
输出的结果为:
红茶 35元,建议甜点:饼干
咖啡 50元,建议甜点:蛋糕
果汁 65元,建议甜点:三明治
matchs 虽然有 4 个元素,但 drinks 及 prices 只有 3 个,所以只会产生三个。
for 的容器生成式
我们可以在 [ ] 和 { } 里头置入一个 for 循环,从一个容器取出元素加以运算后,自动生成串行、集合或字典等容器。
串行生成式:[ 表达式 for 变量 in 容器 ]
集合生成式:{ 表达式 for 变量 in 容器 }
字典生成式:{ 表达式_K : 表达式_V for 变量 in 容器 }
list1 = [i*i for i in range(1, 6)]
print(list1) # 输出 [1, 4, 9, 16, 25]
set1 = {i*i for i in range(1, 6)}
print(set1) # 输出 {1, 4, 9, 16, 25}
dict1 = {i : i*i for I in range(1, 6)}
print(dict1) # 输出 {1:1, 2:4, 3:9, 4:16, 5:25}
在生成式中还可以加上 if 来做筛选,例如:
[ 表达式 for 变量 in 容器 if 条件式 ]
s = [ i*i for i in range(1, 11) if i % 2 == 0]
print(s) # [4, 16, 36, 64, 100]
其实在 for 之后可加上任意数量的 for 或 if,依由左而右的顺序,形成又外而内的多层巢状结构。
a = [[1, 2, 3], [4, 5, 6], [7, 8, 9]]
b = [e2 for e1 in a for e2 in e1 if e2 != 4]
相当于
a = [[1, 2, 3], [4, 5, 6], [7, 8, 9]]
b = []
for e1 in a:
for e2 in e1:
if e2 != 4:
b.append(e2)
博客介绍了Python中while和for循环的使用。while循环可依条件重复执行,还能搭配else;for循环用于走访容器元素,可使用break、continue,也能搭配else。此外,还介绍了用多个变量走访、range()函数、enumerate()和zip()函数,以及for的容器生成式等内容。

被折叠的 条评论
为什么被折叠?



