一、迭代器
它是一个带状态的对象,他能在你调用next()
方法的时候返回容器中的下一个值,任何实现了__iter__
和__next__()
方法的对象都是迭代器,__iter__
返回迭代器自身,__next__
返回容器中的下一个值,如果容器中没有更多元素了,则抛出StopIteration异常,至于它们到底是如何实现的这并不重要。
迭代器是访问集合内元素的一种方式。迭代器对象从集合的第一个元素开始访问,直到所有的元素都被访问一遍后结束。
(1)迭代器的四大特性
1.跌代集合,字符串,有序依次---------即有可迭代对象
2.线程不安全的,多线程访问同一个集合修改报错。
3.对于无法随机访问的数据结构,迭代器是唯一选择
4.只迭代当前元素,迭代前后均可不存
(2)迭代器的使用
lst = range(2)
it = iter(lst)
print( it)
输出:<listiterator object at 0x00BB62F0>
print(it.next()) #输出:0
print(next(it)) #输出:1
(3) python中in后面自动就会生成迭代器对象
for idx, ele in enumerate(lst):
print idx, ele
二、生成器
生成器其实是一种特殊的迭代器,不过这种迭代器更加优雅。它不需要再像上面的类一样写__iter__()
和__next__()
方法了,只需要一个yiled
关键字。 生成器一定是迭代器(反之不成立),因此任何生成器也是以一种懒加载的模式生成值。
特性:
1.推导 +(x+1 for x in lst) =生成器表达式,返回迭代器,外部括号用于参数时可省略
2.或者yield :生成 且 只生成一次,且停止到此
(1)生成器的基本代码
def get_0_1_2():
yield 0
yield 1
yield 2
print( get_0_1_2)
输出:<function get_0_1_2 at 0x00B2CB70>
(2)调用生成器函数将返回一个生成器:
generator = get_0_1_2()
print( generato)
输出:<generator object get_0_1_2 at 0x00B1C7D8>
print(generator.next()) 输出:0
print(generator.next()) 输出:1
print(generator.next()) 输出:2
三、闭包
定义:闭包是由函数及其相关的引用环境组合而成的实体(即:闭包=函数+引用环境)
闭包从表现形式上解释为:如果在一个内部函数里,对在外部作用域(但不是在全局作用域)的变量进行引用,那么内部函数就被认为是闭包。
#含有内部函数--闭包
def FunX(x): print("开始") def FunY(y): print("计算") return x*y return FunYa=FunX(3)#返回的时内部函数FunYb=a(5)print(b)
输出:15
FunY在FunX函数的代码块中定义。我们称FunY是FunX的内部函数。
在FunY的局部作用域中可以直接访问FunX局部作用域中定义的变量。
简单的说,这种内部函数可以使用外部函数变量的行为,就叫闭包。
四、装饰器
Python将一切视为 objec t的子类,即一切都是对象,因此函数可以像变量一样被指向和传递。
def diguo(): print("地锅50") return 50def doupi(fn): def jia(): print("豆皮10") return fn()+10 return jiadef xiang(fnn): def jia(): print("香菜") return fnn()+5 return jiaaa=doupi(xiang(diguo))print(aa())
下一篇博客将详细讲解闭包和装饰器。
原文地址:https://www.cnblogs.com/qianshuixianyu/p/9153068.html