函数名的本质就是函数的内存地址
可以被引用
def func(): print("我是函数") f = func print(f) >>>>>>> <function func at 0x00000000023BE2F0> # 打印的是这个函数的函数地址
可以被当作容器类型的元素
def f(): print("f") def f1(): print("f1") def f2(): print("f2") lis = [f,f1,f2] lis[0]() # 相当于调用f()函数 >>>>>>> f d = {"f1":f1,"f2":f2} d["f1"]() # 相当于调用f1函数 >>>>> f1
可以当做函数的参数跟返回值
def f(): print("我是谁?") def proxey(fun): fun() print("猜猜我又是谁") return fun ret = proxey(f) # 先执行proxer函数 并且把 f 函数名当做参数传递进去 # 此时执行func()函数相当于执行 f 函数 打印 执行完毕后 # 执行第二个print 并且 把fun 当做返回值返回给 ret 执行ret # 打印 我是谁 ret() >>>>>>>>>>>>>>> 我是谁? 猜猜我又是谁 我是谁?
大白话就是 函数的使用跟变量名的使用方法一样
闭包
定义:内部函数包含对外部作用域而非全局作用域变量的引用,该内部函数成为闭包.
作用:让一个变量常驻内存,供以后的程序使用.
def func(): a = 10 def inner(): print(a) return inner func()() >>>>>> 10
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() # 这个时候就开始加载校花100的内容 # 后⾯需要⽤到这⾥⾯的内容就不需要在执⾏⾮常耗时的⽹络连接操作了 content = fn() # 获取内容 print(content) content2 = fn() # 重新获取内容 print(content2)
迭代器
迭代器的特点:
1. 节省内存.
2. 惰性机制
3. 不能反复, 只能向下执行.
li = [1, 2, 3, 4, 9, 10] ret = li.__iter__() # 获取 迭代器 while 1: try: el = ret.__next__() print(el) except StopIteration: break