Python定义函数(待整理)
定义函数:
格式:在Python中,定义⼀个函数要使⽤def语句,依次写出函数名、括号、括号中的参数和冒号:,然后,在缩进块中编写函数体,函数的返回值⽤return语句返回。
调⽤函数
数据类型检查
数据类型检查可以⽤内置函数isinstance()
def my_abs(x):
if not isinstance(x, (int, float)):
raise TypeError('bad operand type')
if x >= 0:
return x
else:
return -x
返回多个值:返回值是⼀个tuple,但是,在语法上,返回⼀个tuple可以省略括号
import math
def move(x, y, step, angle=0):
nx = x + step * s(angle)
ny = y - step * math.sin(angle)
return nx, ny
>>> x, y = move(100, 100, 60, math.pi / 6)
>>> print(x, y)
151.96152422706632 70.0
但其实这只是⼀种假象,Python函数返回的仍然是单⼀值:
>>> r = move(100, 100, 60, math.pi / 6)
>>> print(r)
(151.96152422706632, 70.0)
位置参数、默认参数必选参数在前,默认参数在后
默认参数必须指向不变对象!
可变参数
def calc(*numbers):
sum = 0
for n in numbers:
sum = sum + n * n
return sum
定义可变参数和定义⼀个list或tuple参数相⽐,仅仅在参数前⾯加了⼀个*号。在函数内部,参数numbers接收到的是⼀个tuple,因此,函数代码完全不变。但是,调⽤该函数时,可以传⼊任意个参数,包括0个参数:
>>> calc(1, 2)
5
>>> calc()
Python允许你在list或tuple前⾯加⼀个*号,把list或tuple的元素变成可变参数传进去:
>>> nums = [1, 2, 3]
>>> calc(*nums)
14
*nums表⽰把nums这个list的所有元素作为可变参数传进去。这种写法相当有⽤,⽽且很常见。
关键字参数
def person(name, age, **kw):
print('name:', name, 'age:', age, 'other:', kw)
>>> extra = {'city': 'Beijing', 'job': 'Engineer'}
>>> person('Jack', 24, **extra)
name: Jack age: 24 other: {'city': 'Beijing', 'job': 'Engineer'}
**extra表⽰把extra这个dict的所有key-value⽤关键字参数传⼊到函数的**kw参数,kw将获得⼀个dict,注意kw获得的dict是extra的⼀份拷贝,对kw的改动不会影响到函数外的extra
命名关键字参数
对于关键字参数,函数的调⽤者可以传⼊任意不受限制的关键字参数。⾄于到底传⼊了哪些,就需要在函数内部通过kw检查。
仍以person()函数为例,我们希望检查是否有city和job参数:
def person(name, age, **kw):
if 'city' in kw:
# 有city参数
pass
if 'job' in kw:
# 有job参数
pass
print('name:', name, 'age:', age, 'other:', kw)
python新手函数函数的参数
阅读: 604997
定义函数的时候,我们把参数的名字和位置确定下来,函数的接⼝定义就完成了。对于函数的调⽤者来说,只需要知道如何传递正确的参数,以及函数将返回什么样的值就够了,函数内部的复杂逻辑被封装起来,调⽤者⽆需了解。
Python的函数定义⾮常简单,但灵活度却⾮常⼤。除了正常定义的必选参数外,还可以使⽤默认参数、可变参数和关键字参数,使得函数定义出来的接⼝,不但能处理复杂的参数,还可以简化调⽤者的代码。
位置参数
我们先写⼀个计算x2的函数:
def power(x):
return x * x
对于power(x)函数,参数x就是⼀个位置参数。
当我们调⽤power函数时,必须传⼊有且仅有的⼀个参数x:
>>> power(5)
25
>>> power(15)
225
现在,如果我们要计算x3怎么办?可以再定义⼀个power3函数,但是如果要计算x4、x5……怎么办?我们不可能定义⽆限多个函数。
你也许想到了,可以把power(x)修改为power(x, n),⽤来计算xn,说⼲就⼲:
def power(x, n):
s = 1
while n > 0:
n = n - 1
s = s * x
return s
对于这个修改后的power(x, n)函数,可以计算任意n次⽅:
>>> power(5, 2)
25
>>> power(5, 3)
125
修改后的power(x, n)函数有两个参数:x和n,这两个参数都是位置参数,调⽤函数时,传⼊的两个值按照位置顺序依次赋给参数x和n。
默认参数
新的power(x, n)函数定义没有问题,但是,旧的调⽤代码失败了,原因是我们增加了⼀个参数,导致旧的代码因为缺少⼀个参数⽽⽆法正常调⽤:
>>> power(5)
Traceback (most recent call last):
File "<stdin>", line 1, in <module>
TypeError: power() missing 1 required positional argument: 'n'
Python的错误信息很明确:调⽤函数power()缺少了⼀个位置参数n。
这个时候,默认参数就排上⽤场了。由于我们经常计算x2,所以,完全可以把第⼆个参数n的默认值设定为2:
def power(x, n=2):
s = 1
while n > 0:
n = n - 1
s = s * x
return s
这样,当我们调⽤power(5)时,相当于调⽤power(5, 2):
>>> power(5)
25
>>> power(5, 2)
25
⽽对于n > 2的其他情况,就必须明确地传⼊n,⽐如power(5, 3)。
从上⾯的例⼦可以看出,默认参数可以简化函数的调⽤。设置默认参数时,有⼏点要注意:
⼀是必选参数在前,默认参数在后,否则Python的解释器会报错(思考⼀下为什么默认参数不能放在必选参数前⾯);
⼆是如何设置默认参数。
当函数有多个参数时,把变化⼤的参数放前⾯,变化⼩的参数放后⾯。变化⼩的参数就可以作为默认参数。
使⽤默认参数有什么好处?最⼤的好处是能降低调⽤函数的难度。
举个例⼦,我们写个⼀年级⼩学⽣注册的函数,需要传⼊name和gender两个参数:
def enroll(name, gender):
print('name:', name)
print('gender:', gender)
这样,调⽤enroll()函数只需要传⼊两个参数:
>>> enroll('Sarah', 'F')
name: Sarah
gender: F
如果要继续传⼊年龄、城市等信息怎么办?这样会使得调⽤函数的复杂度⼤⼤增加。
我们可以把年龄和城市设为默认参数:
def enroll(name, gender, age=6, city='Beijing'):
print('name:', name)
print('gender:', gender)
print('age:', age)
print('city:', city)
这样,⼤多数学⽣注册时不需要提供年龄和城市,只提供必须的两个参数:
>>> enroll('Sarah', 'F')
name: Sarah
gender: F
age: 6
city: Beijing
只有与默认参数不符的学⽣才需要提供额外的信息:
enroll('Bob', 'M', 7)
enroll('Adam', 'M', city='Tianjin')
可见,默认参数降低了函数调⽤的难度,⽽⼀旦需要更复杂的调⽤时,⼜可以传递更多的参数来实现。⽆论是简单调⽤还是复杂调⽤,函数只需要定义⼀个。
有多个默认参数时,调⽤的时候,既可以按顺序提供默认参数,⽐如调⽤enroll('Bob', 'M', 7),意思是,除了name,gender这两个参数外,最后1个参数应⽤在参数age上,city参数由于没有提供,仍然使⽤默认值。
也可以不按顺序提供部分默认参数。当不按顺序提供部分默认参数时,需要把参数名写上。⽐如调⽤enroll('Adam', 'M', city='Tianjin'),意思是,city参数⽤传进去的值,其他默认参数继续使⽤默认值。
默认参数很有⽤,但使⽤不当,也会掉坑⾥。默认参数有个最⼤的坑,演⽰如下:
先定义⼀个函数,传⼊⼀个list,添加⼀个END再返回:
def add_end(L=[]):
L.append('END')
return L
当你正常调⽤时,结果似乎不错:

版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系QQ:729038198,我们将在24小时内删除。