闭包函数
1、什么是闭包函数
一个函数的返回值是另外一个函数,返回的函数调用父函数内部的其他变量,
如果返回的函数在外部被执行,就产生了闭包
2、闭包函数的意义及作用
作用:使函数外部能够调用函数内部定义的变量
3、闭包函数优缺点:
优点:内部函数和局部变量都可以在外部使用
缺点:闭包操作导致整个函数的内部环境,被长久保存,占用大量的内存
装饰器实质就是一个闭包函数
"""闭包函数表示形式1 内部函数的局部变量可以在外部访问"""
name1="python2"
def fun1():
name2='python3'
def inner():
print(name2)
return inner
print(name1)
result=fun1()
print(type(result))
# 执行返回函数
result()
"""闭包函数表示形式2 内部函数可以通过外部访问"""
def fun2():
name2='python3'
def inner():
print("执行内置函数inner")
def all():
return inner
return all
result=fun2()
fuc=result()
print("内部函数可以通过外部访问",type(fuc))
fuc()
生成器
一、什么是生成器
函数中包含yield,这样的函数叫做生成器
普通函数和包含yield函数(生成器)的区别:
生成器返回迭代器的函数,生成器就是迭代器
执行规则:
生成器运行时,每次遇到yield时函数会暂停并保存当前所有运行信息,
返回yeild值,并在下一次迭代(next())的时候从当前位置继续执行
# 如果普通函数里面使用了yield关键字就变成了生成器
# 生成器的定义和使用
def func():
print(1)
print(2)
yield "卡点1"
print(3)
yield "卡点2"
print(4)
print(1)
yield "卡点3"
print(1)
print(1)
yield "卡点4"
# 生成器当中可以有一个或者多个yield关键字
# yield关键字的功能:
# 可以返回一个值(跟return关键字一样)
# 当函数执行完毕之后,下次再进行调用会从yield后面开始继续执行代码
# 生成器的执行方式和普通函数不一样
i = func() # i代表的是一个生成器对象
# 通过使用next()内建函数进行执行生成器
print("第1次执行")
print(next(i))
print("第2次执行")
print(next(i))
print("第3次执行")
print(next(i))
print("第4次执行")
print(next(i))
```python
def func(n):
a = 1
while a < n:
yield a
a += 1
f = func(10)
for i in f:
print(i)
try:
while True:
print(next(f))
except StopIteration:
pass
import sys
def fibonacci(n):
"""生成器"""
a=0
b=1
counter =0
while True:
if (counter > n):
return
yield a
a,b=b,a+b #a=0 b=1
a=b
b=a+b
# temp=a
# a=b
# b=temp+b
counter += 1
f = fibonacci(10) #f是迭代器对象
# 第一遇到yeild a=0 返回a的值
while True:
try:
print(next(f), end=" ")
#第一遍历执行 next(f) 返回值 a=0 a=1 a=1 a=2 a=3 a=5 a=8
except StopIteration:
sys.exit()
迭代器
二、什么是迭代器?
迭代器访问结合元素的一种方式,迭代器只能往前不能往后退
字符串、列表、元组都是可以创造成迭代器
[1,2,3,4,5]
迭代器有两个基本的方法:iter() next()
list1=[1,2,3,4,5]
try:
it=iter(list1) #创建迭代对象
print(next(it)) #1
print(next(it)) #2
print(next(it))
print(next(it))
print(next(it))
print(next(it))
print(next(it))
print(next(it))
except StopIteration:
print("已经遍历完成")