• 10_Python函数方法默认参数_Python编程之路


    上节课已经简单的跟大家讲了如何定义一个方法,但是并没有深入去讲,这一节我们继续来学习定义方法中需要注意的几点

    默认参数

     前面我们讲到定义一个方法时是可以传递参数的,除了这个功能,实际上python在定义方法时还可以自己预先定义一些参数,这些参数一般被称为默认参数(Default Argument Value)

    参数赋值

    比如下面一个官方的例子

    def ask_ok(prompt, retries=4, reminder="Please try again"):
       ...:     while True:
       ...:         ok = input(prompt)
       ...:         if ok in ('y', 'ye', 'yes'):
       ...:             return True
       ...:         if ok in ('n', 'no', 'nop', 'nope'):
       ...:             return False
       ...:         retries = retries - 1
       ...:         if retries < 0:
       ...:             raise ValueError("invalid user response")
       ...:         print(reminder)

    首先在定义方法的时候传了三个参数

    其中retriesremider都传了默认的参数

    下面通过几种形式调用这个方法

    传递一个参数

    ask_ok('Do you really want to quit?') 
    

     因为只传递了一个参数,而这个参数的形式参数就是prompt,另外两个参数因为已经有了默认的值,所以这时候程序并不会报错

    传递两个参数

    ask_ok('OK to overwrite the file?', 2) 
    

     第二次调用我们传了两个参数,这时解释器会自动根据参数的顺序来赋实参,第一个传给没有默认值的prompt,第二个按照顺序赋值给了第二个形式参数,也就是retries,最后一个形式参数因为有默认值所以不会包错

    传递所有参数

    ask_ok('OK to overwrite the file?', 2, 'Come on, only yes or no!') 
    

     这个相信不用解释了吧,按照顺序传递实参

    变量赋初值

    除了在定义方法时给参数赋准确的值以外,你还可以指定一个变量,作为 参数的值

    例如以下代码

    In [6]: i = 6
    
    In [7]: def func(arg=i):
       ...:     print(arg)
       ...:
    
    In [8]: i = 7
    
    In [9]: func()
    6
    

      

    在开始的时候定义一个变量i,然后直接在方法中指定参数为i,最后修改了i的值,最终输出的修改后的i的值

    可变类型作为参数

    在这里要注意一下,当你定义方法时传的是一个可变的参数时,例如列表、字典时,会有一点不同

    例如以下代码

    In [10]: def func(a, L=[]):
        ...:     L.append(a)
        ...:     return L
        ...:
    
    In [11]: print(func(1))
    [1]
    
    In [12]: print(func(2))
    [1, 2]
    
    In [13]: print(func(3))
    [1, 2, 3]
    

      

    参数的值并不会被初始话(也就是消除),会有一个内存区域专门存放这一部分的值

    如果你不想保留存在的值

    这时你就可以使用以下方法来解决这个问题

    In [14]: def func(a, L=None):
        ...:     if L is None:
        ...:         L = []
        ...:     L.append(a)
        ...:     return L
    

      

    关键字参数(Keyword argument)

    关键字参数,也可以看作是一个键值对应的参数类型,也就是前面讲的字典类型

    你可以通过关键字参数传递很多需要的信息

    同时你也可以在后面调用方法时对它进行更改

    例如下面一行代码,定义一个方法

    def parrot(voltage, state='a stiff', action='voom', type='Norwegian Blue'): 
        print("-- This parrot wouldn't", action, end=' ') 
        print("if you put", voltage, "volts through it.") 
        print("-- Lovely plumage, the", type) 
        print("-- It's", state, "!")
    

      

    在传递参数时需要注意以下几点

    parrot(1000) # 按照位置传递实参
    parrot(voltage=1000) # 按照参数名传递参数
    parrot(voltage=1000000, action='VOOOOOM') #  按照参数名传递参数
    parrot(action='VOOOOOM', voltage=1000000) #  按照参数名传递参数
    parrot('a million', 'bereft of life', 'jump') # 按照位置传递参数
    parrot('a thousand', state='pushing up the daisies') # 一个位置参数,一个参数名称
    

      

    但需要注意以下几点

    1. 没有赋初值的参数,不能直接略过
    2. 在传递覆盖默认值参数时,一定要记得加上关键字
    3. 不能重复传递参数
    4. 不能传递定义方法中没有的关键字参数

    有时候,你可能并不知道穿进来的参数有多少个,这时你就可以把多出来的参数,存为一个列表,或是一个字典,这个是经常用的

    比如我们下面定义一个方法

    In [15]: def cheeseshop(kind, *args, **kwargs):
        ...:     print("-- Do you have any", kind, "?")
        ...:     print("--I'm sorry, we're all out of", kind)
        ...:     for arg in args:
        ...:         print(arg)
        ...:     print("-"*40)
        ...:     for kw in kwargs:
        ...:         print(kw, ":", kwargs[kw])
        ...:
    
    In [16]: cheeseshop("Limburger", "It's very runny, sir.", "It's really very, VERY runny, sir.", shopkeeper="Michael Pal
        ...: in", client="John Cleese", sketch="Cheese Shop Sketch")
    -- Do you have any Limburger ?
    --I'm sorry, we're all out of Limburger
    It's very runny, sir.
    It's really very, VERY runny, sir.
    ----------------------------------------
    shopkeeper : Michael Palin
    client : John Cleese
    sketch : Cheese Shop Sketch
    

      

    注意列表参数是*开头的,字典参数是**开头的

    苏十三博客网站 www.susmote.com

  • 相关阅读:
    面向过程, 面向对象, 类和对象, 类与数据类型
    python函数
    简单的登录注册函数
    Java遍历包中所有类
    spring boot jar启动
    过期算法
    负载均衡算法
    spring boot druid mybatis多数据源
    多线程wait和notify实现1212
    多线程售票
  • 原文地址:https://www.cnblogs.com/susmote/p/8877580.html
Copyright © 2020-2023  润新知