转自:微点阅读  https://www.weidianyuedu.com

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)

输出:123

import string

list_num = list(string.digits)

for i in list_num:

# 输出偶数

if int(i)%2 == 0:

print(i)

输出:02468

range

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

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联合的角色,相当于重复执行如下操作,知道判断条件(会不断变化)不再成立为止

for和while的区别

for循环中迭代的条件是遍历一个序列,这个序列是有限或者确定的。

while循环则是基于条件判断,而没有明确的迭代序列,所以while循环可以用来探索序列(先试着执行,有问题咱就退出),比如爬虫的时候你不知道网页page_index到哪结束;

for循环不会“重复”执行完全一样的操作,除非迭代的list对象是一样的,而while是可以重复执行相同操作的,这种特定在需要“重试”的场景中会经常用到。e.g.网页返回失败的时候可以重试几次,登陆失败的时候可以重试几次。

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

输出: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]

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))

输出: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 = 1

while(i<5):

print(i)

break # 执行一次就结束

print("不会出现")

输出:1

i = 1

while(i<5):

print(i)

i += 1

if i == 2:

continue

print("不会出现")

输出: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 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