@1007477689
2020-04-22T02:15:42.000000Z
字数 3285
阅读 670
Python
Python中常见的循环有两类:
list 是最常见的可迭代对象,其他可迭代的对象例如 dict , set , file lines , string 等
for i in set((1, 2, 3)):print(i)
>>> 123
import stringlist_num = list(string.digits)for i in list_num:# 输出偶数if int(i)%2 == 0:print(i)
>>> 02468
range 有头无尾,e.g. range(1,3) 实际得到的序列是 (1,2)
for i in range(3):print(i)
>>> 012
for i in range(1, 9):# 输出偶数if int(i)%2 == 0:print(i)
>>> 2468
enumerate 为循环的 list 加上 index,这个 index 是编号是从 0 开始的
list_val = [1, 2, 3, 5, 8]for idx, val in enumerate(list_val):print(idx, val)
>>> 0 11 22 33 54 8
同时遍历两个以上的 list,并按顺序打包
list_1 = string.digits[:3]list_2 = string.ascii_lowercase[:3]list_3 = string.ascii_uppercase[:3]print(list_1, list_2, list_3)
>>> 012 abc ABC
list_merge_1 = list(zip(list_1, list_2, list_3))print(list_merge_1)list_merge_2 = [i+j+k for (i, j, k) in zip(list_1, list_2, list_3)]print(list_merge_2)
输出:[('0', 'a', 'A'), ('1', 'b', 'B'), ('2', 'c', 'C')]['0aA', '1bB', '2cC']
# 元素组合list_merge_3 = [i+j for i in list('123') for j in list('ABC')]print(list_merge_3)
>>> ['1A', '1B', '1C', '2A', '2B', '2C', '3A', '3B', '3C']
while 相当于 for 和 if 的结合体。
while 不一定执行的是循环,有时候功能和 if 差不多,这个时候 while 的意义相当于如果条件为真,那就执行如下操作
while 更多扮演 for 和 if 联合的角色,相当于重复执行如下操作,知道判断条件(会不断变化)不再成立为止
for 循环中迭代的条件是遍历一个序列,这个序列是有限或者确定的。
while循环则是基于条件判断,而没有明确的迭代序列,所以 while 循环可以用来探索序列(先试着执行,有问题咱就退出),比如爬虫的时候你不知道网页page_index到哪结束;
for循环不会“重复”执行完全一样的操作,除非迭代的list对象是一样的,而while是可以重复执行相同操作的,这种特定在需要“重试”的场景中会经常用到。e.g.网页返回失败的时候可以重试几次,登陆失败的时候可以重试几次。
# 需要break的配合x = 2while (x > 1):print('这个值大于1')break
>>> 这个值大于1
# 需要自增的index来配合idx = 1while (idx < 5):print(idx)idx += 1
>>> 1234
如果将循环理解为按照顺序遍历一个序列。除了用 for、while 还可以用其他函数达到“遍历”的效果。
本质还是循环,常见的 for 循环在语句上的表现是多行,而列表解析是一行
# 筛选奇数num_odd = [i for i in range(1, 10) if i%2 == 1]print(num_odd)
>>> [1, 3, 5, 7, 9]
对序列中多个对象执行相同操作
list(map(lambda x: x**2, range(4)))
>>> [0, 1, 4, 9]
list_words = ['life','is','short','use','python']list(map(lambda x:len(x),list_words))
>>> [4, 2, 5, 3, 6]
变种的for循环
按顺序将序列值一次“弹出”,同时被”弹出“的值移出序列
序列为空时,报错StopIteration
vals_iter = iter(list(range(3)))
next(vals_iter)
输出:0
迭代器可以如上述举例一样是”有穷“的迭代,也可以是”无穷“的,比如自增序列(index为自然顺序)
class test_iter:
def init(self):
self.a = 1
self.b = 1
def __iter__(self):
return self
def __next__(self):
x = self.a
self.a, self.b = self.b, self.a+self.b
return x
fb = test_iter()
for i in range(6):
print(next(fb))
输出:112358
生成器
生成器和迭代器的对比
相同点:
从执行的结果看都是基于一定的规则”迭代“产生序列(无论是“无穷”系列还是“有穷”系列)
都支持iter,next方法
“弹出”数值后,会清除已“弹出”的数值
不同点:
生成器属于迭代器中的一种
在定义的时候,定义生成器就和定义函数一样自然(同时会自动产生iter和next方法),而定义迭代器则主要通过iter,next来定义序列;
更多参考1[1]
更多参考2[2]
def num_even(x):
while(x>0):
if x%2 == 0:
yield x
x -= 1
x = num_even(9)
for i in x:
print(i)
输出:8642
break 是跳出循环,也就是不再执行该循环的操作,如果是嵌套循环,那么上层的循环也终止continue 跳过当前的操作,进入下一轮循环,对上层的循环没有影响pass 接着执行,用得很少,此处不讲break, continue 之后的语句也不会执行,所以一定要注意这两个关键字放置的位置
for i in range(5):print(i)if i == 2:break# 当i = 2时,循环结束print('不会出现')
>>> 012
for i in range(5):if i == 2:continue# 跳过2这个值print('不会出现')print(i)
输出:0134
i = 1while(i<5):print(i)break# 执行一次就结束print('不会出现')
输出:1
i = 1while(i<5):print(i)i += 1if i == 2:continueprint('不会出现')
>>> 1234
while中用continue要小心啊,比如如下代码是会一直执行的
i = 1
while(i<5):
print(i)
if i == 2:
continue
print('不会出现')
i += 1
for i in range(3):for j in list('abc'):if j == 'b':break# 到b的时候就停止了print(i, j)
>>> 0 a1 a2 a
for i in range(3):for j in list('abc'):if i == 1 or j =='b':continueprint(i, j)#不会出现带1和b的输出值
输出:0 a0 c2 a2 c
