今日大纲:
1.函数名的使用
2.闭包
3.迭代器
4.递归
1.函数名的使用
# 1.通过另一个变量名调用该函数 def func(): print(123) temp = func temp() # 2.函数名可以当作元素放进容器 def a1(): print(1) def a2(): print(2) lis = [a1,a2] print(lis) # [<function a1 at 0x000002AE39365A60>, <function a2 at 0x000002AE3936ED08>] for func in lis: func() """ 1 2 """ # 3.函数名可以当作返回值,嵌套函数返回内部函数的内存地址调用 def func2(): def func3(): print(456) return func3 temp = func2() temp() # 4.函数名可以当作参数传递 def t1(t): print(11) t() print(11) def t2(): print("t2!!") t1(t2)
2.闭包
闭包的特性:
1.是一个嵌套函数 2.在嵌套函数的内部函数调用上一层非全局的变量 注:以上两点已经可以判断是个闭包 3.在嵌套函数里返回了内部函数的内存地址
闭包和普通函数的不同:
python中闭包,会在内存中驻留 (闭包会占内存) ,而普通函数执行完毕则销毁。
检查一个看函数是否是闭包:
func.__closure__ # 如果返回的不是None,该函数就是一个闭包
def func1(): a = 100 def inner(): print(a) #在嵌套函数内部使用上一层非全局变量的值 return inner inner = func1() inner() print(inner.__closure__) # 如果返回的不是None,该函数就是一个闭包 """ (<cell at 0x00000118CBB09618: int object at 0x000000006F718CD0>,) 100 """
3.迭代器
迭代器的特性:
1.惰性机制,需要一个给一个 2.不能从后往前取数据 3.一次性,取完就没了,不可再取
判断一个对象是否是可迭代对象:
这个对象如果有__iter__方法就代表它是个可迭代对象。
判断一个对象是否是迭代器:
具有__iter__和__next__方法就是迭代器。
for循环的机制:
lis = [1,2,3,4,5,6] # 创建一个迭代器,格式:可迭代对象.__iter__() temp = lis.__iter__() # 取迭代器的值,需要__next__()方法,当迭代器为空抛出StopIteration while 1: try: print("%s"%temp.__next__(),end=" ") except StopIteration: break """ 1 2 3 4 5 6 """
4.递归
函数调用函数本身,有明确的结束条件。
递归的应用场景:
1.在不明确循环的次数时候,可以用递归
2.递归操作文件目录
注:递归的效率低,而且占内存,推荐使用堆栈
递归修改最大递归层数:
import sys
sys.setrecursionlimit(number)
注:默认最大递归层数官方是1000,实际998/997层
二分查找例子: # 随意写的
def my_find(lis,value): mid = len(lis) // 2 print("1") if mid: if value == lis[mid]: print("找到了!") return lis[mid] elif value > lis[mid]: return my_find(lis[mid:],value) else: return my_find(lis[:mid],value) elif lis[mid] == value: print("找到了!") return lis[mid] else: return "%s not in the list!"%value a = [33,55,66,77,88,99,100,122,166,177,178,184,199,203,233,294,305,402,666,834,992,1022] result = my_find(a,233) print(result) """ 1 1 1 1 找到了! 233 """