[关闭]
@1007477689 2020-04-22T02:15:42.000000Z 字数 3285 阅读 352

Python基础 | 关于“循环”那些事

Python


I. 概览

for 循环

while 循环

泛循环

循环的跳出和继续

Python中常见的循环有两类:

II. for 循环

(1) list

list 是最常见的可迭代对象,其他可迭代的对象例如 dict , set , file lines , string

Example 1

  1. for i in set((1, 2, 3)):
  2. print(i)
  1. >>> 123

Example 2

  1. import string
  2. list_num = list(string.digits)
  3. for i in list_num:
  4. # 输出偶数
  5. if int(i)%2 == 0:
  6. print(i)
  1. >>> 02468

(2) range

range 有头无尾,e.g. range(1,3) 实际得到的序列是 (1,2)

Example1

  1. for i in range(3):
  2. print(i)
  1. >>> 012

Example2

  1. for i in range(1, 9):
  2. # 输出偶数
  3. if int(i)%2 == 0:
  4. print(i)
  1. >>> 2468

(3) enumerate

enumerate 为循环的 list 加上 index,这个 index 是编号是从 0 开始的

  1. list_val = [1, 2, 3, 5, 8]
  2. for idx, val in enumerate(list_val):
  3. print(idx, val)
  1. >>> 0 1
  2. 1 2
  3. 2 3
  4. 3 5
  5. 4 8

(4) zip

同时遍历两个以上的 list,并按顺序打包

Example1

  1. list_1 = string.digits[:3]
  2. list_2 = string.ascii_lowercase[:3]
  3. list_3 = string.ascii_uppercase[:3]
  4. print(list_1, list_2, list_3)
  1. >>> 012 abc ABC

Example2

  1. list_merge_1 = list(zip(list_1, list_2, list_3))
  2. print(list_merge_1)
  3. list_merge_2 = [i+j+k for (i, j, k) in zip(list_1, list_2, list_3)]
  4. print(list_merge_2)
  1. 输出:[('0', 'a', 'A'), ('1', 'b', 'B'), ('2', 'c', 'C')]['0aA', '1bB', '2cC']

Example3

  1. # 元素组合
  2. list_merge_3 = [i+j for i in list('123') for j in list('ABC')]
  3. print(list_merge_3)
  1. >>> ['1A', '1B', '1C', '2A', '2B', '2C', '3A', '3B', '3C']

III. while 循环

while 相当于 for 和 if 的结合体。

while 不一定执行的是循环,有时候功能和 if 差不多,这个时候 while 的意义相当于如果条件为真,那就执行如下操作

while 更多扮演 for 和 if 联合的角色,相当于重复执行如下操作,知道判断条件(会不断变化)不再成立为止

for 和 while 的区别

for 循环中迭代的条件是遍历一个序列,这个序列是有限或者确定的。
while循环则是基于条件判断,而没有明确的迭代序列,所以 while 循环可以用来探索序列(先试着执行,有问题咱就退出),比如爬虫的时候你不知道网页page_index到哪结束;
for循环不会“重复”执行完全一样的操作,除非迭代的list对象是一样的,而while是可以重复执行相同操作的,这种特定在需要“重试”的场景中会经常用到。e.g.网页返回失败的时候可以重试几次,登陆失败的时候可以重试几次。

while 相当于 if 时

  1. # 需要break的配合
  2. x = 2
  3. while (x > 1):
  4. print('这个值大于1')
  5. break
  1. >>> 这个值大于1

while 充当 for 和 if 的混合体

  1. # 需要自增的index来配合
  2. idx = 1
  3. while (idx < 5):
  4. print(idx)
  5. idx += 1
  1. >>> 1234

IV. 泛循环

如果将循环理解为按照顺序遍历一个序列。除了用 forwhile 还可以用其他函数达到“遍历”的效果。

(1)列表解析

本质还是循环,常见的 for 循环在语句上的表现是多行,而列表解析是一行

  1. # 筛选奇数
  2. num_odd = [i for i in range(1, 10) if i%2 == 1]
  3. print(num_odd)
  1. >>> [1, 3, 5, 7, 9]

(2)map

对序列中多个对象执行相同操作

  1. list(map(lambda x: x**2, range(4)))
  1. >>> [0, 1, 4, 9]
  1. list_words = ['life','is','short','use','python']
  2. list(map(lambda x:len(x),list_words))
  1. >>> [4, 2, 5, 3, 6]

(3)迭代器

变种的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

V. 循环的跳出和继续

break, continue 之后的语句也不会执行,所以一定要注意这两个关键字放置的位置

(1)单层循环

  1. for i in range(5):
  2. print(i)
  3. if i == 2:
  4. break
  5. # 当i = 2时,循环结束
  6. print('不会出现')
  1. >>> 012
  1. for i in range(5):
  2. if i == 2:
  3. continue# 跳过2这个值
  4. print('不会出现')
  5. print(i)
  1. 输出:0134
  1. i = 1
  2. while(i<5):
  3. print(i)
  4. break# 执行一次就结束
  5. print('不会出现')
  1. 输出:1
  1. i = 1
  2. while(i<5):
  3. print(i)
  4. i += 1
  5. if i == 2:
  6. continue
  7. print('不会出现')
  1. >>> 1234

while中用continue要小心啊,比如如下代码是会一直执行的

i = 1
while(i<5):
print(i)

if i == 2:
    continue
    print('不会出现')

i += 1

(2)嵌套循环

Example 1

  1. for i in range(3):
  2. for j in list('abc'):
  3. if j == 'b':
  4. break
  5. # 到b的时候就停止了
  6. print(i, j)
  1. >>> 0 a
  2. 1 a
  3. 2 a

Example 2

  1. for i in range(3):
  2. for j in list('abc'):
  3. if i == 1 or j =='b':
  4. continue
  5. print(i, j)
  6. #不会出现带1和b的输出值
  1. 输出:
  2. 0 a
  3. 0 c
  4. 2 a
  5. 2 c
添加新批注
在作者公开此批注前,只有你和作者可见。
回复批注