def chunker1(iterable, size):
# iterable 是遍历对象,size代表步长,即下一次遍历从size个元素之后遍历
for i in range(0, len(iterable), size):
# 遍历长度,使得第一次访问下标为0元素,第二次访问下标为0+size的元素
yield iterable[i:i + size]
# 对遍历对象进行切片 第一次切片为遍历对象的[0:size]部分元素,
# 第二次为遍历对象的[size:size+size]部分元素,依此类推
print("********return*********")
def hou(iterable):
for i in iterable:
print(i)
if i == 4:
return i
# 此处当函数return 了当前i的值之后函数就停止遍历了
# 可以把return当成def的舍利子,当舍利子出现的时候def已经死了
# 这个舍利子是他最后的返回值
hou((range(8)))
print("********yield*********")
# yield和return的区别:yiled是把这个函数变成一个生成器,可以理解为将这个函数变成了一个空袋子,每次yield都在往里面添加东西
# 当函数执行到我这时我把当前内容返回出去,然后在这一步暂停,等下次访问再继续续上
# 就好像游戏里的存档可以存起来下次玩再接着上次
# for chunk in chunker(range(25), 4):
# print(list(chunk)) 我把这个东西执行的顺序给你捋一遍
def chunker(iterable, size): # 外面的for 遍历开始访问第一个元素时函数开始
a = []
for i in iterable: # 内部for遍历(0,25)
a.append(i) # 当i=0时,仅执行这一句,直到将i = 3时,此时a = [0,1,2,3]
if len(a) == size: # 判断发现len(a) == 4,符合条件,执行if内语句
yield a # 抛出列表a为外面for遍历到的第一个元素,即[0,1,2,3],并暂停。
a.clear() # 外面的for遍历开始访问第二个元素,函数从此处继续执行.执行clear清空列表a,
# 接着内部for遍历i=4,5,6,7,i=7时a = [4, 5, 6, 7]
# 此时发现len(a)=4,执行if内语句
# 抛出列表a为外面for遍历到的第二个元素,即[4, 5, 6, 7],并暂停
# 外面的for遍历开始访问第三个元素,函数从此处继续执行.执行clear清空列表a,。。。。
# 当内部for遍历到最后一个元素时,只有24这一个元素故a = [24],不符合if条件,故内部for遍历结束
yield a # 接着到了这一步,抛出列表a为外面for遍历到的最后一个元素,即[24],并暂停。外部for再次访问但是后面没代码执行了故运行结束
print(type(chunker(range(25), 4)))
# 在这可以发现这个东西的类型是generator(生成器)而不是function(函数)
for chunk in chunker(range(25), 4):
print(list(chunk))
python生成器,yield和return的区别
最新推荐文章于 2022-04-15 11:02:26 发布