• python--004--函数(基础、递归)


    1. 函数和过程

      过程:就是没有返回值的函数
      在python中函数和过程是一样的,没有区别,如果没有返回值,python会自动赋值为None

    2. 总结:

    返回值=0:返回None(即没有写返回值时,python自动赋值为None)
    返回值=1:返回object(即返回一个值时,其类型为object)
    返回值>1:返回tuple(即有多个返回值时,其类型为tuple)

     

    3. 形参和实参 

    形参:形参只有在被调用时才能分配内存单元,调用结束后,即刻释放所分配的内存单元
    实参:可以是常量、变量、表达式、函数等

    混搭传值:位置参数必须要在关键字参数左边,且不能重复赋值

    def test(x,y,z):
        print(x,y,z)
    
    v=test(1,2,z=3)

    默认参数
    参数组:(非固定长度的参数)**字典 *列表

    def test(x, *args):
        print(x)
        print(args)
    
    v = test(1, 2, 3, 4, 5, 6)

     

    print的args=(2,3,4,5,6)当作元组来处理,但是传入的时候args将多传入的值当作列表处理

    def test(x, **kwargs):
        print(x)
        print(kwargs)
    
    v = test(1, y=2, z=3)
    
    # print结果kwargs,为字典

    output:

      1
      {'y': 2, 'z': 3}

     

    4. 全局变量与局部变量
        函数中可以使用global来表示以下使用和改变的是全局变量

    NAME="ALEC"
    
    def TEST():
        global NAME
        NAME='sky'
    print("change name",NAME)
    
    
    output:
        change name ALEC

    如果函数的内容中无global关键字,优先读取局部变量,能读取全局变量,无法对全局变量进行赋值,NAME=“fff”
    但是对于可变类型,可以对内部元素进行操作如append等
    如果函数中有global关键字,便来那个本质上就是全局的那个变量,可读取可赋值

     

    执行顺序:(需要补一个)

    全局变量练习:
    name="佩奇"
    def weihou():
        name="乔治"
    def weiweihou():
        global name
        # nonlocal name   #nonlocal代指上一级的name
        name = "苏茜"
    
    weihou()
    print(name)
    weiweihou()
    print(name)
    
    output:
        佩奇
        苏茜

    5. 风湿理论之函数即变量

       在执行过程中,函数即变量

    def test():
        pass
        name="wendy"

     意思是,创建函数和创建变量name一样,在内存中都是相当于门牌号是test、name,然后房间内是函数体、字符串wendy

     

     6. 递归

    def calc(n):
        print(n)
        if int(n/2)==0:
            return n
        return calc(int(n/2))
    calc(10)

    递归:如上即为递归,自己调用自己


    递归的特点:

      1)必须要有一个明确的结束条件;
      2)每次进入更深一层递归时,问题规模相比上次递归都应有所减少;
      3)递归效率不高,递归层次过多会导致栈溢出(在计算机中,函调用是通过栈(stack)这种数据结构实现的;每当进入一个函数调用,栈就会加一层栈帧,每当函数返回,栈就会减一层栈帧。由于栈的大小不是无限的,所以,递归调用的次数过多,会导致栈溢出。)

    7. 函数的作用域

     

    def test():
        pass
    print(test)   # test 代表函数名称,代表内存中的门牌号,即函数体的内存地址
    test()       # 加上()代表执行该函数  
    
    output:<function test at 0x000000000205C268>

     

    def test1():
        print('in the test1')
    def test():
        print('in the test')
        return test1
    
    print(test)    # 打印test函数的地址
    res = test()   # 运行test返回test1函数的地址
    print(res())   # 运行test1,返回print:in the test1

     

    name = 'peiqi'
    def foo():
        name = "qiaozhi"
        def bar():
            print(name)
        return bar
    
    a = foo()        # 运行foo,返回bar这个函数的地址
    print(a)         # 相当于打印bar这个函数的地址
    a()              # 相当于运行bar这个函数,print name,但是这里虽然在全局作用域中调用,但是print的name是“qiaozhi”
                     # 因为这个函数在foo内部,所以要运行bar,肯定得先运行foo,所以离它最近的name应该是qiaozhi,而不是peiqi

     

    
    

     

     

  • 相关阅读:
    THUSC2016 成绩单 和 LOJ3226 Greedy Pie Eaters
    LOJ3215 Muzyka pop
    LOJ3223 Trzy kule
    ZJOI2015 幻想乡战略游戏 和 SCOI2019 找重心
    LOJ3235 Przedszkole 和 有限空间跳跃理论
    SCOI2019 湖之精灵的游戏
    SCOI2016 幸运数字
    SCOI2014 方伯伯的商场之旅
    POJ3621 Sightseeing Cows 和 CH6B12 最优高铁环 和 SCOI2014 方伯伯运椰子
    SCOI2014 方伯伯的OJ 和 NOIP2017 列队
  • 原文地址:https://www.cnblogs.com/jinf/p/10549180.html
Copyright © 2020-2023  润新知