python可迭代对象相关的内建函数_python之函数闭包、可迭代对象和迭代器
一、函数名的应用
#1,函数名就是函数的内存地址,而函数名()则是运行这个函数。
deffunc():return
print(func) #返回一个地址
#2,函数名可以作为变量。
deffunc1():print(666)
f1=func1
f2=f1
f2()#就等于func1() 此时执行函数
#3,函数名可以作为函数的参数。
deffunc1():print(666)deffunc2(x):
x()
func2(func1)#输出666 func1作为实参传进func2中,此时在func2中x()等于func1()
#4,函数名可以当做函数的返回值。
defwraaper():definner():print(666)returninner
ret= wraaper() #执行函数wraaper(),得到返回值inner赋值给ret,这个inner是函数名
ret() #输出666,ret()等于inner()#(注意:这里要调用inner()只能是用ret(),因为inner()是wraaper()的嵌套函数,在全局命名空间中并没有声明,所以直接用inner()不能执行,)
deffunc2():print('in func2')deffunc3(x):print('in func3')returnx
f= func3(func2) #给func3传进一个参数func2,返回func2赋值给f
f() #f()等于func2()
#5,函数名可以作为容器类类型的元素。
deff1():print('f1')deff2():print('f2')deff3():print('f3')
l=[f1, f2, f3]
d= {'f1': f1, 'f2': f2, 'f3': f3}#调用
l[0]() #输出 f1
d['f2']() #输出 f2
deffunc1():print('in func1')deffunc2():print('in func2')deffunc3():print('in func3')deffunc4():print('in func4')
l1=[func1,func2,func3,func4]#调用
for i inl1:
i()#像上面的函数名这种,称为第一类对象。#第一类对象(first-class object)指:#1.可在运行期创建#2.可用作函数参数或返回值#3.可存入变量的实体。#(如果不明白,那就记住一句话,就当普通变量用)
6、globals() locals()
globals() #返回全局变量(包含内置函数)的一个字典。
locals() #返回当前位置的变量的字典。
例如:
deffunc1():
a= 2b= 3
print(globals()) #此时globals()在局部命名空间中,但也是返回全局命名空间的一个字典
print(locals()) #此时locals()在局部命名空间中,所以返回的是局部命名空间的一个字典{'b': 3, 'a': 2}
print(globals()) #此时globals()在全局命名空间中,返回全局命名空间的一个字典
print(locals()) #此时locals()在全局命名空间中,所以返回的是全局命名空间的一个字典
func1()#结果:
#{'__name__': '__main__', '__doc__': None(后面还有一大推东西,省略)...}
#{'__name__': '__main__', '__doc__': None(后面还有一大推东西,省略)...}
#{'__name__': '__main__', '__doc__': None(后面还有一大推东西,省略)...}
#{'b': 3, 'a': 2}
总结:
globals()无论在哪个命名空间,返回的都是全局命名空间的一个字典
locals()在哪个命名空间就返回哪个命名空间的字典
deffunc1():
a= 2b= 3
definner():
c= 5d= 6
print(globals()) #{'__name__': '__main__', '__doc__': None(后面还有一大推东西,省略)...}
print(locals()) #{'c': 5, 'd': 6}
inner()
func1()
二、闭包
1、内层函数引用外层函数的变量(非全局变量),这样该内部函数称就称为闭包函数。
(我们都知道函数内的变量我们要想在函数外部用,可以直接返回这个变量,那么如果我们想在函数外部调用函数内部的函数呢?
就把这个函数的名字返回就好了,这是闭包函数最常用的用法)
defwraaper():
name= '鬼见愁'
definner():print(name)returninner
f=wraaper()
f()
2、判断闭包函数的方法__closure__
#1,是闭包返回值会有cell元素
defwraaper():
name= '鬼见愁'
definner():print(name)print(inner.__closure__)returninner
f=wraaper()
f()#2,不是闭包就会返回None
name = '鬼见愁'
defwraaper():definner():print(name)print(inner.__closure__) #None
returninner
f=wraaper()
f()
name= '番薯'
defwraaper(n):
n= '番薯'
definner():print(n)print(inner.__closure__) #cell at 0x000002AD93BF76D8
inner()returninner
wraaper(name)
'''
闭包作用:
当程序执行时,遇到了函数执行,他会在内存中开辟一个空间,局部名称空间,
如果这个函数内部形成了闭包,
那么它就不会随着函数的结束而消失。
'''
什么时候用到闭包?
例如:爬虫,装饰器等
下面是一个爬虫的小案例:
from urllib.request importurlopendefindex():
url= "http://www.xiaohua100.cn/index.html"
defget():returnurlopen(url).read()returnget
xiaohua= index() #get
content = xiaohua() #get()
print(content.decode('utf-8'))
三、可迭代对象
for i in 'abc':
print(i)
for i in 123:
print(i) # 'int' object is not iterable表示不是可迭代对象
对象内部含有__iter__方法就是可迭代对象.
可迭代对象满足可迭代协议。
可迭代对象:str list dict,tuple,set,range()
dir() :返回一个列表,列表里面包含了传入的参数的属性、方法
s1 = 'strs'
print(dir(s1))
判断一个对象是否是可迭代对象:
#第一个方法
s1 = 'abc'dic= {'name':'xiaoming'}print('__iter__' indir(s1))print('__iter__' indir(dic))#第二种方法
from collections import Iterable #判断是否为可迭代对象
from collections import Iterator #判断是否为迭代器
print(isinstance('xiaoming',Iterable)) #True
print(isinstance('xiaoming',Iterator)) #False
print(isinstance('xiaoming',str)) #True#isinstance() 应用比type()更广泛,isinstance()不仅可以判断你是不是可迭代对象,#也可判断你是否迭代器,还可以判断你是什么类型的数据等等,而#type()只能判断你是什么数据类型
四、迭代器
1、对象内部含有__iter__方法且含有__next__方法就是迭代器。
#文件句柄是迭代器:
f= open('register', encoding='utf-8')print('__iter__' in dir(f)) #True
print('__next__' in dir(f)) #True
#字典是可迭代对象,不是迭代器。print('__iter__' in dir(dict)) #True
print('__next__' in dir(dict)) #False
2、可迭代对象与迭代器的区别:
1,可迭代对象不能取值,迭代器是可以取值的。
(我们知道字典列表都是可迭代对象,为什么它们能取值呢?这是因为为了方便我们操作,我们设定了
索引(键)用来操作字典列表取值,如果没有人为为它们设置的索引(键),它们是不能取值的)
2, 迭代器非常节省内存。
3,迭代器每次只会取一个值。
4,迭代器单向的,一条路走到头。
3、可迭代对象 --->(转化成)迭代器
lis = [1, 2, 3] #可迭代对象
ite1 = lis.__iter__() #迭代器
ite1 = iter(lis) #迭代器
print(ite1)
4、迭代器如何取值? next一次,取一个值
print(ite1.__next__())print(ite1.__next__())print(ite1.__next__())
5、while循环模拟for循环机制
1,将可迭代对象转化成迭代器。
2,调用__next__方法取值。
3,利用异常处理停止报错。
s1 = 'abcdefg'iter1= s1.__iter__()while 1:try:print(iter1.__next__())exceptStopIteration:break
python可迭代对象相关的内建函数_python之函数闭包、可迭代对象和迭代器相关推荐
- python可变参数和关键字参数位置_python中函数的默认参数和可变长参数如何排列?...
参数在python中总是通过赋值进行传递的.在默认情况下,参数是通过其位置进行匹配的,从左到右,而且必须精确的传递和函数头部参数名一样多的参数. 这种默认的传递方式很简单 def f(a,b,c): ...
- python class函数报错_Python 的函数是第一类 First-Class 对象
Python的函数是第一类对象(first-class object).你可以把一个函数复制给变量,或者把函数存储在一个结构中.可以像参数一样把函数传递进另一个函数,还可以从一个函数中返回另一个函数. ...
- python创建person类用printinfo方法_Python学习期刊Day11类和对象(2),日记,与,下
今天是2020年2月20日,晴,6~14℃ 一.继承 继承是一种创建新类的方式.新建类将获得原有类的所有属性和方法.原有的类称为父类(超类),新建的类称为子类. Python中继承的方式如下: ''' ...
- python可变参数和关键字参数位置_python笔记——函数的参数(位置参数、默认参数、可变参数、关键字参数、命名关键字参数、参数组合)...
定义函数的时候,我们把参数的名字和位置确定下来,函数的接口定义就完成了.对于函数的调用者来说,只需要知道如何传递正确的参数,以及函数将返回什么样的值就够了,函数内部的复杂逻辑被封装起来,调用者无需了解 ...
- python中def fun()是什么意思_python学习函数
函数 对象 模块 定义函数 def MyFirstFunction(): print('第一个函数') ······ 调用函数 MyFirstFunction() 加入参数 def MySecondF ...
- python算闰年和平年的天数_Python自定义函数计算给定日期是该年第几天的方法示例...
本文实例讲述了Python自定义函数计算给定日期是该年第几天的方法.分享给大家供大家参考,具体如下: 写一个函数,计算给定日期是该年的第几天. 满足闰年的条件: 闰年是公历中的名词,能被4整除但不能被 ...
- python中形参可以使用中文定义嘛_python中函数的参数分类
详解python函数的参数 一.参数的定义 1.函数的参数在哪里定义 在python中定义函数的时候,函数名后面的括号里就是用来定义参数的,如果有多个参数的话,那么参数之间直接用逗号, 隔开 案列: ...
- python将三位数分离(format格式)_Python格式函数,python,之,format
前面跟大家分享过占位符%,最近发现了个更好用的格式化输出函数format,故做了个总结,下面将是对format函数的用法全解. 首先,format是一个字符串中的函数 表达式为 str.format( ...
- python语言中find是什么意思_Python find()函数是什么?
碰到去检索字符串的情况,罗列自己所学的函数,虽然能够实现,但是不是多多少少,感觉有些冗杂,不是特别简单,如果有这样的疑问,首先恭喜,大家思考能力很好,其次就是给大家带来解决疑难问题的方案,这里专门介绍 ...
- python中str的index什么意思_python index函数是什么意思
Python index() 方法检测字符串中是否包含子字符串 str ,如果指定 beg(开始) 和 end(结束) 范围,则检查是否包含在指定范围内,该方法与 python find() 方法一样 ...
最新文章
- 【组队学习】【28期】青少年编程(Scratch 一级)
- python基础教程:修改Python列表中元素的几种方法
- java 数据库数据写接口_Java读取接口数据并保存到数据库
- 12本接收率高的医学SCI期刊
- oracle 11gR2 RAC root.sh 错误 ORA-15072 ORA-15018
- 9行代码AC——1011 A+B 和 C (15分)
- 最长递增子序列(力扣)图解
- Win10右键添加notepad++
- 剖析Disruptor:为什么会这么快?(一)Ringbuffer的特别之处
- 电脑怎么卸载软件干净_极客卸载,还你干净电脑
- PLSQL导入导出表结构及数据
- E680I使用上的常见问题小结
- 根据用户IP精确定位推送消息
- 【活动更新】第一届Openbravo社区早餐会将与5/28在上海举办
- 入门必看!ui设计分类有哪些?【萧蕊冰】
- C#打造机械耳感键盘(全局监听键盘并设置音效)
- Jitsi视频会议部署(三):让电话打进来!
- BZOJ3677: [Apio2014]连珠线
- 协作通信关键技术(王辉)阅读心得
- java节假日算法_基于Java代码实现判断春节、端午节、中秋节等法定节假日的方法...