python 函数参数和返回值

检查参数类型

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):
  
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值