Python 3 入门手札(09)循环 while 及 for

博客介绍了Python中while和for循环的使用。while循环可依条件重复执行,还能搭配else;for循环用于走访容器元素,可使用break、continue,也能搭配else。此外,还介绍了用多个变量走访、range()函数、enumerate()和zip()函数,以及for的容器生成式等内容。

如果需要重复执行某项工作,可用 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)
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值