• python——函数


    1.关于函数参数:默认参数、关键参数、非固定参数

    (1)默认参数

    def stu_register(name, age, country='China'):
        print('注册信息'.center(30, '-'))
        print('姓名:', name)
        print('年龄:', age)
        print('国籍:', country)
    
    
    stu_register('李白', 40)
    stu_register('李白', 40, '大唐')
    

    country='China' 为默认参数,默认参数必须放在默认参数后面才符合语法要求,调用函数的时候默认参数可以不传,如果传的话则以传入的参数为准

    (2)关键参数

    正常情况下,给函数传参是按顺序传,不想按顺序传,就可以用关键参数,即传参时候指定参数名。

    关键参数必须要放在位置参数之后。

    def stu_register(name, age, country='China'):
        print('注册信息'.center(30, '-'))
        print('姓名:', name)
        print('年龄:', age)
        print('国籍:', country)
    
    
    stu_register('小钻风', country='赛博坦', age=25) 
    stu_register('奇异博士', country='赛博坦', 25) # 这种方式是错误的 
    

    (3)非固定参数

    在定义函数时不确定会传入多少个参数,可以使用非固定参数

    def fun1(*args):
        print(args)
    
    
    fun1('李白', 22, '诗人')
    fun1('鸣人', 25, '螺旋丸', '雏田', '疾风传')
    #打印结果:
    #('李白', 22, '诗人')
    #('鸣人', 25, '螺旋丸', '雏田', '疾风传')
    

    **kwargs 多传入的参数变成一个dict形式

    def fun2(name, age, *args, **kwargs):  # *kwargs 会把多传入的参数变成一个dict形式
        print(name, age, args, kwargs)
    
    
    fun2('我爱罗', 30)
    fun2('卡卡西', 35, '千鸟', '神威', '写轮眼', students='鸣人、佐助、小樱', teacher='木叶闪光')
    #打印结果:
    #我爱罗 30 () {}
    #卡卡西 35 ('千鸟', '神威', '写轮眼') {'students': '鸣人、佐助、小樱', 'teacher': '木叶闪光'}
    
    

    2.局部变量

    name = "大白"
    def change_name():
        name = "小黑"
        print('函数内部打印:', name)
    
    change_name()
    print('函数外部打印:', name)
    
    #打印结果:
    #函数内部打印: 小黑
    #函数外部打印: 大白
    

    结论:定义在函数外部一级代码的变量,即全局变量,全局可用,定义在函数内部的变量,即内部变量,只能在局部使用。

    如果全局变量和局部变量都有一个变量叫 name,函数使用时查找变量的顺序是就近原则,由内到外

    另外,python中,无法通过这种方式更改全局变量 name 的值

    如何在函数中修改全局变量

    name = '李白'
    
    def fun():
        global name #global name的作用就是要在函数里声明全局变量name ,意味着最上面的name = "Alex Li"即使不写,程序最后面的print也可以打印name
        name = '杜甫'
        print('函数内部:', name)
    
    fun()
    print('函数外部:', name)
    #打印结果:
    #函数内部: 杜甫
    #函数外部: 杜甫
    

    另外补充一个小尾巴:

    names = ['鸣人', '佐助', '小樱']
    
    def change():
        names[0] = '六代目火影'
        print('函数内:', names)
    
    change()
    print('函数外:', names)
    #打印结果:
    #函数内: ['六代目火影', '佐助', '小樱']
    #函数外: ['六代目火影', '佐助', '小樱']
    #内容被改了,因为列表里面存的是内存地址,是可以修改的,类似于,元祖本身不可修改,但是元祖中包含的列表内容是可以修改的。
    

    列表、字典、集合、对象是可以修改的,包括包含列表等类型的元祖。不可修改的有字符串、数字、布尔


    3.函数嵌套

    • 函数内部可以再定义函数,所有函数只要执行必须先调用
    def fun1():
        print('鸣人')
        def fun2():
            print('博人')
        fun2() #fun2 只能在 fun2函数定义后才可以调用
        
    fun1() #fun2 只能在 fun1 中调用,在fun1 外面无法调用
    #鸣人
    #博人
    

    4.作用域

    #python 中 函数就是一个作用域
    age = 18
    def fun1():
        age = 73
        def fun2():
            print(age)
    
        return fun2
    
    
    print(fun1())  # 打印结果:(函数地址)<function fun1.<locals>.fun2 at 0x00000000027A8AE8>
    val = fun1()
    val()  # 打印结果:73  此处打印的部署18,是73,说明代码定义完成后,作用域已生成,作用域链向上查找。
    

    此处打印的部署18,是73,说明代码定义完成后,作用域已生成,作用域链向上查找。

    而不是:把fun2函数返回后,在外面调用,就变成全局的了,内部函数依然在内部执行。


    5.匿名函数

    不需要使用 def 来定义一个函数,直接使用lambda来创建,不能访问自有参数列表之外或全局命名空间的参数。

    f = lambda x, y:x * y  # 声明一个匿名函数
    print(f(2,3)) # 6
    

    以上代码 :前面的 x,y是参数 , : 后面的是返回内容

    • 匿名函数可以与其他函数搭配使用,如filter、map等
    • 程序一次性使用、不需要定义函数名时,匿名函数可以节省内存中变量定义的空间
    • 一般有一行表达式,必须有返回值,但不能有return
    • 可以没有参数,也可以有多个参数,允许参数存在默认值
    #无参匿名函数
    >>> f = lambda:True
    >>> f()
    True
    
    #带参匿名函数
    lambda x: x**3 #一个参数
    lambda x,y,z:x+y+z #多个参数
    lambda x,y=3: x*y #允许参数存在默认值
    
    
    >>> c = lambda x,y=2: x+y #使用了默认值
    >>> c(10) #如果不输入,就使用默认值2
    12
    

    再举个栗子:

    data = range(10)
    print(list(map(lambda x:x*2, data))) #打印结果: [0, 2, 4, 6, 8, 10, 12, 14, 16, 18]
    

    map(func, *iterables) , map会把data中的每个数当做参数,传入 该匿名函数,然后返回,最终会返回一个列表,我们用list() 强制转换一下,转换之前打印出的是 列表的地址。

  • 相关阅读:
    预习十进制数的表示 & 非数值数据的编码表示 & 数据的宽度和储存 & 数据校验码*
    预习原码补码移码
    C语言||作业01 结构:通讯录
    C语言寒假大作战04
    C语言寒假大作战03
    C语言寒假大作战02
    C语言寒假大作战01
    C语言||作业01 结构:通讯录
    C语言寒假大作战04
    C语言寒假大作战03
  • 原文地址:https://www.cnblogs.com/friday69/p/9220000.html
Copyright © 2020-2023  润新知