python 闭包和迭代器

主要内容:

  • 1. 函数名的使用以及第⼀类对象
  • 2. 闭包
  • 3. 迭代器

1. 函数名的使用以及第⼀类对象

  函数名是一个变量,但它是一个特殊的变量,与括号配合可以执行函数的变量。

(1) 函数名的内存地址

def func(): print("呵呵") print(func) #

(2)函数名可以赋值给其他变量

def func(): print("呵呵") print(func) a = func # 把函数当成⼀个变量赋值给另⼀个变量 a() # 函数调⽤用 func() #呵呵

(3)函数名可以当做容器类的元素

def func1():
    print("呵呵")
def func2():
    print("呵呵")
def func3():
    print("呵呵")
def func4():
    print("呵呵")
lst = [func1,func2,func3]
for i in lst:
    i()

(4)函数名可以当做函数的参数

def func():
    print("吃了了么")
def func2(fn):
    print("我是func2")
    fn()    # 执行传递过来的fn
    print("我是func2")
func2(func)     # 把函数func当成参数传递给func2的参数fn.

(5)函数名可以作为函数的返回值

def func_1():
    print("这里是函数1")
    def func_2():
            print("这里是函数2")
    print("这里是函数1")
    return func_2
fn = func_1()   # 执⾏函数1.  函数1返回的是函数2,这时fn指向的就是上面函数2
fn()    # 执⾏上面返回的函数

(6) 一个设计模式

def panpan():
    print("我是潘潘. 我喜欢毒丈夫 ")
def xiaoping():
    print("我是小萍萍. 我喜欢毒丈夫 ")
def daguanren():
    print("大官人喜欢xxxx")
def wangpo(nv,nan): # 核心业务逻辑
    nv()
    nan()
wangpo(xiaohua,daguanren)             # 王婆代理了大官人和潘潘

(7)函数名既然是变量,变量名是任意的,在多次的赋值和调用过程中后续可能不知道初始的变量名,可以通过.__name__ 来得到初始的变量名

def chi(): print("我是吃") a = chi haha = a hehe = haha bilibili= hehe bilibili() print(bilibili.__name__) # 函数名

(8)函数的注释

def play(wanjv1,wanjv2,wanjv3): ''' 这是一个关于玩儿的函数 :param wanjv1: 玩具1 :param wanjv2: 玩具2 :param wanjv3: 玩具3 :return: 开心 ''' print("我要玩儿荡秋千") return "开心" # play("独木桥","独轮车","独眼龙") print(play.__doc__) # document 以文档的形式查看注释 print(str.join.__doc__) #查看join里面是什么东西 #结果: # 这是一个关于玩儿的函数 # :param # wanjv1: 玩具1 # :param # wanjv2: 玩具2 # :param # wanjv3: 玩具3 # :return: 开心 # # S.join(iterable) -> str

Return a string which is the concatenation of the strings in the iterable.The separator between elements is S.

2. 闭包

  闭包就是内层函数,对外层函数(非全局)的变量的引用. 叫闭包

def func1(): name = "alex" def func2(): print(name) # 闭包 func2() func1() # alex

我们可以使用__closure__来检测函数是否是闭包. 使用函数名.__closure__返回cell就是闭包,返回None就不是闭包

def func1(): name = "alex" def func2(): print(name) # 闭包 func2() print(func2.__closure__) #(,) func1() # alex

在函数外边调用内部函数

def outer(): name = "alex" # 内部函数 def inner(): print(name) return inner fn = outer() # 访问外部函数,获取到内部函数的函数地址 fn() # 访问内部函数

如果多层嵌套,只需要一层一层的往外层返回

def func1(): def func2(): def func3(): print("嘿嘿") return func3 return func2 func1()()()

闭包的好处: 

  • 当在外界访问内部函数时,那这个时候内部函数访问的时间和时机就不⼀定了,因为在外部,可以选择在任意的时间去访问内部函数.
  • 如果⼀个函数执行完毕,则这个函数中的变量以及局部命名空间中的内容都将会被销毁. 在闭包中如果变量被销毁了,那内部函数将不能正常执行.
  • python规定:如果你在内部函数中访问了外层函数中的变量,那么这个变量将不会消亡. 将会常驻在内存中,这样闭包可以保证外层函数中的变量在内存中常驻.

3. 迭代器

 str,list,tuple,dict,set. 那为什么我们可以称他们为可迭代对象呢,因为他们都遵循了可迭代协议.

# 对的 s = "abc" for c in s: print(c)

错的

for i in 123:
print(i)结果:

Traceback (most recent call last): File "E:/Python_workspace/day 011/011整理.py",line 111,in   for i in 123:TypeError: 'int' object is not iterable

 'int' object is not iterable' 即如果整数类型对象是不可迭代的,iterable表示可迭代的,表示可迭代协议,我们可以通过dir函数来查看类中定义好的

    所有包含了__iter__的东西都可以使用for循环. 都可以进行迭代

s = "我的哈哈哈" print(dir(s)) # 可以打印对象中的⽅方法和函数 print(dir(str)) # 也可以打印类中声明的⽅方法和函数
s = "alex" print(dir(s)) # 在字符串中发现了__iter__. 没有__next__ a = 123 print(dir(a)) # 在int中没有__iter__ 没有__next__ lst = [1,2,3,] print(dir(lst)) # 在list中也有__iter__

   (1)调用了__iter__(),访问__iter__()可以得到迭代器

lst = [1,4,5,6] it = lst.__iter__() # iterator 迭代器 while 1: try: print(it.__next__()) except StopIteration: print("结束了") break for el in lst: print(el) else: print("结束了")

(2) 迭代器给所有的数据类型提供了一种统一的遍历的方式(可迭代协议), Iterable,__iter__()

<div class="cnblogs_code">

lst = [1,5]
print("__iter__" in dir(lst))    #True
print("__next__" in dir(lst))    #False

<div class="cnblogs_code">

lst = [1,5]
it = lst.__iter__()
print("__iter__" in dir(it)) #  迭代器里面是有__iter__的.  迭代器一定是可迭代的     #True
print("__next__" in dir(it))                                                     #True
#
for el in it: # 迭代器可以使用for循环
    print(el)

 Iterable: 可迭代对象. 内部包含__iter__()函数       

 Iterator: 迭代器. 内部包含__iter__() 同时包含__next__(). 

<div class="cnblogs_code">

from collections import Iterable # 可迭代的
from collections import Iterator # 迭代器
#
lst = ["周润发","麻花藤","刘伟"]
print(isinstance(lst,Iterable)) # instance  实例,对象    #True
print(isinstance(lst,Iterator)) # instance  实例,对象    #False
#
it = lst.__iter__()
print(isinstance(it,对象      #True
print(isinstance(it,对象       #True

 迭代器的特点:             

  • 1. 节省内存.           
  • 2. 惰性机制           
  • 3. 不能反复,只能向下执行

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。

相关推荐


使用OpenCV实现视频去抖 整体步骤: 设置输入输出视频 寻找帧之间的移动:使用opencv的特征检测器,检测前一帧的特征,并使用Lucas-Kanade光流算法在下一帧跟踪这些特征,根据两组点,将前一个坐标系映射到当前坐标系完成刚性(欧几里得)变换,最后使用数组纪录帧之间的运动。 计算帧之间的平
前言 对中文标题使用余弦相似度算法和编辑距离相似度分析进行相似度分析。 准备数据集part1 本次使用的数据集来源于前几年的硕士学位论文,可根据实际需要更换。结构如下所示: 学位论文题名 基于卷积神经网络的人脸识别研究 P2P流媒体视频点播系统设计和研究 校园网安全体系的设计与实现 无线传感器网络中
前言 之前尝试写过一个爬虫,那时对网页请求还不够熟练,用的原理是:爬取整个html文件,然后根据标签页筛选有效信息。 现在看来这种方式无疑是吃力不讨好,因此现在重新写了一个爬取天气的程序。 准备工作 网上能轻松找到的是 101010100 北京这种编号,而查看中国气象局URL,他们使用的是北京545
前言 本文使用Python实现了PCA算法,并使用ORL人脸数据集进行了测试并输出特征脸,简单实现了人脸识别的功能。 1. 准备 ORL人脸数据集共包含40个不同人的400张图像,是在1992年4月至1994年4月期间由英国剑桥的Olivetti研究实验室创建。此数据集包含40个类,每个类含10张图
前言 使用opencv对图像进行操作,要求:(1)定位银行票据的四条边,然后旋正。(2)根据版面分析,分割出小写金额区域。 图像校正 首先是对图像的校正 读取图片 对图片二值化 进行边缘检测 对边缘的进行霍夫曼变换 将变换结果从极坐标空间投影到笛卡尔坐标得到倾斜角 根据倾斜角对主体校正 import
天气预报API 功能 从中国天气网抓取数据返回1-7天的天气数据,包括: 日期 天气 温度 风力 风向 def get_weather(city): 入参: 城市名,type为字符串,如西安、北京,因为数据引用中国气象网,因此只支持中国城市 返回: 1、列表,包括1-7的天气数据,每一天的分别为一个
数据来源:House Prices - Advanced Regression Techniques 参考文献: Comprehensive data exploration with Python 1. 导入数据 import pandas as pd import warnings warnin
同步和异步 同步和异步是指程序的执行方式。在同步执行中,程序会按顺序一个接一个地执行任务,直到当前任务完成。而在异步执行中,程序会在等待当前任务完成的同时,执行其他任务。 同步执行意味着程序会阻塞,等待任务完成,而异步执行则意味着程序不会阻塞,可以同时执行多个任务。 同步和异步的选择取决于你的程序需
实现代码 import time import pydirectinput import keyboard if __name__ == &#39;__main__&#39;: revolve = False while True: time.sleep(0.1) if keyboard.is_pr
本文从多个角度分析了vi编辑器保存退出命令。我们介绍了保存和退出vi编辑器的命令,以及如何撤销更改、移动光标、查找和替换文本等实用命令。希望这些技巧能帮助你更好地使用vi编辑器。
Python中的回车和换行是计算机中文本处理中的两个重要概念,它们在代码编写中扮演着非常重要的角色。本文从多个角度分析了Python中的回车和换行,包括回车和换行的概念、使用方法、使用场景和注意事项。通过本文的介绍,读者可以更好地理解和掌握Python中的回车和换行,从而编写出更加高效和规范的Python代码。
SQL Server启动不了错误1067是一种比较常见的故障,主要原因是数据库服务启动失败、权限不足和数据库文件损坏等。要解决这个问题,我们需要检查服务日志、重启服务器、检查文件权限和恢复数据库文件等。在日常的数据库运维工作中,我们应该时刻关注数据库的运行状况,及时发现并解决问题,以确保数据库的正常运行。
信息模块是一种可重复使用的、可编程的、可扩展的、可维护的、可测试的、可重构的软件组件。信息模块的端接需要从接口设计、数据格式、消息传递、函数调用等方面进行考虑。信息模块的端接需要满足高内聚、低耦合的原则,以保证系统的可扩展性和可维护性。
本文从电脑配置、PyCharm版本、Java版本、配置文件以及程序冲突等多个角度分析了Win10启动不了PyCharm的可能原因,并提供了解决方法。
本文主要从多个角度分析了安装SQL Server 2012时可能出现的错误,并提供了解决方法。
Pycharm是一款非常优秀的Python集成开发环境,它可以让Python开发者更加高效地进行代码编写、调试和测试。在Pycharm中设置解释器非常简单,我们可以通过创建新项目、修改项目解释器、设置全局解释器等多种方式进行设置。
Python中有多种方法可以将字符串转换为整数,包括使用int()函数、try-except语句、正则表达式、map()函数、ord()函数和reduce()函数。在实际应用中,应根据具体情况选择最合适的方法。
本文介绍了导入CSV文件的多种方法,包括使用Excel、Python和R等工具。同时,还介绍了导入CSV文件时需要注意的一些细节和问题。CSV文件是数据处理和分析中不可或缺的一部分,希望本文能够对读者有所帮助。
mongodb是一种新型的数据库,它采用了面向文档的数据模型,具有灵活性、高性能和高可用性等优势。但是,mongodb也存在数据结构混乱、安全性和学习成本高等问题。
当Python运行不了时,我们应该从代码、Python环境、操作系统和硬件设备等多个角度来排查问题,并采取相应的解决措施。