闭包
闭包的定义:内部函数对外部函数作⽤域⾥变量的引⽤(⾮全局变量) , 则称内部函数为
闭包
闭包的作用:1.闭包具有提⾼代码可复⽤性 2.当我们需要更多的参数传递, 减少代码的可移植性时,我们就创建一个闭包.
闭包的使用:我们需要构建一个嵌套函数,把外部函数的变量拿来给内部函数用,常用的方法有:1.使用 nonlocal
2.将内部函数名用外部变量接受,再来调用,就可以访问内部函数
# 使用nonlocal def funX(): x = 5 def funY(): nonlocal x x *= x return x return funY funX()() # 为什么使用闭包的例子 def line_conf(a, b): def line(x): return a*x + b return line line1 = line_conf(1, 1) line2 = line_conf(4, 5) print(line1(5)) print(line2(5))
生成器
生成器的定义:
普通函数里面添加yield关键字,就成为了生成器,并具有了迭代器的特性。
参数 :yield 作用,1.生成器的标志 2.将yield后面的值返回
生成器的作用:
- 节约内存
- 迭代到下⼀次的调⽤时, 所使⽤的参数都是第⼀次所保留下的, 即是
说, 在整个所有函数调⽤的参数都是第⼀次所调⽤时保留的, ⽽不是新
创建的生成器的使用:
def fib(max): n =0 a,b=0,1 while n <max: print(b) #显示此时的b a,b = b, a+b n +=1 return 'done' # 返回一个迭代值 # 改成生成器 def fib(max): n =0 a,b = 0,1 while n<max: yield b # 改成yield,既是返回值,又是生成器的标志 a,b = b, a+b n +=1 return 'done'
迭代器
迭代器的定义:
1.可进行迭代的对象,可用for循环进行遍历的都是可迭代对象
2.能够使用for循环进行迭代遍历的有:集合数据类型:如list、tuple、dict、set、str;generator,包括生成器和generator function.
迭代器的作用:
3.如果有很多值,列表就会占用太多的内存,而迭代器则占用更少内存。
4.迭代器从第一个元素开始访问,直到所有的元素被访问完结束,只能往前不会后退
迭代器的使用:
# 用类将斐波拉契数改写成迭代器 class Fibs(): def __init__(self,max): self.max = max self.a = 0 self.b = 1 def __iter__(self): return self def __next__(self): fib = self.a # 定义初始值 if fib > self.max: raise StopIteration self.a,self.b = self.b , self.a + self.b return fib if __name__ = '__main__': fib = fibs(5) print(list(fib)