Python中常见的循环有两类:
- for
- while
for 循环
list
list
是最常见的可迭代对象,其他可迭代的对象例如 dict
,set
,file lines,string
等
for i in set((1,2,3)): print(i)
输出:
1
2
3
import string list_num = list(string.digits) for i in list_num: # 输出偶数 if int(i)%2 == 0: print(i)
输出:
0
2
4
6
8
range
range 有头无尾
,e.g. range(1,3)
实际得到的序列是(1,2)
for i in range(3): print(i)
输出:
0
1
2
for i in range(1,9): # 输出偶数 if int(i)%2 == 0: print(i)
输出:
2
4
6
8
enumerate
enumerate
为循环的list加上index,这个index是编号是从0开始的
list_val = [1,2,3,5,8] for idx,val in enumerate(list_val): print(idx,val)
输出:
0 1
1 2
2 3
3 5
4 8
zip
同时遍历两个以上的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 循环
while相当于for和if的结合体。
while不一定执行的是循环,有时候功能和if差不多,这个时候while的意义相当于如果条件为真,那就执行如下操作
while更多扮演for和if联合的角色,相当于重复执行如下操作,知道判断条件(会不断变化)不再成立为止
while相当于if时
# 需要break的配合 x = 2 while(x>1): print('这个值大于1') break
输出:
这个值大于1
while充当for和if的混合体
# 需要自增的index来配合 idx = 1 while(idx < 5): print(idx) idx += 1
输出:
1
2
3
4
泛循环
如果将循环理解为按照顺序遍历一个序列。
除了用for、while还可以用其他函数达到“遍历”的效果。
列表解析
本质还是循环,常见的for循环在语句上的表现是多行,而列表解析
是一行
# 筛选奇数 num_odd = [i for i in range(1,10) if i%2==1] print(num_odd)
输出:
[1, 3, 5, 7, 9]
map
对序列中多个对象执行相同操作
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))
输出:
1
1
2
3
5
8
生成器
生成器和迭代器的对比
相同点:
- 从执行的结果看都是基于一定的规则”迭代“产生序列(无论是“无穷”系列还是“有穷”系列)
- 都支持iter,next方法
- “弹出”数值后,会清除已“弹出”的数值
不同点:
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)
输出:
8
6
4
2
循环的跳出和继续
break
是跳出循环,也就是不再执行该循环的操作,如果是嵌套循环,那么上层的循环也终止
continue
跳过当前的操作,进入下一轮循环,对上层的循环没有影响
pass
接着执行,用得很少,此处不讲
break,continue之后的语句也不会执行,所以一定要注意这两个关键字放置的位置
单层循环
for i in range(5): print(i) if i == 2: break # 当i=2时,循环结束 print('不会出现')
输出:
0
1
2
for i in range(5): if i == 2: continue # 跳过2这个值 print('不会出现') print(i)
输出:
0
1
3
4
i = 1 while(i<5): print(i) break # 执行一次就结束 print('不会出现')
输出:
1
i = 1 while(i<5): print(i) i += 1 if i == 2: continue print('不会出现')
输出:
1
2
3
4
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 a
1 a
2 a
for i in range(3): for j in list('abc'): if i == 1 or j=='b': continue print(i,j) #不会出现带1和b的输出值
输出:
0 a
0 c
2 a
2 c
来源:https://www.cnblogs.com/dataxon/p/12563843.html