1:函数名的应用
1.函数名就是函数的内存地址。
def func():
pass
print(func)
2.函数名可以作为变量
def num():
def num1():
print(33)
num1()
f1 = num
f1()
3.函数名可以作为参数:
def num():
print(123)
def num1(x):
x()
m = num
num1(m)
4.函数命可以作为返回值。
def num():
print('我运行')
def inner(x):
print('233')
return x
s = inner(num())
5.函数类可以作为容器类类型数据的元素。
def num1():
print('111')
def num2():
print('222')
def num3():
print('333')
def num4():
print('444')
l = [num1,num2,num3,num4]
for i in l:
i()
2:globals(),locals()
globals()返回全局变量中的一个,locals()返回局部变量中的一个字典
def func1():
# a = 2
# b = 3
# print(globals())
# print(locals())
def inner():
c = 5
d =6
print(globals())
print(locals())
inner()
# print(globals())
# print(locals())
func1()
3.闭包
1.内层函数对外层函数的(非全局变量)变量的引用,并返回,这样就行成了闭包
def wraaper():
name = "alex"
def inner():
print(name)
print(inner.__closure__)
inner()
return inner()
wraaper()
2.闭包的作用:当程序执行时遇到函数,会在内存空间开辟一个局部命名空间,如果这个函数形成了闭包,它不会随着函数结束而关闭。
如,网页爬取时,形成闭包,那么爬取的数据一直都是使用同一个局部空间,从而节省内存。
4.可迭代对象:
1.对象内部含有__iter__方法的就是可迭代对象。可迭代对象满足可迭代协议。
2.可迭代对象:tuple,str,dict,list.range
3.判断一个对象是否可迭代。
s1 = 'asdf' #方法1
dic = {'name':'黎明'}
print('__iter__' in dir(s1))
print('__iter__' in dir(dic))
5.迭代器:
1.什么是迭代器:对象内部含有__iter__ 切含有 __next__方法的就是迭代器。
f = [1,2,3,45,6,7]
f1 = f.__iter__()
print('__iter__' in dir(f1))
print('__next__' in dir(f1))
2.
可迭代对象vs迭代器
可迭代对象不能取值,迭代器是可以取值的。
可迭代对象 --->(转化成)迭代器
# lis = [1,2,3,4]
# # lis1 = lis.__iter__() #可迭代对象转化为迭代器,方法1
# lis1 = iter(lis) #可迭代对象转化为迭代器,方法2
# print('__iter__' in dir(lis))
# print('__next__' in dir(lis))
# print('__iter__' in dir(lis1))
# print('__next__' in dir(lis1))
3 迭代器如何取值? next一次,取一个值
print(ite1.__next__())
print(ite1.__next__())
print(ite1.__next__())
print(ite1.__next__())
4.
1.可迭代对象不能取值,迭代器是可以取值的。
2.迭代器是非常节省内存。
3.迭代器每次只会取一个值
4.迭代器是单向的,一条路走到头。
5.
1.将可迭代对象转化成迭代器。
2.调用__next__方法取值
3.利用异常处理停止报错
iter1 = s1.__iter__()
while 1:
try:
print(iter1.__next__())
except StopIteration:
break