一、闭包
保证数据安全
全局变量可以随意修改,数据不安全
如果放到一个函数中,数据安全了,但是无法引用
def demo(): name = "张三" print(name) #报错
如何既可以引用函数里面的变量,又可以保证数据的安全性?这个时候就会用到闭包
(二)闭包的结构
内层函数对外层函数的局部变量的使用,内层函数被称为闭包函数
闭指的是:该函数的内部函数
包指的是:内部函数在外部被引用
(三)构成条件
- 函数嵌套
- 外部函数返回内部函数名
- 内部函数使用外部函数的变量
def external(): print("我是外部函数") def inside(): print("我是内部函数") return inside res = external() res() ------------------------ 我是外部函数 我是内部函数
(四)实现
外层函数内的变量被称为自由变量,这个自由变量和内层函数形成一种绑定关系,自由变量不会和全局变量产生冲突。
def external(): name = "外层函数" def inside(): print("我是内部函数") return name return inside res = external() r1 = res() print(r1) ------------------ 我是内部函数 外层函数
二、装饰器
装饰器是 Python 的一个重要部分。简单地说:他们是不改变函数功能的基础上,给函数增加一些功能。他们有助于让我们的代码更简短,也更有范儿。
(一)函数可以作为参数进行传递
def demo(): print("我是demo函数") def func(insert): insert() func(demo) ------------------------- 我是demo函数
- 装饰器的本质是一个闭包
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() ------------------------ 开启外挂 鲁班大师,智商250 关闭外挂 开启外挂 是兄弟,就来砍我 关闭外挂
(二)装饰器的参数
def zhushou(func): def inside(*args,**kwargs): print("开启外挂") func(*args,**kwargs) print("关闭外挂") return inside @ zhushou def play_cq(username,password): print("是兄弟,就来砍我") @ zhushou def play_wz(username,password,hero): print("鲁班大师,智商250") play_wz("admin","123456789","鲁班") # play_cq("admin","123456789") --------------------------------- 开启外挂 鲁班大师,智商250 关闭外挂
(三)返回值
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>
-
next():从迭代器中拿到数据
str1 = iter("你好呀") print(next(str1)) print(next(str1)) print(next(str1)) ----------------------- 你 好 呀
(二)while模拟for循环
li = [1,2,3,4,5,6] ls = li.__iter__() while True: try: data = ls.__next__() print(data) except StopIteration: break ---------------------- 1 2 3 4 5 6
四、生成器
生成器的本质就是迭代器
(一)创建生成器的方案
生成器函数中有一个关键字 yield
生成器函数执行的时候,并不会执行函数,得到的是生成器
def func(): print("123456") yield "大家好" res = func() print(res) ---------------------------- <generator object func at 0x0000017ACB60EC10>
只要函数中出现了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__()) --------------------------- ['香菇包1', '香菇包2', '香菇包3', '香菇包4', '香菇包5', '香菇包6', '香菇包7', '香菇包8', '香菇包9', '香菇包10']
标签:play,函数,迭代,一闭,三器,func,print,def From: https://www.cnblogs.com/LoLong/p/16758127.html