乐之之

知而行乐,乐而行之,天道酬勤,学无止境。
一闭三器

一、闭包

  保证数据安全

  全局变量可以随意修改,数据不安全

  如果放到一个函数中,数据安全了,但是无法引用

def demo():
    name = "张三"
print(name)   #报错

如何既可以引用函数里面的变量,又可以保证数据的安全性?这个时候就会用到闭包

(一)闭包的结构

  内层函数对外层函数的局部变量的使用,内层函数被称为闭包函数

  闭指的是:该函数的内部函数

  包指的是:内部函数在外部被引用

(二)构成条件

  1. 函数嵌套
  2. 外部函数返回内部函数名
  3. 内部函数使用外部函数的变量
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']

 

posted on 2022-10-06 23:38  乐之之  阅读(62)  评论(0编辑  收藏  举报