函数名的应用:
1.函数名可以做为函数的参数
def func1():
print(666)
def func2(x):
print(x)
x()
print(func1)
2.函数名可以作为函数的返回值
def wraaper():
def inner():
print('inner)
return inner
ret = wraaper()
ret()
3.函数名可以作为函数的内存地址
print(func)
4.函数可以作为变量
def func1():
print(666)
f1 = func1
f2 = f1
f2()
5.函数名可以作为容器类型的元素
def func1():
print('in func1')
def func2():
print('in func2')
def func3():
print('in func3')
def func4():
print('in func4')
l1 = [func1, func2, func3, func4]
for i in l1:
i()
globlas() : 返回全局变量的一个字典
locals():返回当前位置的局部变量的字典
def func1():
a = 2
b = 3
print(globals())
print(locals())
def inner():
c = 5
d = 6
print(globals())
print(locals())
inner()
func1()
闭包:内层函数对外层函数变量(非全局变量)的引用,并返回,这样就形成了闭包
def wraaper():
name = 'alex'
def inner():
print(inner.__closure__)
inner()
return inner
wraaper()
当name是全局变量时
name = 'alex'
def wraaper():
def inner():
print(name)
print(inner.__closure__) #返回的是None
inner
return inner
wraaper()
但是,当wraaper的实参是name时,将会有返回值
name = 'alex'
def wraaper(n): #n = 'alex'
def inner():
print(n)
print(inner.__closure__)
inner()
return inner
wraaper(name)
闭包的作用:当程序遇到函数执行时,会开辟出一个内存空间,儿如果这个函数形成了闭包,name他不会随着函数的消失而消失。
迭代对象:内部含有__inter__,满足可迭代协议
判断方法:
s1 = 'strs'
dic = {'name': 'alex'}
print('__iter__'in dir(s1)) #True
print('__iter__'in dir(dic)) #True
第二种方法:
from collections import Iterable
from collections import Iterator
print(isinstance('alex', Iterable)) #True
print(isinstance('alex', Iterator)) #False
print(isinstance('alex', str)) #True
迭代器:对象内部含有__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)) Flase
迭代器与迭代对象的区别:
迭代对象不能取值,迭代器可以取值
迭代对象可以转化成迭代器
迭代器非常节省内存
迭代器每次只取一次值
迭代器是单向的,一条路走到头
s = 'kfdsjla'
iter1 = s.__iter__()
while 1:
try:
print(iter1.__next__())
except StopIteration:
break
用while循环模拟出for循环
posted on
浙公网安备 33010602011771号