函数三
函数的递归
- 大前提:都是要遵循函数定义时的空间范围,可以直接调用自己,也可以直接由他人调用,
- 无限的递归会导致内存溢出,因此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 * # 导入所有的函数