检查参数类型
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):