一、第一类对象:

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

函数名的运用

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. (转)开源项目miaosha(上)

    石墨文档:https://shimo.im/docs/iTDoZs4CVfICgSfV/ (二期)19.开源秒杀项目miaosha解读(上) [课程19]几张图.xmind0.6MB [课程19]开源 ...

  2. .NET Standard vs. .NET Core

    What is the difference between .NET Core and .NET Standard Class Library project types? Answer1 When ...

  3. oracle 之 连接查询

    where 连接 select * from a,b //使用的是笛卡尔乘积  显示 a.count*b.count 条数 select * from a,b where a.id=b.id 其实只是 ...

  4. 题解——HDU 2089 不要62(数位DP)

    最近在学数位DP 应该是入门题吧 设\( dp[i][0/1] \)表示到第\( i \)位时,前一位是否是6的满足条件的数的个数 然后就是套路 注意\( limit \)的限制条件以及转移时候信息的 ...

  5. 通过sql语句修改表的结构

    1.修改表的列名 oracle: ALTER TABLE 表名 RENAME COLUMN 列名 TO 新列名sqlserver:exec sp_rename '[表名].[列名]','[表名].[新 ...

  6. eclipse创建maven web项目工程步骤示例

    参考链接:https://www.cnblogs.com/noteless/p/5213075.html 需求表均同springmvc案例 此处只是使用maven 注意,以下所有需要建立在你的ecli ...

  7. JavaScript运行机制详解

    JavaScript运行机制详解   var test = function(){ alert("test"); } var test2 = function(){ alert(& ...

  8. WebGIS前端地图显示之根据地理范围换算出瓦片行列号的原理(核心)

    文章版权由作者李晓晖和博客园共有,若转载请于明显处标明出处:http://www.cnblogs.com/naaoveGIS/. 1.前言 在上一节中我们知道了屏幕上一像素等于实际中多少单位长度(米或 ...

  9. React native 之设置IOS的图标,名称和启动图(下篇文章会讲到RN的android的相关设置)

    1.首先,app的名称: 如图所示:我的工程名叫BOOk 在BOOk下面的info.plist的文件里设置app的相关信息:比如Bundle name就是设置APP的名称 2.App的图标:(这里注意 ...

  10. 跳跳虎回家(国庆10.1模拟赛T2)

    题目: [题目描述] 跳跳虎在外面出去玩忘了时间,现在他需要在最短的时间内赶回家. 跳跳虎所在的世界可以抽象成一个含有 n 个点的图(点编号从 1 到 n ),跳跳虎现在在 1 号点,跳跳虎的家在 n ...