目录
for 循环
- list
- range
- enumerate
- zip
while 循环
while 相当于 if 时
while 充当 for 和 if 的混合体
泛循环
列表解析
map
迭代器
生成器
循环的跳出和继续
单层循环
嵌套循环
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 方法
"弹出" 数值后, 会清除已 "弹出" 的数值
不同点:
生成器属于迭代器中的一种
在定义的时候, 定义生成器就和定义函数一样自然(同时会自动产生 iter 和 next 方法), 而定义迭代器则主要通过 iter,next 来定义序列;
更多参考 1
更多参考 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)
输出:
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