python中的闭包,迭代器,生成器

闭包

内层函数对外层函数变量的引用,并返回.(变量非全局变量).
鉴定是否闭包:print(内层函数名.__closure__)
返回一个类似地址是闭包,返回None非闭包

闭包的作用

当程序执行时,遇到函数执行会在内存中开辟一个局部名称空间,如果此函数内部形成闭包,就不会随着函数结束而消失.

迭代器

可迭代对象:
对象内部含有__iter__方法是可迭代对象 ,满足可迭代协议. (str,list,dict,tuple,set,range()…)

可迭代对象判断方法:
方法一:

s1='strs'
print('__iter__'in dir(s1))#s1中有没有__iter__方法

方法二:

from collections import Iterable
print(isinstance('abc',Iterable))#True

迭代器

对象内部中含有__iter____next__方法的,就是迭代器.

迭代器判断方法:

 f=open('register',encoding='utf-8')
 print('__iter__'in dir(f)) #True
  print('__next__'in dir(f)) #True 

可迭代对象不能进行取值,可转化为迭代器,迭代器可取值

lis=[1,2,3]#可迭代对象
#两种方法:
ite=lis.__iter__()#转化为迭代器
ite=iter(lis)#转化为迭代器
print(ite.__next__())#取值

1. 可迭代对象不一定是迭代器,迭代器一定是可迭代对象
2. 迭代器非常节省内存
3. 迭代器单向取值,且只取一个值

生成器

一边循环一边计算的机制,称为生成器:generator。
生成器仅仅保存了一套生成数值的算法,并且没有让这个算法现在就开始执行,而是什么时候调它,它什么时候开始计算一个新的值,并给你返回。
生成器的本质就是迭代器.

理解的关键在于:下次迭代时,代码从yield的下一条语句开始执行

为什么要有生成器

列表所有数据都在内存中,如果有海量数据的话将会非常耗内存。
如:仅仅需要访问前面几个元素,那后面绝大多数元素占用的空间都白白浪费了。
如果列表元素按照某种算法推算出来,那我们就可以在循环的过程中不断推算出后续的元素,这样就不必创建完整的list,从而节省大量的空间。
简单一句话:想得到庞大的数据,又想让它占用空间少,那就用生成器

创建生成器

方法一:
把一个列表生成式的[ ]改成( ),就创建了一个generator:

>>> L = [x * x for x in range(10)]
>>> L
[0, 1, 4, 9, 16, 25, 36, 49, 64, 81]
>>> g = (x * x for x in range(10))
>>> g
<generator object <genexpr> at 0x1022ef630>

方法二, 如果一个函数中包含yield关键字,那么这个函数就不再是一个普通函数,而是一个generator。调用函数就是创建了一个生成器(generator)对象。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
Python,"三器一闭"指的是迭代器生成器、装饰器和闭包这四个概念。它们都是Python非常重要且强大的编程概念。 1. 迭代器(Iterator):迭代器是一个对象,它实现了迭代器协议,即包含`__iter__()`和`__next__()`方法。通过调用`__next__()`方法,迭代器可以逐个返回元素,直到没有元素可返回时抛出`StopIteration`异常。迭代器可以用于遍历可迭代对象,如列表、元组、字典等。 2. 生成器(Generator):生成器是一种特殊的迭代器,它使用函数来创建。生成器函数使用`yield`关键字来暂停函数的执行,并返回一个值。每次调用生成器的`__next__()`方法时,函数会从上次暂停的位置继续执行,直到再次遇到`yield`关键字。生成器可以节省内存,并且可以按需生成数据。 3. 装饰器(Decorator):装饰器是一种用于修改函数或类的行为的函数。它可以在不修改原始函数或类的情况下,通过将其传递给装饰器函数来添加额外的功能。装饰器使用`@`语法来应用于函数或类定义之前。 4. 闭包(Closure):闭包是指一个函数对象,它可以访问并修改其词法作用域之外的变量。闭包在函数内部定义了一个内部函数,并返回该内部函数。内部函数可以访问外部函数的变量,即使外部函数已经执行完毕。闭包可以用于实现函数工厂、实现私有变量和缓存结果等功能。 以下是一个简单的示例,演示了迭代器生成器、装饰器和闭包的使用: ```python # 迭代器 class MyIterator: def __init__(self, data): self.data = data self.index = 0 def __iter__(self): return self def __next__(self): if self.index >= len(self.data): raise StopIteration value = self.data[self.index] self.index += 1 return value # 生成器 def my_generator(): yield 1 yield 2 yield 3 # 装饰器 def my_decorator(func): def wrapper(): print("Before function execution") func() print("After function execution") return wrapper @my_decorator def my_function(): print("Inside function") # 闭包 def outer_function(x): def inner_function(y): return x + y return inner_function # 使用迭代器 my_list = [1, 2, 3] my_iterator = MyIterator(my_list) for item in my_iterator: print(item) # 使用生成器 my_generator = my_generator() for item in my_generator: print(item) # 使用装饰器 my_function() # 使用闭包 add_5 = outer_function(5) print(add_5(3)) ```
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值