6.闭包+匿名函数+关键字yield -python入门到精通

闭包

前面我们学习了回调函数,就是把函数作为一个参数进行传递。回调函数比较常见。
闭包则是将函数作为返回值,闭包可以延长变量的作用时间和域。下面举个例子:

def say(word):
    def name(name):
        print(word, name)
    return name

hi = say('hello')  #赋值了word = 'hello',返回函数name
hi('jason')

在这里插入图片描述

匿名函数

python中声明匿名函数的关键字是lambda。所谓匿名函数是指调用一次或者几次后就不再需要的函数。属于“一次性”函数。下面举个例子。

fun = lambda x, y: x + y
print(fun(2,5))

在这里插入图片描述

关键字yield

yield可以将函数执行的中间结果返回但不结束程序。
下面举个例子吧。

def fun(n):
    i = 0
    while i < n:
        yield i
        i += 1
for i in fun(10):
    print(i)

在这里插入图片描述
通过yield将i的每一次结果进行了输出,这相当于把一个函数变为了生成器。
使用yield可以获得可以迭代(iterable)的效果。

想想这和将 yield i 这行代码替换为 print(i)有什么不同呢?

def fun(n):
    i = 0
    while i < n:
        print(i)
        i += 1
fun(10)

可以发现这样写代码,执行就会有打印输出,代码的复用性比较差。因为fun()函数没有返回值,其他函数没法获得这个数列。

如果将其保存为一个list又如何呢? append()是基于某个数组装载数据的操作。

def fun(n):
    L = []
    i = 0
    while i < n:
        L.append(i)
        i += 1
    return L
for i in fun(10):
    print(i)

同样可以看到问题,随着n的增大,函数运行会占用大量内存。最好的方式还是使用yield。

那么yield到底干了什么呢?
其实yield是把一个函数变成了生成器,具有yield的函数不再是一个普通函数。
直接运行fun(10)是不会执行fun函数的,而是返回一个可以迭代的对象。
因此执行for循环时,每次都会去运行fun函数的内部代码,执行到yield i 时fun函数则返回一个迭代值。

简而言之:通过循环函数和yield 可以构建一个生成器,现生成一些数据。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值