函数名的应用:
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循环