python生成器,yield和return的区别

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

  • 1
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值