一闭三器
- 闭包
- 装饰器
- 迭代器
- 生成器
闭包
闭包的详细介绍
http://t.csdn.cn/UPARs
闭包 结构
内层函数对外层函数的局部变量的使用,内层函数被称为闭包函数
闭指的是:该函数的内部函数
包指的是:内部函数在外部被引用
构成条件
1、函数嵌套
2、外部函数返回内部函数名
3、内部函数使用外部函数的变量
def external():
print("我是外部函数")
def inside():
print("我是内部函数")
return inside
res = external()
res()
实现
外层函数内的变量被称为自由变量,这个自由变量和内层函数形成一种绑定关系,自由变量不会和全局变量产生冲突
# -*- coding:utf-8 -*-
def external():
name = "外层函数"
def inside():
print("我是内部函数")
return name
return inside
res = external()
r1 = res()
print(r1)
装饰器
装饰器本质是闭包
通过装饰器可以在不改变原函数的基础上,对原函数进行增强
1、函数可以作为参数进行传递
# -*- coding:utf-8 -*-
def demo():
print("我是demo函数")
def func(insert):
insert()
func(demo)
# -*- coding:utf-8 -*-
def zhushou(func):
def inside():
print("开启外挂")
func()
print("关闭外挂")
return inside
@ zhushou
def play_cq():
print("是兄弟,就来砍我")
@ zhushou
def play_wz():
print("鲁班大师,智商250")
play_wz()
play_cq()
装饰器的参数
def zhushou(func):
def inside(*args, **kwargs):
print("开启外挂")
func(*args, **kwargs)
print("关闭外挂")
return inside
@zhushou
def play_cq(username, password):
print(username)
print(password)
@zhushou
def play_wz(username, password, hero):
print(username)
print(password)
print(hero)
play_wz("admin", "123456789", "鲁班")
# play_cq("admin","123456789")
返回值
# -*- coding:utf-8 -*-
def zhushou(func):
def inside(*args,**kwargs):
print("开启外挂")
ret = func(*args,**kwargs)
print("关闭外挂")
return ret
return inside
@ zhushou
def play_cq(username,password):
print("是兄弟,就来砍我")
return "屠龙"
@ zhushou
def play_wz(username,password,hero):
print("鲁班大师,智商250")
# play_wz("admin","123456789","鲁班")
ret = play_cq("admin","123456789")
print(ret)
迭代器
迭代器是一种对象,该对象包含值的可计数数字。
迭代器是可迭代的对象,这意味着您可以遍历所有值。
从技术上讲,在 Python 中,迭代器是实现迭代器协议的对象,它包含方法 iter() 和 next()。
迭代器与可迭代对象
列表、元组、字典和集合都是可迭代的对象。它们是可迭代的容器,您可以从中获取迭代器(Iterator)。
所有这些对象都有用于获取迭代器的 iter() 方法:
str1 = iter("你好呀")
print(str1)
# <str_iterator object at 0x0000018D4EF0BFA0>
-------------------------------------------------------------
str1 = "你好呀".__iter__()
print(str1)
# <str_iterator object at 0x0000018D4EF0BFA0>
从迭代器中拿到数据
next()
str1 = iter("你好呀")
print(next(str1))
print(next(str1))
print(next(str1))
-------------------------------------------------------------
str1 = "你好呀".__iter__()
print(str1.__next__())
print(str1.__next__())
print(str1.__next__())
while 模拟for循环
li = [1,2,3,4,5,6]
ls = li.__iter__()
while True:
try:
data = ls.__next__()
print(data)
except StopIteration:
break
生成器
生成器的本质就是迭代器
创建生成器的方案
生成器函数中有一个关键字 yield
生成器函数执行的时候,并不会执行函数,得到的是生成器
def func():
print("123456")
yield "大家好"
res = func()
print(res)
# <generator object func at 0x0000017ACB60EC10>
只要函数中出现了yield,那他就是一个生成器函数
可以返回数据,返回数据跟在yield后
可以分段执行函数的内容,通过next,执行到下一个yield的位置
def func():
print("这是第一段")
yield "大家好"
print("这是第二段")
yield "散了吧"
res = func()
print(res.__next__())
print(res.__next__())
和 return 相比,yield 除了可以返回相应的值,还有一个更重要的功能,即每当程序执行完该语句时,程序就会暂停执行。不仅如此,即便调用生成器函数,Python 解释器也不会执行函数中的代码,它只会返回一个生成器(对象)
def func():
li = []
for i in range(1,101):
li.append(f"香菇包{i}")
yield li
list1 = func()
print(list1.__next__())
标签:10,函数,迭代,一闭,三器,func,print,next,def
From: https://www.cnblogs.com/blog4lyh/p/16829666.html