函数名 闭包 迭代器
Posted kend
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了函数名 闭包 迭代器相关的知识,希望对你有一定的参考价值。
函数名
函数名就是变量; 函数名可以作为参数进行传递
1. 函数名的内存地址
def func(): print("哈哈") print(func) #<function func at 0x01CDD4B0>
2. 函数名可以赋值给其他变量
def func(): print("呵呵") print(func) a = func #把函数当成变量 赋值给另一个变量 a() # 函数调用 func()
3. 函数名可以作为列表中的元素进行存储
def func1(): print("呵呵") def func2(): print("哈哈") lst = [func1,func2] for el in lst: el()#相当于func1() 和func2()
4.函数名可以当做参数
def func(): print("吃了么") def func2(fn): print("我是func2") fn() #执行传递过来的fn print("我是func2") func2(func) #把函数func当做参数传递给func2的参数fn
运行结果: 我是func2 吃了么 我是func2
5.函数名可以作为函数的返回值
def func1(): print("这里是函数1") def func2(): print("这里是函数2") print("这里是函数1") return func2 fn = func1() #执行完函数1 返回的是函数2 所以fn 就是func2 fn() #func2() 执行结果: 这里是函数1 这里是函数1 这里是函数2
闭包
1. 闭包就是内层函数对外层函数(非全局)的变量的引用
def func1(): name = "alex" def func2(): print(name) func2() func1() 结果是 alex
怎么检测函数是不是闭包?
使用函数名 .__closure__返回cell就是闭包, 返回None就不是闭包
def func1(): name = "alex" def func2(): print(name) # 闭包 alex func2() print(func2.__closure__) #(<cell at 0x013F55D0: str object at 0x01307420>,) func1()
2. 如何在函数外调用函数内部的函数呢?
def outer(): name = "alex" def inner(): print(name) return inner fn = outer() #访问外部函数,获取到内部函数的函数地址 fn() #访问内部函数
3. 如果是多层嵌套,只需要一层一层的往外层返回就行了
闭包嵌套
def wrapper(): money = 1000 def func(): name = ‘eva‘ def inner(): print(name,money) return inner return func f = wrapper() #func i = f() #func() i=inner i() #inner()
4. 闭包函数获取网络应用
from urllib.request import urlopen def but(): content = urlopen("http://www.xiaohua100.cn/index.html").read() def get_content(): return content return get_content fn = but() #get_content 返回给but() 所以fn = get_content content = fn() #fn()就是get_content(),执行函数得到 content print(content) content2 = fn() #重新获取内容 print(content2)
迭代器
lst = ["赵四","花生哥", "天台见"] it = lst.__iter__() #获取到迭代器 print(it.__next__()) #取值 print(it.__next__()) print(it.__next__()) print(it.__next__()) #这一行就超过迭代的元素的个数了 所以会报错StopIeration
这里的__iter__是帮助我们获取到对象的迭代器
迭代器中的__next__()用来获取一个迭代器中的元素
可以把要迭代的内容当成子弹,
迭代器__iter__()就是把子弹都装进弹夹中,
发射就是用__next__()把每一个子弹(元素)打出来
也就是说,for循环的时候,一开始是__iter__()来获取迭代器,
后面每次获取元素都是通过__next__()来完成的
迭代器模拟for循环
lst = ["张一宁","石可欣","姚明"] it = lst.__iter__() #获取迭代器 while 1: try: #尝试执行 el = it.__next__() #获取下一个元素 print(el) except StopIteration: #错误处理 break
查看一个对象是否是可迭代对象的方法
from collections import Iterable #可迭代对象 from collections import Iterator #迭代器 print(isinstance(A,B)) #判断某个对象 A 是不是 B 类型中的实例
以上是关于函数名 闭包 迭代器的主要内容,如果未能解决你的问题,请参考以下文章