AI智能
改变未来

day012|python之函数3&模块01


函数03&模块01

[TOC]

1 递归调用

1.1 递归

1.1.1 简介

  • 函数递归调用:在调用一个函数的过程中又调用了自己

  • 本质:循环的过程–>用函数来实现循环

  • 注意点:

    Ⅰ 递归调用必须在满足某种条件下结束,不能无限递归调用下去

    Ⅱ python不是函数式编程语言,无法对递归进行尾递归优化

1.1.2 递归的两个阶段

Ⅰ 回溯—->一层层向下挖

Ⅱ 递推—->一层层往上爬

1.1.3 使用

def f1():print(111)print(222)print(333)f1()f1()  # 先递归执行,超过最大限制后报错RecursionError
# 可以修改最大限制import sysprint(sys.getrecursionlimit())  # 默认1000sys.setrecursionlimit(2000)  # 修改为2000print(sys,getrecursionlimit())  # 2000
# 示例(求5的年龄)# age(5)=age(4)+10# age(4)=age(3)+10# age(3)=age(2)+10# age(2)=age(1)+10# age(1)=18# 求5的年龄# n>1 age(n)=age(n-1)+10# n=1 age(1)=18def age(n):if n == 1:return 18return age(n-1)+10res = age(5)print(res)  # 58
# 示例二l = [1, [2, [3, [4, [5, [6, [7]]]]]]]def func(l):for x in l:if type(x) is not list:# x不是列表print(x)else:# x是列表# 重新调用本段代码,传入一个新列表xfunc(x)func(l)  # 1 2 3 4 5 6 7

1.2 二分法

nums = [-3, 4, 7, 13, 17, 21, 98, 102, 108]find_num = 98def choose(find_num, nums):if len(nums) == 0:print(\'no search\')returnmid_num = len(nums) // 2if find_num > nums[mid_num]:# in the rightnew_num = nums[mid_num + 1:]choose(find_num, new_num)elif find_num < nums[mid_num]:# in the rightnew_num = nums[:mid_nums]choose(find_num, new_num)else:print(\'find it\')choose(102 ,nums)choose(22, nums)

2 内置函数补充

1、filter 过滤names = [\'egon\', \'lxx_sb\', \'hxx_sb\']res = filter(lambda name: name.endswith("sb"), names)print(list(res))  # [\'lxx_sb\', \'hxx_sb\']names = [\'egon\', \'lxx_sb\', \'hxx_sb\']res = (name for name in names if name.endswith("sb"))print(list(res))  # [\'lxx_sb\', \'hxx_sb\']2、map 映射names = ["egon", "lxx", "hxx"]res = map(lambda name:name if name == "egon" else name+"_sb", names)print(res)  # <map object at 0x0000020E897D5B50>print(list(res))  # [\'egon\', \'lxx_sb\', \'hxx_sb\']names = ["egon", "lxx", "hxx"]res = [name if name == "egon" else name+"_sb" for name in names]print(res)  # [\'egon\', \'lxx_sb\', \'hxx_sb\']3、reducefrom functools import reduceres = reduce(lambda x, y: x+y, "hello", "xxx")print(res)  # xxxhellofrom functools import reduceres = reduce(lambda x, y: x+y, [1, 2, 3], 100)print(res)  # 106lambda4、set可变集合/frozenset不可变集合s = frozenset({1, 2, 3})  # 不可变s1 = set({1, 2, 3})  # 可变s1.add(4)print(s1)  # {1, 2, 3, 4}5、locals局部变量/globals全局变量x = 3333333def func():x = 1y = 2print(locals())print(globals())func()  # {\'x\': 1, \'y\': 2}# {\'__name__\': \'__main__\', ...}a = 1111111print(locals())  # {\'__name__\': \'__main__\', ...}print(globals())  # {\'__name__\': \'__main__\', ...}print(locals() is globals())  # True6、hash返回散列值print(hash("asaasdf"))  # -91964043383058923597、pow(base**exp % mod)res = pow(10, 3, 3)  # 10 ** 3 % 3print(res)  # 18、reversed 反序res = reversed([11, 333, 222, 77])print(list(res))  # [77, 222, 333, 11]9、round 四舍五入print(round(3.5))  # 410、slice 切片l = [11, 22, 33, 44, 55, 66, 77, 88, 99]s = slice(0, 7, 2)res1 = l[s]print(res1)  # [11, 33, 55, 77]res2 = l[0: 7: 2]print(res2)  # [11, 33, 55, 77]11、zip 拉链s1 = "hello"l = [11, 22, 33, 44, 55, 66]res1 = zip(s1, l)print(list(res1))  # [(\'h\', 11), (\'e\', 22), (\'l\', 33), (\'l\', 44), (\'o\', 55)]res2 = zip(l, s1)print(list(res2))  # [(11, \'h\'), (22, \'e\'), (33, \'l\'), (44, \'l\'), (55, \'o\')]

3 模块01

3.1 模块简介

1、什么是模块模块就是一系列功能的集合体2、模块四种通用的类型Ⅰ 一个python文件就是一个模块,文件名test.py,模块名为testⅡ 盛放有多个py文件的文件夹也是一个功能的集合体,也是一种模块相当于一个超级模块,称之为包Ⅲ 已被编译为共享库或DLL的C或C++扩展Ⅳ 使用C编写并链接到python解释器的内置模块3、模块的三种来源Ⅰ 自带的模块①内置模块②标准库Ⅱ 第三方模块pip3 install requestsⅢ 自定义模块4、为何要采用模块Ⅰ 自带以及第三方模块->拿来主义,提升开发效率Ⅱ 自定义模块->减少代码冗余

3.2 模块导入方式

3.2.1 import

# 首次导入模块会发生的事# 1、会触发模块文件的运行,产生一个模块的名称空间#    运行模块文件过程中产生的名字都丢到模块的名称空间# 2、在当前名称空间中产生一个名字spam,该名字执行模块的名称空间# 后续的导入,模块名会直接引用首次导入创造好的名称空间
  • 首先自定义一个模块spam.py
# spam.pyprint("from the spam.py")money = 1000def change():global moneymoney = 0def func1():print("----->%s" % money)def func2():print(\'=====>\')func1()
  • 调用
import spam  # from the spam.pyprint(spam.func1)  # <function func1 at 0x000001DBFAE58280>print(spam.func2)  # <function func2 at 0x000001DBFAE588B0>print(spam.change)  # <function change at 0x000001DBFAC38700>print(spam.money)  # 1000spam.func1()  # ----->1000spam.func2()  # =====>spam.change()  # ----->1000import spammoney = 2000spam.func1()  # ----->1000def func1():print(111111)spam.func1()  # ----->1000func1()  # 111111

3.2.2 from … import …

  • 优势:使用起来更方便
  • 劣势:容易与当前执行文件中的名字冲突
赞(0) 打赏
未经允许不得转载:爱站程序员基地 » day012|python之函数3&模块01