1.定义函数
定义一个函数要使用def语句,依次写出函数名、括号、括号中的参数和冒号:,然后,在缩进块中编写函数体,函数的返回值用return语句返回。例:
def my_abs(x):
if x >= 0:
return x
else:
return -x
空函数:
def nop():
pass
pass语句什么也不做,可做为占位符
2.函数参数
A. 默认参数
参数设置支持默认参数,即在调用函数的时候,如果没有输入有默认值的参数,函数依旧可以执行。
def power(x, n=2):
s = 1
while n > 0:
n = n - 1
s = s * x
return s
如上面定义的函数,如果调用时写 power(3), 默认做的是平方。
注意事项:
一 必选参数在前,默认参数在后
二 如何设置默认参数。
三 默认参数必须指向不变对象!
下面举例说明第三点
在设置默认参数的时候,要注意,如果默认值为L=[],函数内又改变了它的值,如在尾部添加END,那么下次调用,会在这基础上再添加END,就有bug。例:
def add_end(L=[]):
L.append('END')
return L
>>> add_end()
['END']
>>> add_end()
['END', 'END']
因为Python函数在定义的时候,默认参数L的值就被计算出来了,即[],因为默认参数L也是一个变量,它指向对象[],每次调用该函数,如果改变了L的内容,则下次调用时,默认参数的内容就变了,不再是函数定义时的[]了。
改进:
def add_end(L=None):
if L is None:
L = []
L.append('END')
return L
B. 可变参数
如果要想参数个数可以改变,第一想法是参数是list或tuple类型,则调用函数的时候,需要以list或tuple的形式传入。
def calc(numbers):
sum = 0
for n in numbers:
sum = sum + n * n
return sum
>>> calc([1, 2, 3])
14
>>> calc((1, 3, 5, 7))
84
利用可变参数就可以直接将数字传入,具体改进为,在参数前加 * ,例子见下:
def calc(*numbers):
sum = 0
for n in numbers:
sum = sum + n * n
return sum
>>> calc(1, 2)
5
>>> calc()
0
这里的调用就无需再组成list再调用,如果输入参数是列表,也无需一个一个输入,可以这样调用:
>>> nums = [1, 2, 3]
>>> calc(*nums)
14
C. 关键字参数
关键字参数允许传入0个或任意个含参数名的参数,这些关键字参数在函数内部自动组装为一个dict。
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'}
函数内对kw进行改动,不会改变函数外的。
命名关键字参数
如果要限制关键字参数的名字,就可以用命名关键字参数,
命名关键字参数需要一个特殊分隔符*,*后面的参数被视为命名关键字参数
def person(name, age, *, city, job):
print(name, age, city, job)
>>> person('Jack', 24, city='Beijing', job='Engineer')
Jack 24 Beijing Engineer
调用时,命名关键字参数必须传入参数名。即city,job
。
D. 参数类型检查:
可以在函数内对参数类型进行检查,以便出错时候方便查看出错信息。
def my_abs(x):
if not isinstance(x, (int, float)):
raise TypeError('bad operand type')
if x >= 0:
return x
else:
return -x
数据类型检查可以用内置函数isinstance()
函数介绍:
isinstance(obj, class_or_tuple, /)
Return whether an object is an instance of a class or of a subclass thereof.
A tuple, as in ``isinstance(x, (A, B, ...))``, may be given as the target to
check against. This is equivalent to ``isinstance(x, A) or isinstance(x, B)
or ...`` etc.
3.调用函数
Tip: 可以使用 help(函数名) 看帮助信息。
部分常用函数:abs(); max(); hex(); int();类型转换
—————————————————
本学习笔记很多例子引用于廖雪峰的网站。