python学习8-闭包、迭代器(转载)
一、第一类对象:
函数名是一个变量,可以当普通变量使用,但它又是一个特殊的变量,与括号配合可以执行函数。
函数名的运用
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学习8-闭包、迭代器(转载)的更多相关文章
- Python学习---装饰器/迭代器/生成器的学习【all】
Python学习---装饰器的学习1210 Python学习---生成器的学习1210 Python学习---迭代器学习1210
- Python学习资源汇总,转载自他人
python3英文视频教程(全87集) http://pan.baidu.com/s/1dDnGBvV python从入门到精通视频(全60集)链接:http://pan.baidu.com/s/1e ...
- python学习笔记之迭代器和函数(第三天)
一.collection系列: 1.counter计数器 如果counter(dict)是对字典的一个补充,如果counter(list)则是对列表的补充,初步测试对字典的值进行排序. ####### ...
- python学习笔记(5)--迭代器,生成器,装饰器,常用模块,序列化
生成器 在Python中,一边循环一边计算的机制,称为生成器:generator. 如: >>> g = (x * x for xin range(10)) >>> ...
- python学习笔记四 迭代器,生成器,装饰器(基础篇)
迭代器 __iter__方法返回一个迭代器,它是具有__next__方法的对象.在调用__next__方法时,迭代器会返回它的下一个值,若__next__方法调用迭代器 没有值返回,就会引发一个Sto ...
- Python学习之路——迭代器、生成器、算法基础、正则
一.迭代器: 迭代器是访问集合元素的一种方式. 迭代器对象是从集合的第一个元素开始访问,直到所有的元素被访问完结束. 迭代器只能往前不会后退,不过这也没什么,因为人们很少在迭代途中往后退. 另外,迭代 ...
- Python学习笔记010_迭代器_生成器
迭代器 迭代就类似于循环,每次重复的过程被称为迭代的过程,每次迭代的结果将被用来作为下一次迭代的初始值,提供迭代方法的容器被称为迭代器. 常见的迭代器有 (列表.元祖.字典.字符串.文件 等),通常 ...
- Python学习(三):迭代器、生成器、装饰器、递归、算法、正则
1.迭代器 迭代器是访问集合的一种方式,迭代对象从集合的第一个元素开始访问,直到元素被访问结束,迭代器只能往前不能后退,最大的优点是不要求事先准备好整个迭代过程中的元素,这个特点使得它特别适合用于遍历 ...
- python学习之闭包
闭包:是由函数及其相关应用环境组合而成的实体(函数+引用环境) 在嵌套函数中中,如果一个内部函数对外部函数(非全局作用域)中的变量进行引用,内部函数被认为是闭包 闭包中不能修改外部环境的变量中的值 d ...
- python 第一类对象 闭包 迭代器
########################总结########################### 1. 函数名 -> 第一类对象 函数名就是变量名. 函数可以赋值 函数可以作为集合类的 ...
随机推荐
- js实现选项卡切换
<!DOCTYPE html><html><head lang="en"> <meta charset="UTF-8" ...
- oracle数据库查询全系整理
oracle数据库方面的知识到今天已经整理了12篇.当然,这不是终点,这只是一个开始,希望我写的文章可以帮助更多初学数据库的童鞋快速上手,如果你觉得文章对你有帮助,那么恭喜你已经入门了,数据库里面的知 ...
- Python基础入门-os模块
今天我们来介绍一下os模块中常用的一些方法,当然python中的os模块中提供的使用方法有很多,但是这里面小编会列举出来一些和实际工作中应用的相关的方法,而且会有一些实际的例子方便大家对os模块理解. ...
- WinForm中的焦点
窗口打开后默认的焦点在TabIndex为0的元素上,即使代码中在其他元素上设置了Focus(),也没用,所以初始状态最好通过TabIndex来控制. WebForm中点其他如空白地方,之前的控件就会失 ...
- Cocos Creator 入门
Cocos Createor 资源 略 场景 节点树 节点与组件 坐标系 脚本 组件声明,生命周期回调 var Component = cc.Class({ // 用于序列化,可省略 name: 's ...
- java大数据批量处理实现方式
1. 各批量方式对比 Mybatis与JDBC批量插入MySQL数据库性能测试及解决方案 2. 原理解析 1)MySql PreparedStatement executeBatch过慢问题 3. 工 ...
- 关于函数传参的其他问题(const形参实参/可变形参)
const 形参和实参 当形参是 const 变量时,实参是 const 或者不是 const 变量都可以. 实参初始化形参时会忽略掉顶层 const: void gel(const int a){ ...
- loj #2508. 「AHOI / HNOI2018」游戏
#2508. 「AHOI / HNOI2018」游戏 题目描述 一次小 G 和小 H 在玩寻宝游戏,有 nnn 个房间排成一列,编号为 1,2,…,n,相邻房间之间都有 111 道门.其中一部分门上有 ...
- nginx公网IP无法访问浏览器
配置服务器时候发现的问题,真的是搜肠刮肚的找答案,找一下午,终于找到了答案. 一.开始找原因 在浏览器输入:http://ip,正常的话,会有页面,welcome to nginx 我这里是浏览器访问 ...
- 更改Linux下的时间
1.使用tzseletect glibc-common-2.12-1.192.el6.x86_64 : Common binaries and locale data for glibc Repo : ...