函数三

函数三

函数的递归

  • 大前提:都是要遵循函数定义时的空间范围,可以直接调用自己,也可以直接由他人调用,

  • 无限的递归会导致内存溢出,因此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 *  # 导入所有的函数
import from···import
posted @ 2020-07-23 22:02  feiguoguobokeyuan  阅读(203)  评论(0编辑  收藏  举报