函数三
函数三
函数的递归
-
大前提:都是要遵循函数定义时的空间范围,可以直接调用自己,也可以直接由他人调用,
-
无限的递归会导致内存溢出,因此python默认了最大的递归次数1000,此递归次数和操作系统有关,每个人都不一样
# import sys # print(sys.getrecursionlimit()) # 递归最大次数 # print(sys.setrecursionlimit(2000)) # 设置递归最大次数
-
递归函数分为两阶段,回溯:一层一层的调用下去 递推:在满足某一条件下停止回溯,一层一层的返回。
# 二分法和递归的结合 # nums=[111,[222,[333,[444,[5555,[6666,[777,[888,[9999]]]]]]]]] # def func(l): # for x in l: # if type(x) is list: # # 把自身的代码重新再调用一次 # func(x) # else: # print(x) # func(nums) ################## nums = [11, 13, 32, 47, 53, 73, 84, 91,101,111,222,333,444,5555] def binary_search(l,find_num): print(l) # 此为了判断列表是否为空 if len(l) == 0: print('find_num not exists') return mid_index = len(l) // 2 if find_num > l[mid_index]: right_l=l[mid_index+1:] binary_search(right_l,find_num) elif find_num < l[mid_index]: left_l=l[:mid_index] binary_search(left_l,find_num) else: print('find it') binary_search(nums,85)
三元表达式
# 表达式1 if 条件 else 表达式2 只应用于简单函数
# res = 1 if x > y else 2
匿名函数
-
即没有名字的函数,跟变量名有着本质的区别,用完一次即被垃圾回收
# res = (lambda x, y: x + y)(1,2) f = lambda x, y;x + y f() 一般都不这样使用 一般匿名函数和其他结合使用 salaries = { 'q': 1, "w": 2, 'e': 3 } # print(max(salaries, key=lambda k:salaries[k])) # 取键对应的值的最大值,便将最大值对应的键返回给函数,即 e # print(min(salaries, key=lambda k:salaries[k])) # q # print(sorted(salaries,key=lambda k:salaries[k],reverse=True) # e w q
模块
- 定义:功能的聚集体,不是用来运行的,是用来导入的
- 三大来源:内置模块 第三方模块 自定义模块 也是导入时比较规范的顺序
- 一个
py
文件就是一个模块,一个文件夹也是一个模块或者叫包 - 特点:调高开发效率,解决代码冗余
文件名spam.py 模块名spam
import spam 遵循定义模块的作用域
调用时spam.函数名()
# 首次导入模块发生的事情
# 1、触发被导入的模块的运行,产生一个模块的名称空间,把模块中的名字都丢进去
# 2、会在当前执行文件中得到一个名字spam,该名字是指向被导入模块的名称空间的,之后的导入,名字spam直接引用首次导入产生的名称空间,不会再执行模块的内的代码了
也可为模块重新命名 例 import qwertyuio as zf 调用 zf.函数名()
一次导入多个模块 import spam,q1,q2,q3 # 不推荐使用
#################################################
from spam import r1,r2,r3 # 导入模块的多个功能 缺点:调用时会和运行模块的相同变量名产生冲突,但也遵循定义阶段即开辟变量空间的原则
# 首次导入模块发生的事情
# 1、触发被导入的模块的运行,产生一个模块的名称空间,把模块中的名字都丢进去
# 2、会在当前执行文件中得到所有导入函数的名字
也可以导入多个函数 重命名
from spam import * # 导入所有的函数