一、函数名的应用

#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之函数闭包、可迭代对象和迭代器相关推荐

  1. python可变参数和关键字参数位置_python中函数的默认参数和可变长参数如何排列?...

    参数在python中总是通过赋值进行传递的.在默认情况下,参数是通过其位置进行匹配的,从左到右,而且必须精确的传递和函数头部参数名一样多的参数. 这种默认的传递方式很简单 def f(a,b,c): ...

  2. python class函数报错_Python 的函数是第一类 First-Class 对象

    Python的函数是第一类对象(first-class object).你可以把一个函数复制给变量,或者把函数存储在一个结构中.可以像参数一样把函数传递进另一个函数,还可以从一个函数中返回另一个函数. ...

  3. python创建person类用printinfo方法_Python学习期刊Day11类和对象(2),日记,与,下

    今天是2020年2月20日,晴,6~14℃ 一.继承 继承是一种创建新类的方式.新建类将获得原有类的所有属性和方法.原有的类称为父类(超类),新建的类称为子类. Python中继承的方式如下: ''' ...

  4. python可变参数和关键字参数位置_python笔记——函数的参数(位置参数、默认参数、可变参数、关键字参数、命名关键字参数、参数组合)...

    定义函数的时候,我们把参数的名字和位置确定下来,函数的接口定义就完成了.对于函数的调用者来说,只需要知道如何传递正确的参数,以及函数将返回什么样的值就够了,函数内部的复杂逻辑被封装起来,调用者无需了解 ...

  5. python中def fun()是什么意思_python学习函数

    函数 对象 模块 定义函数 def MyFirstFunction(): print('第一个函数') ······ 调用函数 MyFirstFunction() 加入参数 def MySecondF ...

  6. python算闰年和平年的天数_Python自定义函数计算给定日期是该年第几天的方法示例...

    本文实例讲述了Python自定义函数计算给定日期是该年第几天的方法.分享给大家供大家参考,具体如下: 写一个函数,计算给定日期是该年的第几天. 满足闰年的条件: 闰年是公历中的名词,能被4整除但不能被 ...

  7. python中形参可以使用中文定义嘛_python中函数的参数分类

    详解python函数的参数 一.参数的定义 1.函数的参数在哪里定义 在python中定义函数的时候,函数名后面的括号里就是用来定义参数的,如果有多个参数的话,那么参数之间直接用逗号, 隔开 案列: ...

  8. python将三位数分离(format格式)_Python格式函数,python,之,format

    前面跟大家分享过占位符%,最近发现了个更好用的格式化输出函数format,故做了个总结,下面将是对format函数的用法全解. 首先,format是一个字符串中的函数 表达式为 str.format( ...

  9. python语言中find是什么意思_Python find()函数是什么?

    碰到去检索字符串的情况,罗列自己所学的函数,虽然能够实现,但是不是多多少少,感觉有些冗杂,不是特别简单,如果有这样的疑问,首先恭喜,大家思考能力很好,其次就是给大家带来解决疑难问题的方案,这里专门介绍 ...

  10. python中str的index什么意思_python index函数是什么意思

    Python index() 方法检测字符串中是否包含子字符串 str ,如果指定 beg(开始) 和 end(结束) 范围,则检查是否包含在指定范围内,该方法与 python find() 方法一样 ...

最新文章

  1. 【组队学习】【28期】青少年编程(Scratch 一级)
  2. python基础教程:修改Python列表中元素的几种方法
  3. java 数据库数据写接口_Java读取接口数据并保存到数据库
  4. 12本接收率高的医学SCI期刊
  5. oracle 11gR2 RAC root.sh 错误 ORA-15072 ORA-15018
  6. 9行代码AC——1011 A+B 和 C (15分)
  7. 最长递增子序列(力扣)图解
  8. Win10右键添加notepad++
  9. 剖析Disruptor:为什么会这么快?(一)Ringbuffer的特别之处
  10. 电脑怎么卸载软件干净_极客卸载,还你干净电脑
  11. PLSQL导入导出表结构及数据
  12. E680I使用上的常见问题小结
  13. 根据用户IP精确定位推送消息
  14. 【活动更新】第一届Openbravo社区早餐会将与5/28在上海举办
  15. 入门必看!ui设计分类有哪些?【萧蕊冰】
  16. C#打造机械耳感键盘(全局监听键盘并设置音效)
  17. Jitsi视频会议部署(三):让电话打进来!
  18. BZOJ3677: [Apio2014]连珠线
  19. 协作通信关键技术(王辉)阅读心得
  20. java节假日算法_基于Java代码实现判断春节、端午节、中秋节等法定节假日的方法...

热门文章

  1. WEB测试与APP测试重点及区别
  2. 0penCV_(Watershed Segmenter)使用 分水岭算法 对图像进行分割
  3. 后缀表达式转中缀表达式(非常简单易懂)
  4. pcl对点云进行直通滤波
  5. Want To Say Something
  6. P1215 [USACO1.4]母亲的牛奶 Mother's Milk
  7. JS执行一次任务与定期任务与清除执行
  8. foreign key
  9. libgdx for eclipse开发环境搭建
  10. 求职时,我问过的问题