ThinkChat2.0新版上线,更智能更精彩,支持会话、画图、阅读、搜索等,送10W Token,即刻开启你的AI之旅 广告
[TOC] ## 嵌套函数 嵌套函数即在一个函数中调用另外一个函数 * 案例 ``` name = "Alex" def change_name(): name = "Alex2" def change_name2(): name = "Alex3" print("第3层打印", name) change_name2() # 调用内层函数 print("第2层打印", name) change_name() print("最外层打印", name) ``` * 输出: 第3层打印 Alex3 第2层打印 Alex2 最外层打印 Alex ## 高阶函数 一个函数接收另一个函数作为参数,这种函数就称之为高阶函数。 只需满足以下任意一个条件,即是高阶函数 1. 接受一个或多个函数作为输入 2. return 返回另外一个函数 * 案例 ``` def add(x,y,f): return f(x) + f(y) res = add(3,-6,abs) print(res) ``` ## 递归 ### 递归函数 在函数内部,可以调用其他函数。如果一个函数在内部调用自身本身,这个函数就是递归函数。 ```python def calc(n): print(n) if int(n/2) ==0: return n return calc(int(n/2)) calc(10) 输出: 10 5 2 1 ``` ### 递归特性: 1. 必须有一个明确的结束条件 2. 每次进入更深一层递归时,问题规模相比上次递归都应有所减少 3. 递归效率不高,递归层次过多会导致栈溢出 递归案例:二分查找 ```python data = [1, 3, 6, 7, 9, 12, 14, 16, 17, 18, 20, 21, 22, 23, 30, 32, 33, 35] def binary_search(dataset,find_num): print(dataset) if len(dataset) >1: mid = int(len(dataset)/2) if dataset[mid] == find_num: #find it print("找到数字",dataset[mid]) elif dataset[mid] > find_num :# 找的数在mid左面 print("\033[31;1m找的数在mid[%s]左面\033[0m" % dataset[mid]) return binary_search(dataset[0:mid], find_num) else:# 找的数在mid右面 print("\033[32;1m找的数在mid[%s]右面\033[0m" % dataset[mid]) return binary_search(dataset[mid+1:],find_num) else: if dataset[0] == find_num: #find it print("找到数字啦",dataset[0]) else: print("没的分了,要找的数字[%s]不在列表里" % find_num) binary_search(data,66) ``` ## 闭包 闭包,简而言之,就是把在函数内部定义的函数和变量,通过return返回到函数外部,使其可以在函数外部被执行 闭包的意义:返回的函数对象,不仅仅是一个函数对象,在该函数外还包裹了一层作用域,这使得,该函数无论在何处调用,优先使用自己外层包裹的作用域 * 闭包案例 ``` def out(): list1=[] def inner(name): list1.append(len(list1)+1) print('%s list1=%s'%(name,list1)) return inner f=out() f('a') f('b') f1=out() f1('c') f('c') # 输出------- a list1=[1] b list1=[1, 2] c list1=[1] c list1=[1, 2, 3] ``` ## Exec与Eval: * 相同点 eval和exec都可以将字符串解析为代码 * 不同点 1. eval只能处理单行代码,但是有返回值 2. exec能处理多行代码,但没有返回值 * 代码示例1:处理解析单行字符串(都可以) ```python >>> ch1="print('hello 1+2')" >>> res1=eval(ch1) hello 1+2 >>> res2=exec(ch1) hello 1+2 ``` * 代码示例2:处理解析多行字符串(eval报错) ```python >>> ch1=''' ... print('hello 1+2') ... print('hello 4+2') ... ''' >>> res1=eval(ch1) #报错 Traceback (most recent call last): File "<input>", line 1, in <module> File "<string>", line 3 print('hello 4+2') ^ SyntaxError: invalid syntax >>> res2=exec(ch1) hello 1+2 hello 4+2 ``` * 代码示例3:返回值(exec没有) ```python >>> print(eval("1+2+3")) 6 >>> print(exec("1+2+3")) None ```