一闭三器

141 阅读2分钟

一闭三器

一闭

闭包

  • 作用

保证数据安全。

  • 结构

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

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

  • 构成条件

1、函数嵌套

2、外部函数返回内部函数名

3、内部函数使用外部函数的变量

def exeral():
    print("我是外部函数")

    def inside():
        print("我是内部函数")

    return inside


f = exeral()
f()

外层函数内的变量被称为自由变量,这个自由变量和内层函数形成一种绑定关系,自由变量不会和全局变量产生冲突

def demo1():
    name = "外层函数"

    def demo2():
        print("我是内层函数")
        return name

    return demo2


result = demo1()
f = result()
print(f)

三器

装饰器

装饰器是 Python 的一个重要部分。简单地说:他们是不改变函数功能的基础上,给函数增加一些功能。他们有助于让我们的代码更简短,也更有范儿。

装饰器的本质是一个闭包

例如:外挂
def waigua(fun):
    def inside():
        print("打开外挂")
        fun()
        print("关闭外挂")

    return inside


@waigua
def game1():
    print("打开王者荣耀")


@waigua
def game2():
    print("打开CSGO")


game1()
game2()

装饰器的参数传递:用“ *args ”和“ **kwargs "

例如:
def waigua2(fun):
    def inside(*args, **kwargs):
        print("打开外挂")
        re = fun(*args, **kwargs)
        print("关闭外挂")
        return re

    return inside


@waigua2
def game3(username, password):
    print("账号:{}".format(username))
    print("密码:{}".format(password))
    print("打开游戏")
    return "装备"


a = game3(123, "abc")
print(a)

迭代器

  • 迭代器是一种对象,该对象包含值的可计数数字。迭代器是可迭代的对象,这意味着您可以遍历所有值。
  • 从技术上讲,在 Python 中,迭代器是实现迭代器协议的对象,
  • 它包含方法 iter() 和 next()。
  • 列表、元组、字典和集合都是可迭代的对象
iter()方法:
var = "abcd"
list1 = [1, 2, 3, "a", "b"]
set1 = {1, 2, 3, "a", "b"}
var1 = iter(var)
list2 = iter(list1)
set2 = iter(set1)
print(var1)  # >>><str_iterator object at 0x000001AA888DBBB0>
print(list2)  # >>><list_iterator object at 0x000001DCB0F2BB80>
print(set2)  # >>><set_iterator object at 0x000001DCB0F58980>
next()方法:

从迭代器中获取数据。

print(next(var1))  # a
print(next(var1))  # b
print(next(var1))  # c
print(next(list2))  # 1
print(next(set2))  # 随机

生成器

  • 生成器的本质就是迭代器
  • 生成器函数中有一个关键字 yield
  • 生成器函数执行的时候,并不会执行函数,得到的是生成器
def func():
    print("123456")
    yield "大家好"


res = func()
print(res)  # >>><generator object func at 0x00000259CABE9FC0>

只要函数中出现了yield,那他就是一个生成器函数可以分段执行函数的内容,通过next,执行到下一个yield的位置

def func():
    print("这是第一段")
    yield "大家好"
    print("这是第二段")
    yield "散了吧"


res = func()
print(res.__next__())
print(res.__next__())

和 return 相比,yield 除了可以返回相应的值,还有一个更重要的功能,即每当程序执行完该语句时,程序就会暂停执行。不仅如此,即便调用生成器函数,Python 解释器也不会执行函数中的代码,它只会返回一个生成器(对象)