函数名的使用,闭包函数和迭代器
1. 函数名的应用(第一类对象)
函数名的命名规范和变量是一样的,函数名其实就是变量名,他是一个特殊的变量,与()配合可以执行函数的变量
def func():
print("我是一个小小的函数")
a = func #把函数名名赋值给变量a
print(a) #<function func at 0x000000AE20BB1E18> 此处打印的是内存地址
func() #我是一个小小的函数 与括号使用,调用函数
a() #我是一个小小的函数
func = 3 #也可以赋值,但是结果就变成3了
print(func)
可以作为列表中的元素进行存储.
def func1(): pass def func2(): pass lst = [func1, func2] #把函数名存在列表里 for el in lst: el() #调用函数
可以作为参数传递给函数.
def func():
pass
def proxy(fn):
fn()
proxy(func) ## 把函数名作为参数传递给另一个函数
可以作为函数的返回值
def func():
def inner():
pass
return inner
func()() #调用inner函数,在外部调用内部inner函数!
2. 闭包
闭包:在内层函数中访问外层函数的局部变量
好处:
1. 保护你的变量不受外界影响
a = 10
def outer():
global a
a = 20
def outer_2():
global a
a = 30
outer_2()
outer()
print(a) #a的值一直在改变,非常不安全,调用的顺序不一样,结果也不一样
def outer():
a = 10
def inner():
print(a)
return inner #而函数里的变量a,除了在函数内部可以改变,外界是无法改变的.
2. 可以让变量常驻内存
def f1():
a=10
def f2():
print(a) #a是外层f1中的变量
return f2
b=f1() #把值赋值给b,因为不知道b什么时候用,所以上面的变量a要常驻内存,为了f2执行的时候有值.
b() #调用内部函数,
3. 迭代器
使用dir来查看该数据包含了那些方法
print(dir(str)) #有__iter__ print(dir(int)) # 没有__iter__ #所有的带__iter__可以使用for循环的, 可迭代对象
可迭代对象可以使用__iter__()来获取到迭代器
可迭代对象: Iterable, 里面有__iter__()可以获取迭代器, 没有__next__()
迭代器: Iterator, 里面有__iter__()可以获取迭代器, 还有__next__()
a='我想吃花甲粉,但是贫穷限制了我都购买力' b=a.__iter__() print(b.__next__()) #我 print(b.__next__()) #想 print(b.__next__()) #吃
迭代器特点:
1. 只能向前. #下一个,下一个,找上一个
2. 惰性机制. #print一回往前去一个值
3. 省内存(生成器)
for循环的内部机制.
1. 首先获取到迭代器.
2. 使用while循环获取数据
3. it.__next__()来获取数据
4. 处理异常 try:xxx except StopIteration:
a='该吃饭了,晚上吃啥?'
it=a.__iter__() # 获取迭代器
while 1:
try: # 尝试执行
b=it.__next__() #获取下一个元素
print(b)
except StopIteration: #处理错误
break
isinstance()是否是某个类型的实例
from collections import Iterable # 可迭代对象 from collections import Iterator # 迭代器 print(isinstance(it, Iterable)) #True print(isinstance(it, Iterator)) #True
print(isinstance('123',str) #True

浙公网安备 33010602011771号