Python 函数之参数

liftword4个月前 (03-17)技术文章31

定义一个函数非常简单,但是怎么定义一个函数,需要什么参数,怎么去调用却是我们需要去思考的问题。

如同大多数语言一样(如 Java),Python 也提供了多种参数的设定(如:默认值参数、关键字参数、形参等)。使用这些参数定义出来的代码,可以让我们适应不同的开放场景,也能简化我们的代码开发工作。

默认值参数

我们创建一个函数,定义参数中一个或多个赋予默认值后,我们可以使用比允许的更少的参数去调用此函数,举个例子(注意:以下代码都使用 python3.7 版本):

def def_param_fun(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)
        
# 我们可以如下进行调用
def_param_fun('Do you really want to quit?')

def_param_fun('Do you really want to quit?', 2)

def_param_fun('Do you really want to quit?', 2, 'Please, yes or no!')

如上所示,我们可以使用一个或多个参数去调用此函数,我们实际生产中,很多情况下会赋予函数参数默认值的情形,因此,合理使用此种参数形式可以简化我们很多工作量。

重要:使用默认值参数时,如果我们的默认值是一个可变对象时,我们调用函数可能出现不符合我们预期的结果。如下:

def f(a, l=[]):
    l.append(a)
    return l
    
# 此时调用函数
print(f(1))
print(f(2))
print(f(3))

# 返回值
# [1]
# [1, 2]
# [1, 2, 3]

这是由于函数在初始化时,默认值只会执行一次,所以在默认值为可变对象(列表、字典以及大多数类实例),我们可以如下操作:

def f(a, l=None):
    if l is None:
        l = []
    l.append(a)
    return l

# 再次调用函数
print(f(1))
print(f(2))
print(f(3))

# 返回值
# [1]
# [2]
# [3]

可变参数

可变参数也就是我们对于函数中定义的参数是可以一个或多个可以变化的,其中 *args 代表着可以传入一个 list 或者 tuple, **args 代表着可以传入一个 dict。举个例子:

def variable_fun(kind, *arguments, **keywords):
    print("friend : ", kind, ";")
    print("-" * 40)
    for arg in arguments:
        print(arg)
    print("-" * 40)
    for kw in keywords:
        print(kw, ":", keywords[kw])
        
# 函数调用
variable_fun("xiaoming",
             "hello xiaoming", "nice to meet you!",
            mother="xiaoma",
            father="xiaoba",
            son="see you")
            
# 输出结果
first arg:  xiaoming ...
----------------------------------------
hello 
nice to meet you!
----------------------------------------
mother : xiaoma
father : xiaoba
son : see you

我们还可以使用下面的方式进行调用,得到上面相同的结果:

list01 = ["hello xiaoming", "nice to meet you!"]
dict01 = {'mother': 'xiaoma', 'father': 'xiaoba', 'son': 'see you'}
variable_fun("xiaoming", *list01, **dict01)

以上其实是 python 的解包操作,和 java 类似。

关键字参数

关键字参数允许你调用函数时传入0个或任意个含参数名的参数,这样可以让我们灵活的去进行参数的调用。举个例子:

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

# 函数调用  
key_fun(1000)                                          # 1 positional argument
key_fun(voltage=1000)                                  # 1 keyword argument
key_fun(voltage=1000000, action='VOOOOOM')             # 2 keyword arguments
key_fun(action='VOOOOOM', voltage=1000000)             # 2 keyword arguments
key_fun('a million', 'bereft of life', 'jump')         # 3 positional arguments
key_fun('a thousand', state='pushing up the daisies')  # 1 positional, 1 keyword

注意不可以重复传值,否则会报如下错误:

# TypeError: key_fun() got multiple values for argument 'voltage'
key_fun(100, voltage=1000)                             # error

相关文章

python之函数的参数详解

参数传递:1.不可变数据类型:数字number(含int、float、bool、complex)、字符串string、元组tuple。当不可变数据类型被当作函数的参数,传递的是值,函数体内改变值时实际...

真相!Python 默认值参数深度解析,从踩坑到精通的进阶秘籍

一、开发中遇到的问题问题 1:默认值参数为可变对象的陷阱在 Python 开发里,不少初学者会在默认值参数为可变对象时踩坑。比如,我们想定义一个函数,用于向列表中添加元素,代码如下:def add_t...

python函数参数详解

python有两种传参的方式,位置参数和关键字参数位置参数位置参数是基于它们的位置或顺序传递给函数的参数。这些参数是必需的,并且必须按照与函数参数列表匹配的正确顺序提供。以下是一个示例:def gre...

【Python机器学习系列】使用Hyperopt搜索随机森林模型最优超参数

这是我的第342篇原创文章。一、引言Hyperopt是一个强大的python库,用于超参数优化,由jamesbergstra开发。Hyperopt使用贝叶斯优化的形式进行参数调整,允许你为给定模型获得...

Python编程:函数参数定义与传递方式知多少?就这几条

0 前言前期文章中介绍了函数的定义语法、参数及组合形式以及返回值和调用传参机制(按值方式和按引用方式)。本文将进一步探讨函数传参的细节实现方式。在对有参数的函数进行调用(包括内置函数和用户定义函数)时...