zoukankan      html  css  js  c++  java
  • Python--函数参数类型、用法及代码示例

    在编程语言里,将一个个功能定义成函数,能够进行反复调用,而不是每次都重复相同的代码,这种方式能够大幅度降低代码的复杂度。

    函数的好处:

    1.代码重用

    2.保持一致性

    3.可扩展性

    1.基础

    我们定义函数的时候可以带参数,也可以不带参数,可以有返回值,也可以没有返回值(没有返回值时默认为None)。当返回值有多个时,python以元祖的方式返回。

    #不带参数、无返回值的函数
    def func1():
        print("This is a function!")
    
    #带参数、无返回值的函数,参数a,b是函数的位置参数
    def func2(a,b):
        print("Result:", a*b)
    
    #有返回值的函数
    def func3(a,b):
        print("Result:", a*b)
        return a*b

    在调用函数的时候要按顺序传入参数,调用格式及输出结果:

    >>>func1()
    This is a function!
    >>>func2(2,3)
    Result:6
    >>>r = func3(2,3)
    Result:6

    我们在定义函数时,有时候某个参数经常是同一个值,这时我们可以将这样的参数设置为默认参数。比如函数功能是计算一个数的任意次幂,我们用得非常多的是平方,这时我们可以将幂的这个参数设置为默认为2,那么如果是计算平方,在调用函数的时候这个参数就可以不传。当函数有多个参数时,一般把变化大的参数放前面,变化小的参数放后面。变化小的参数就可以作为默认参数。

    #n是默认参数,默认是2
    def func4(x,n=2):
        r = 1
        for i in range(n):
            r = r * x
        print(r)

    对于默认参数,调用的时候如果不传参数,那么就是默认值;如果传参数,可以直接传值,也可以写成定义的格式:参数=值

    >>>func4(3)
    9
    >>>func4(3,4)
    81
    >>>func4(3,n=4)
    81

    2.可变参数

    对于上述提到的位置参数,在调用的时候必须传入固定数目的参数。而我们经常遇到例如求若干个数的乘积等问题,事先可能不确定参数的个数。这时我们可以定义可变参数,即参数的个数是不固定的,可以是0,1,2或者任意个。

    如计算一组数的乘积,我们可以先将这组数组成list或tuple类型,调用函数。

    #numbers可以是list或者tuple,元素的个数是任意的
    def func5(numbers):
        if len(numbers):
            r = 1
            for i in numbers:
                r *= i
            print(r)
        else:
            print(None)
    >>>func5([1,2,3,4,5])
    120
    >>>func5((1,2,3,4,5))
    120
    >>>func5([])
    None
    >>>func5(())
    None

    上面的参数需要是list或者tuple,那么怎样能够简化成形如:func5(1,2,3,4,5)的格式调用呢?

    答案是:通过在定义时的参数前面加上*,代码不需要做任何改动。

    那么这个时候参数接收的是一个tuple

    我们在func5的numbers参数前面加上*号,定义为func6,即func6(*numbers)。这时可以简化参数形式。对于本来是list或tuple类型的变量,调用函数时在变量前对应加*号即可把list或tuple的元素变成可变参数传进去。

    >>>func6(1,2,3,4,5)
    120
    >>>func6()
    None
    >>>num = [1,2,3,4,5]#定义一个列表
    >>>func6(*num)
    120
    >>>func6(*num[:2])#还可以对列表切片
    2

    3.关键字参数

    我们在注册账号填资料的时候,有的选项是可选的,那么对于开发人员来说,不填的这些变量就是None,且个数不确定。诸如这种情况下,有一种关键字参数能派上用场。关键字参数允许传入0个或任意个含参数名的参数,这些关键字参数在函数内部自动组装为一个dict。关键字参数一般用**kw定义,参数名可自定义,但是习惯用这个,我们就用这个。

    #关键字参数
    def func7(name, age, **kw):
        print('name:', name, 'age:', age, 'other:', kw)

    调用时可以传入任意个数的关键字参数,将一个dict类型变量作为关键字参数时,在变量前加**即可。

    >>>func7('Michael', 30)
    name: Michael age: 30 other: {}
    >>>func7('Michael', 30, city='Beijing')
    name: Michael age: 30 other: {'city': 'Beijing'}
    >>>func7('Michael', 30, city='Beijing', job='teacher')
    name: Michael age: 30 other: {'city': 'Beijing', 'job': 'teacher'}
    
    >>>per1 = {'city':'Beijing', 'job':'teacher'}
    >>>func7('Michael', 30, **per1)
    name: Michael age: 30 other: {'city': 'Beijing', 'job': 'teacher'}

    4.命名关键字参数

    关键字参数,函数调用时可以传入任意不受限制的关键字参数。至于到底传入了哪些,就需要在函数内部对kw进行检查。如果需要指定或限制传入参数的参数名,那么要用到命名关键字参数,顾名思义,就是对关键字参数进行命名。例如只接收姓名和年龄。

    和关键字参数**kw不同,命名关键字参数需要一个特殊分隔符*号,*号后面的参数被视为命名关键字参数。

    #*号后面的参数就是命名关键字参数
    def func8(name, age, *, city, job):
        print(name, age, city, job)

    键字参数必须要传入  参数名=  ,来指定参数,否则就会报错。

    >>>func8('Jack', 24, city='Beijing', job='Engineer')
    Jack 24 Beijing Engineer
    >>>person('Jack', 24, city='Beijing', job='Engineer', sex='meal')
    报错,不能传入除命名关键字参数以外的参数

    如果函数定义中已经有了一个可变参数,后面跟着的命名关键字参数就不再需要一个特殊分隔符*了。

    #*args是可变参数,因此后面的关键字参数city, job就不需要特殊分隔符*号了
    def func9(name, age, *args, city, job):
        print(name, age, *args, city, job)
    <<<func9('Jack', 24, 'placehold', city='Beijing', job='Engineer')
    Jack 24 placehold Beijing Engineer
    <<<func9('Jack', 24, city='Beijing', job='Engineer')
    Jack 24 Beijing Engineer

    这里涉及到参数的组合,那么定义参数有一个顺序:位置参数、可变参数、命名关键字参数、关键字参数。

    好好理解下面的两个函数的调用方式和结果。

    #位置参数、默认参数、可变参数、关键字参数组合
    def f1(a, b, c=0, *args, **kw):
        print('a =', a, 'b =', b, 'c =', c, 'args =', args, 'kw =', kw)
    
    #位置参数、默认参数、命名关键字参数、关键字参数组合
    def f2(a, b, c=0, *, d, **kw):
        print('a =', a, 'b =', b, 'c =', c, 'd =', d, 'kw =', kw)
    >>>f1(1, 2)
    a = 1 b = 2 c = 0 args = () kw = {}
    >>>f1(1, 2, 3)
    a = 1 b = 2 c = 3 args = () kw = {}
    >>>f1(1, 2, 'placehold')
    a = 1 b = 2 c = placehold args = () kw = {}
    >>>f1(1, 2, 3, 'placehold')
    a = 1 b = 2 c = 3 args = ('placehold',) kw = {}
    >>>f1(1, 2, x='%')
    a = 1 b = 2 c = 0 args = () kw = {'x': '%'}
    >>>f1(1, 2, x='%', y='&')
    a = 1 b = 2 c = 0 args = () kw = {'x': '%', 'y' :'&'}
    >>>f1(1, 2, 'a', 'b', x='%', y='&')
    a = 1 b = 2 c = a args = ('b',) kw = {'x': '%', 'y' :'&'}
    >>>f1(1, 2, 3, 'a', 'b', x='%', y=None)
    a = 1 b = 2 c = 3 args = ('a', 'b') kw = {'x': '%', 'y': None}
    
    #还可以通过一个tuple和dict
    >>>args = (1, 2, 3, 4)
    >>>kw = {'d': 99, 'x': '#'}
    >>>f1(*args, **kw)
    a = 1 b = 2 c = 3 args = (4,) kw = {'d': 99, 'x': '#'}
    >>>args = (1, 2, 3)
    >>>f1(*args, **kw)
    a = 1 b = 2 c = 3 args = () kw = {'d': 99, 'x': '#'}
    >>>f2(*args, **kw)
    a = 1 b = 2 c = 3 d = 99 kw = {'x': '#'}
  • 相关阅读:
    编译duilib遇到问题:Error C2371 "IDispatchEx重定义;不同的基类型"
    初尝DirectUI
    ms-onlinetest-question02
    ms-onlinetest-question3
    都是申请空间后不赋初值惹的祸..
    CString接受返回的char*字符串后成为乱码
    CL.exe @C:Users upAppDataLocalTemp mpc8fc399365e34f739eff6191a0c9acde.rsp”。存储控制块地址无效
    Visual Studio Ultimate 2012 静态激活密钥
    如何写入和获取软件的版本信息(VS环境下)
    mt.exe : general error c101008a: Failed to save the updated manifest to the file "DebugResource.dll.embed.manifest". Bpo
  • 原文地址:https://www.cnblogs.com/taotingz/p/11329771.html
Copyright © 2011-2022 走看看