zoukankan      html  css  js  c++  java
  • day012|python之函数3&模块01

    函数03&模块01

    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 sys
    print(sys.getrecursionlimit())  # 默认1000
    sys.setrecursionlimit(2000)  # 修改为2000
    print(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)=18
    
    def age(n):
        if n == 1:
            return 18
        return age(n-1)+10
    
    res = 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是列表
                # 重新调用本段代码,传入一个新列表x
                func(x)
    
    func(l)  # 1 2 3 4 5 6 7
    

    1.2 二分法

    nums = [-3, 4, 7, 13, 17, 21, 98, 102, 108]
    find_num = 98
    
    def choose(find_num, nums):
        if len(nums) == 0:
            print('no search')
            return
        mid_num = len(nums) // 2
        if find_num > nums[mid_num]:
            # in the right
            new_num = nums[mid_num + 1:]
            choose(find_num, new_num)
        elif find_num < nums[mid_num]:
            # in the right
            new_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、reduce
    from functools import reduce
    res = reduce(lambda x, y: x+y, "hello", "xxx")
    print(res)  # xxxhello
    
    from functools import reduce
    res = reduce(lambda x, y: x+y, [1, 2, 3], 100)
    print(res)  # 106
    
    
    lambda
    
    
    4、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 = 3333333
    def func():
        x = 1
        y = 2
        print(locals())
        print(globals())
    
    
    func()  # {'x': 1, 'y': 2}
            # {'__name__': '__main__', ...}
    a = 1111111
    print(locals())  # {'__name__': '__main__', ...}
    print(globals())  # {'__name__': '__main__', ...}
    print(locals() is globals())  # True
    
    
    6、hash返回散列值
    print(hash("asaasdf"))  # -9196404338305892359
    
    
    7、pow(base**exp % mod)
    res = pow(10, 3, 3)  # 10 ** 3 % 3
    print(res)  # 1
    
    
    8、reversed 反序
    res = reversed([11, 333, 222, 77])
    print(list(res))  # [77, 222, 333, 11]
    
    
    9、round 四舍五入
    print(round(3.5))  # 4
    
    
    10、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.py
    print("from the spam.py")
    
    money = 1000
    
    def change():
        global money
        money = 0
    
    def func1():
        print("----->%s" % money)
    
    def func2():
        print('=====>')
        func1()
    
    • 调用
    import spam  # from the spam.py
    print(spam.func1)  # <function func1 at 0x000001DBFAE58280>
    print(spam.func2)  # <function func2 at 0x000001DBFAE588B0>
    print(spam.change)  # <function change at 0x000001DBFAC38700>
    print(spam.money)  # 1000
    spam.func1()  # ----->1000
    spam.func2()  # =====>
    spam.change()  # ----->1000
    
    
    import spam
    money = 2000
    spam.func1()  # ----->1000
    
    def func1():
        print(111111)
    spam.func1()  # ----->1000
    func1()  # 111111
    

    3.2.2 from ... import ...

    • 优势:使用起来更方便
    • 劣势:容易与当前执行文件中的名字冲突
  • 相关阅读:
    Codeforces Beta Round #6 (Div. 2 Only)
    Codeforces Beta Round #5
    Codeforces Beta Round #4 (Div. 2 Only)
    Codeforces Beta Round #3
    Codeforces Beta Round #2
    Codeforces Beta Round #1
    HDU 4020 Ads Proposal
    SRM 615 DIV1 500
    求1+2+……+n(位运算)
    好好加油!
  • 原文地址:https://www.cnblogs.com/caojiaxin/p/14109780.html
Copyright © 2011-2022 走看看