Python 快速入门笔记(6):函数

本系列随笔是本人的学习笔记,初学阶段难免会有理解不当之处,错误之处恳请指正。转载请注明出处:https://www.cnblogs.com/itwhite/p/12298001.html

函数定义

示例:

def add(a, b):
    return a + b;

 

默认参数

默认参数必须在必选参数之后,示例:

def foo(a, b, c = 123, d = 'ok'):
    print a, b, c, d
foo(1, 2)       # output: 1 2 123 ok
foo(1, 2, 456)  # output: 1 2 456 ok

 

可变参数:不定参数

定义参数时,在参数名前面加入星号(*)表示可变参数(实际上是以 tuple 的形式实现的),示例:

def calc(operation, *numbers):
    if (operation == 'sum'):
        ret = 0
        for n in numbers:
            ret += n
    elif (operation == 'mul'):
        ret = 1
        for n in numbers:
            ret *= n
    else:
        raise Exception("Invalid operation: " + str(operation))
    return ret;

print calc('sum', 1, 2, 3, 4)   # output: 10
print calc('mul', 1, 2, 3, 4)   # output: 24
print calc('div', 1, 2, 3, 4)   # Exception: Invalid operation: div

另外,python还支持将数组或tuple的内容传给可变参数,此时也需要在数组名(或tuple)前加上星号,例如:

data = [2, 3, 4]
print calc('sum', *data)        # output: 9
print calc('sum', *[2, 3])      # output: 5

 

关键字参数

类似与 perl 中以一个 hash 值(python中称为字典)来接收参数的方式,接收字典参数的参数名前需要加上两颗星(**),示例:

def foo(name, **details):
    print name, details

foo('Jack', age = 23, email = 'jack@gmail.com') # output: Jack {'age': 23, 'email': 'jack@gmail.com'}
foo('Lucy', age = 19, gender = 'female')        # output: Lucy {'gender': 'female', 'age': 19}

注意:这里的字典参数的 key 是任意的,如需要限制能够传入的 key 值,需要用到下文中的“命名关键字参数”。

 

命名关键字参数

perl 中允许使用 Params::Validate 模块中的方法来做参数校验,可以限制参数个数和类型,python中目前还不知道如何以简单的方式限制参数类型,但是限制个数还是可以的:使用星号作为一个参数,后面跟允许传入的参数名,示例:

def foo(name, *, age, gender, email):
    print(name, age, gender, email)

foo('Jack', age = 23, email = 'jack@gmail.com', gender = "male") # Jack 23 male jack@gmail.com
foo('Lucy', age = 19, gender = 'female')        # TypeError: foo() missing 1 required keyword-only argument: 'email'
foo('Bob', age = 19, city = 'New York')         # TypeError: foo() got an unexpected keyword argument 'city'

注意:python 3 才支持这种方式。

 

参数组合

在 Python 中定义函数,可以用必选参数、默认参数、可变参数和关键字参数,这4种参数都可以一起使用,或者只用其中某些,但是请注意,参数定义的顺序必须是:必选参数 => 默认参数 => 可变参数 => 关键字参数,例如:

def foo(a, b = 123, *c, **d):
    print(a, b, c, d)
foo(1)           # (1, 123, (), {})
foo(1, 2, 3, 4)  # (1, 2, (3, 4), {})
foo(1, 2, 3, 4, name = "Jack", age = 23)  # (1, 2, (3, 4), {'age': 23, 'name': 'Jack'})

 

完。

posted @ 2020-02-12 10:19  itwhite  阅读(247)  评论(0编辑  收藏  举报