一、第一类对象:

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

函数名的运用

1、单独打印是一个内存地址

2、可以给其他变量赋值

3、可以作为容器类变量的元素

4、可以作为函数的参数

5、可以作为函数的返回值

二、闭包

如果一个内层函数有对外层函数变量的引用,那么就称为这个内层函数为闭包函数,也叫闭包

那么,如何检查一个函数是不是闭包函数呢?

  用__closure__()方法可以检查函数是否是闭包函数,返回值不为None就是闭包函数。

def func():
name = "alex"
def func2():
print(name)
func2()
print(func2.__closure__) #(<cell at 0x00000000027375B8: str object at 0x00000000027B81B8>,)
func()
print(func.__closure__) #None

闭包的作用

  1、保护变量不受侵害。闭包函数引用的是局部变量,因此变量不容易被修改

  2、可以让一个变量常驻内存。因为内层函数执行的时机是不确定的,为了inner函数能正常执行,必须保证变量存在。

如何访问内部函数?

  访问内部函数,可以先调用外部函数,获取内部函数地址,再调用内部函数即可。多层嵌套就一层一层的返回

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

两个方法:

__doc__() 查看函数的文档注释

__name__() 查看函数名

三、迭代器

迭代器就是个可以使用__next__函数一个一个往外拿值的容器。比如 a是一个迭代器,那么a.__next__()就表示从a中拿出了一个值。

dir()  能够查看数据类型能够执行的操作,即该数据类型支持的内部方法

print(dir(list))

#结果
['__add__', '__class__', '__contains__', '__delattr__', '__delitem__', '__dir__', '__doc__', '__eq__', '__format__', '__ge__', '__getattribute__', '__getitem__', '__gt__',
'__hash__', '__iadd__', '__imul__', '__init__', '__init_subclass__', '__iter__', '__le__',
'__len__', '__lt__', '__mul__', '__ne__', '__new__', '__reduce__', '__reduce_ex__', '__repr__', '__reversed__', '__rmul__', '__setattr__', '__setitem__', '__sizeof__', '__str__', '__subclasshook__', 'append', 'clear', 'copy', 'count', 'extend', 'index', 'insert', 'pop', 'remove', 'reverse', 'sort']

通过对list、set、tuple、str等数据类型查看,我们都能发现一个__inter__函数,这是可迭代对象的共性。其实__inter__函数相当于是一个可迭代协议,只要有这个函数,就表示它是可迭代的。__inter__函数的作用是获取对象的迭代器。

因此

一个对象有__inter__函数,表示可迭代的(iterable)

有__iter__, __next__函数,表示是迭代器(iterator),迭代器都是可迭代的

如何判断一个对象是否是可迭代对象?

1、dir(x)      查看是否具有__iter__函数

2、“__iter__”  in  dir(x)    判断是否可迭代 返回值是True 或False

  "__next__" in  dir(x)      判断是否是迭代器 返回值是True 或False

3、专业方法

from  collections  import  Iterable,Iterator

isinstance(x ,Iterable)   表示 x是否是Iterable

isinstance(x,Iterator)    表示x 是否是Iterator

迭代器的三个特点:

1、节省内存

2、惰性机制    必须通过__next__()才能拿值

3、只能往前,不能后退

使用while+迭代器模拟for循环:

lst = [1,2,3]

it = lst.__iter__()  #得到迭代器

while 1:
  try:
    el = it.__next__()
    for循环的循环体
  except StopIteration:
    break

lst = [1,2,3]
it = lst.__iter__() while 1:
try:
el = it.__next__()
print(el)
except StopIteration:
break #等价于
for el in lst:
print(el)

python记录_day11 闭包 迭代器的更多相关文章

  1. python 第一类对象 闭包 迭代器

    ########################总结########################### 1. 函数名 -> 第一类对象 函数名就是变量名. 函数可以赋值 函数可以作为集合类的 ...

  2. python第一类对象,闭包,迭代器

    一.第一类对象 第一类对象 -> 函数名 -> 变量名 1.特征:     函数对象可以像变量一样进行赋值     还可以作为列表的元素进行使用     还可以作为返回值返回     还可 ...

  3. Python记录12:迭代器+生成器+生成式

    '''1. 什么是迭代器 什么是迭代:迭代就是一个重复的过程,但是每一次重复都是基于上一次的结果而进行的 单纯的重复不是迭代: while True: print(1) 迭代的过程 l=['a','b ...

  4. python中“生成器”、“迭代器”、“闭包”、“装饰器”的深入理解

    一.生成器 1.什么是生成器? 在python中,一边循环一边计算的机制,称为生成器:generator. 2.生成器有什么优点? 1.节约内存.python在使用生成器时对延迟操作提供了支持.所谓延 ...

  5. python中“生成器”、“迭代器”、“闭包”、“装饰器”的深入理解

    python中"生成器"."迭代器"."闭包"."装饰器"的深入理解 一.生成器 1.生成器定义:在python中,一边 ...

  6. python语法生成器、迭代器、闭包、装饰器总结

    1.生成器 生成器的创建方法: (1)通过列表生成式创建 可以通过将列表生成式的[]改成() eg: # 列表生成式 L = [ x*2 for x in range(5)] # L = [0, 2, ...

  7. python高级之生成器&迭代器

    python高级之生成器&迭代器 本机内容 概念梳理 容器 可迭代对象 迭代器 for循环内部实现 生成器 1.概念梳理 容器(container):多个元素组织在一起的数据结构 可迭代对象( ...

  8. Python核心编程-闭包

    百度搜了一下闭包的概念:简而言之,闭包的作用就是在外部函数执行完并返回后,闭包使得收机制不会收回函数所占用的资源,因为内部函数的执行需要依赖外函数中的变量.这是对闭包作用的非常直白的描述,不专业也不严 ...

  9. 第三篇:python高级之生成器&迭代器

    python高级之生成器&迭代器   python高级之生成器&迭代器 本机内容 概念梳理 容器 可迭代对象 迭代器 for循环内部实现 生成器 1.概念梳理 容器(container ...

随机推荐

  1. Java日期时间(Date/Time)

    获取当前日期和时间 在Java中容易得到当前的日期和时间.可以使用一个简单的Date对象的toString()方法,如下所示打印当前日期和时间: import java.util.Date; publ ...

  2. Latex 左右引号

    参考: LaTeX技巧218:LaTeX如何正确输入引号:双引号""单引号'' Latex 左右引号 在latex中加引号时,使用""的输出为两个同向的引号: ...

  3. phpstorm软件配置端口问题

    phpstorm默认的端口号是:63342 但是我装的apache服务器的默认端口是80 网上查找资料,都说可以加listen的端口,比如这里   #Listen 12.34.56.78:80 Lis ...

  4. 【Python】【电子邮箱】

    #[[电子邮件]]'''Email的历史比Web还要久远,直到现在,Email也是互联网上应用非常广泛的服务. 几乎所有的编程语言都支持发送和接收电子邮件,但是,先等等,在我们开始编写代码之前,有必要 ...

  5. JavaScript重点知识(二)

    三.JS的API 3.1知识点(DOM) 1)DOM本质 将html结构化成浏览器和JS可识别可操作的东西 2)变量计算---强制类型转换 获取DOM节点 Attribute(对html标签属性的修改 ...

  6. 【BZOJ】1832: [AHOI2008]聚会

    题目链接:http://www.lydsy.com/JudgeOnline/problem.php?id=1832 省选出出了CF的感觉..... 显然一发贪心,如果两个点显然就是他们的$LCA$(不 ...

  7. nginx,uwsgi,部署django,静态文件不生效问题

    打开浏览器,然后访问服务器,如果能够正常访问,并且页面链接可以跳转,但是页面却是乱的,那一定是nginx.conf里面的静态文件配置不正确, location /static/ {#expires 3 ...

  8. 设计模式(二)策略模式(Strategy)

    1.分析项目中变化部分与不变部分 2.多用组合,少用继承:用行为类组合,而不是行为的继承 案例: 第一步,把行为抽象为接口 package top.littlepage.designPattern.S ...

  9. Qt5_选择文件对话框

    1. 类似如下代码: QString fileName = QFileDialog::getOpenFileName( this, tr("Open File"), NULL,// ...

  10. 基于虹软sdk,java实现人脸识别(demo)

    ## 开发环境准备:###开发使用到的软件和工具:* Jdk8.mysql5.7.libarcsoft_face.dll(so).libarcsoft_face_engine.dll(so).liba ...