首页 > 其他分享 >10.一闭三器

10.一闭三器

时间:2022-10-26 19:14:33浏览次数:56  
标签:10 函数 迭代 一闭 三器 func print next def

一闭三器

  • 闭包
  • 装饰器
  • 迭代器
  • 生成器

闭包

闭包的详细介绍
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

相关文章

  • 10-6-华为云OBS大数据存算分离方案,助力企业顺利实现数字化转型!
    华为云OBS大数据存算分离方案,助力企业顺利实现数字化转型!随着大数据技术的飞速发展,人们对数据价值的认识逐渐加深,进而对大数据产生了前所未有的重视。当下,大数据更是凭借......
  • MILIANKE-CZ01-7010/7020400-核心模块硬件手册(ZYNQ)
    1产品概述    自2017年MLK-CZ01-7010/7020-400(MZ7XCORE400)系列开发平台发布以来,该系列开发平台和核心模块经过多次迭代升级,在工业自动化、水利电力控制设备、医疗图......
  • 13 刘欣晨 2022.10.20 第七章实例+实战
    实验 一 项目名称:     创建大雁类并定义飞行方法classGeese:'''大雁类'''def__init__(self,beak,wing,claw):print("我是大......
  • 2022-10-26 "getLocation:fail the api need to be declared in the requiredPrivateI
    前言:uniapp之微信小程序,使用wx.getLocation获取定位报错:"getLocation:failtheapineedtobedeclaredintherequiredPrivateInfosfieldinapp.json/ext.json"解释......
  • freeswitch-1.10.7 on centos7编译安装
      概述最近由于项目需求,老版本的fs已经不适用,特此升级了freeswitch的版本,使用当前最新的1.10.7版本编译安装。环境centos:CentOS release7.0(Final)或以上版本......
  • 2022.10.22第五次组会记录
    团队:集农广益小组地点:桃园食堂时间:晚上7点参与人:全体人员组会内容摘要:修改用例图,讨论需求分析文档的分工,分析讨论代码框架组会主要内容:1.对上一版本用例图稍作修......
  • 第五章10
    描述 两个正整数,计算这两个数的最小公倍数。输入  仅一行,包括两个不大于1000的正整数输出 仅一行,这两个数的最小公倍数 【样例输入】1014↙【样例输出......
  • Educational Codeforces Round 109 (Rated for Div. 2) D
    D.Armchairs我们发现性质这前面的0显然是给第一个1匹配而不会前面0的给第二个后面的给第一个显然不优有了这个性质我们就可以通过0来做文章要是这个位置是0我们显......
  • 22.10.26校内赛
     T1.F221026A.「阶段测试」方格求和题目描述一个NxN的方格中,每个格子有1个数字,你可以选择任意一点为中心,可以向上下左右四个方向行动,最多走K步,问可以到达的方......
  • spark springboot hbase(读取student、写入student)20221026
    1、pom.xml<dependency><groupId>org.apache.spark</groupId><artifactId>spark-core_2.11</artifactId>......