函数三

函数的递归

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

python中函数的递归调用 python中递归函数的调用次数_变量名

python中函数的递归调用 python中递归函数的调用次数_变量名_02