欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页

python 函数参数和返回值

程序员文章站 2024-03-17 16:35:16
...

检查参数类型

def my_f(x):
    if not isinstance(x, (int, float)):
        raise TypeError('bad operand type')
    # do something

返回多个值

def f():
    nx = 1
    ny = 2
    return nx, ny # 一个tuple
 x, y = f()

默认参数

def f(x, n=2):#默认参数必须放在后边
    s = 1+n
    return s

高级用法

def f(x, n=2,string='string'):#默认参数必须放在后边
    s = 1+n
    return s
f(1,string='1')#可以跳过默认函数

注意点 默认参数必须指向不变对象,如果传递一个可变变量,之后没调用一次函数都会对参数进行不可逆转的修改,这样违背了局部参数的使用主旨。

看下面的例子

def add_end(L=[]):
    L.append('END')
    return L

来看看结果,

>>> add_end([1, 2, 3])
[1, 2, 3, 'END']
>>> add_end(['x', 'y', 'z'])
['x', 'y', 'z', 'END']

好像没有什么部队,如果我们使用默认参数就不对了

>>> add_end()
['END']
>>> add_end()
['END', 'END']
>>> add_end()
['END', 'END', 'END']

这是因为python 世界忠所有的东西都是对象,包括函数也是对象而我们的L只是指向对象[]的一个变量而已,又因为[]是可变对象,所以每次使用默认参数,并修改,之后所有的记录都被保存下来了
详情请查看我的另一篇文章

可变参数

当我们祥传递的参数数量不确定是 可变参数就排上用场了,例如计算累加

def calc(numbers):
    sum = 0
    for n in numbers:
        sum = sum + n * n
    return sum

然后调用

>>>calc([1,2,3])

这样我们可以传进去一个list或者tuple 但是这样每次都要把数据组装成一个list或者tuple 很麻烦传递进去很麻烦。python为我们提供了一个简单的语法支持

def calc(*numbers):##加一个*就变成可变参数了,
    sum = 0
    for n in numbers:
        sum = sum + n * n
    return sum
>>>calc(1,2,3)

如果我们有一个现成的list或tuple想停驾参数的化就会有点麻烦

>>> nums = [1, 2, 3]
>>> calc(nums[0].nums[1],nums[3])
14

不过python 又一次为我们提供了方便的语法支持来传递传递list或tuple给可变参数

>>> nums = [1, 2, 3]
>>> calc(*nums)
14

关键字参数

关键字参数就是加两个*

def f(**kw):
     print( kw)

输出

>>> f(name=100)
{'name': '100'}

可变参数,参数会被组成tuple,而关键字参数会被组装成dict

当然和可变参数一样我们可以在dict 前加两个* 来传递dict给关键字参数

>>>  person = {'name' : '1', 'age' : 12}
>>>f(**person)
{'name': '1', 'age': 12}

命名关键字参数

关键字参数有一个局限,就是在判断参数时候要写大量的if所以就出现了命名关键字参数

def person(name, age, *, city, job):
    print(name, age, city, job)

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

>>> person('Jack', 24, city='Beijing', job='Engineer')
Jack 24 Beijing Engineer

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

def person(name, age, *args, city, job):
>>> person('Jack', 24, 'Beijing', 'Engineer')
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
TypeError: person() takes 2 positional arguments but 4 were given

命名关键字参数必须为传入参数名,不然会报错

命名关键字参数可以有缺省值,从而简化调用:

def person(name, age, *, city='Beijing', job):