1.调用函数
调用abs函数(取绝对值,有且仅有一个参数):
>>> abs(100)
100
>>> abs(-20)
20
>>> abs(12.34)
12.34
2.定义函数
定义函数使用def语句,依次写出函数名、括号、括号中的参数、冒号,在缩进块中写函数体,用return语句返回值。
def my_abs(x):
if x >= 0:
return x
else:
return -x
print(my_abs(-99))
用pass语句定义空函数:
def nop():
pass
isinstance()对参数进行数据类型检查:
def my_abs(x):
if not isinstance(x, (int, float)):
raise TypeError('bad operand type')
if x >= 0:
return x
else:
return -x
注意:函数执行完毕也没有return
语句时,自动return None;
函数可以同时返回多个值,但其实就是一个tuple
3.函数的参数
(1)位置参数
计算x的2次方的函数:
def power(x):
return x * x
对于power(x)函数,参数x就是一个位置参数。
若要计算x的3次方、4次方、5次方.......就需要把power(x)改为power(x,n)
(x,n这两个参数都是位置参数)
def power(x, n):
s = 1
while n > 0:
n = n - 1
s = s * x
return s
>>> power(5, 2)
25
>>> power(5, 3)
125
(2)默认参数
默认参数必须指向不变对象!!!
def power(x, n=2):
s = 1
while n > 0:
n = n - 1
s = s * x
return s
(3)可变参数
在参数前加 * 在函数内部 参数numbers接收到的是一个tuple 调用该函数时 可以传入任意个参数(甚至0个)
def calc(*numbers):
sum = 0
for n in numbers:
sum = sum + n * n
return sum
>>> calc(1, 2)
5
>>> calc()
0
如果已经有一个list或tuple 调用一个可变参数 就需要这么调用:
>>> nums = [1, 2, 3]
>>> calc(nums[0], nums[1], nums[2])
14
不过最好还是在list或tuple前加* 直接把list或tuple的元素变成可变参数传过去:
>>> nums = [1, 2, 3]
>>> calc(*nums)
14
(4)关键字参数
可变参数允许传入0个或任意个参数,在函数调用时自动组装成一个tuple(元组(1,2,3));
关键字参数允许传入0个或任意个含参数名的参数,在函数调用时自动组装成一个dict({'Michael': 95, 'Tracy': 85})
def person(name, age, **kw):
print('name:', name, 'age:', age, 'other:', kw)
函数person除了必选参数name和age之外,还接受关键字参数kw(调用时可以只传必选参数)
>>> person('Michael', 30)
name: Michael age: 30 other: {}
**extra表示把extra这个dict的所有的key-value用关键字参数传入到**kw参数,kw将获得一个dict,对kw的改动不会影响到函数外的extra
>>> extra = {'city': 'Beijing', 'job': 'Engineer'}
>>> person('Jack', 24, **extra)
name: Jack age: 24 other: {'city': 'Beijing', 'job': 'Engineer'}
(5)命名关键字参数
若要限制关键字参数的名字 就可以用命名关键字参数(如:只接受city和job作为关键字参数):
def person(name, age, *, city, job):
print(name, age, city, job)
命名关键字参数需要 * 分隔符 ,* 后边的参数被视为命名关键字参数
def person(name, age, *, city, job):
print(name, age, city, job)
如果函数定义中已经有了一个可变参数,后边跟着的命名关键字参数就不再需要一个特殊分隔符 * 了
def person(name, age, *args, city, job):
print(name, age, args, city, job)
(6)参数组合
以 上几种参数在函数定义时可以组合使用;
但参数定义的顺序必须是:必选参数、默认参数、可变参数、命名关键字参数和关键字参数
4.递归函数
函数在其内部调用自己,就是递归函数
5.总结几点:
1. 默认参数用不可变对象
2. *args
是可变参数,args接收的是一个tuple;
3. **kw
是关键字参数,kw接收的是一个dict。
4. 可变参数既可以直接传入:func(1, 2, 3)
,又可以先组装list或tuple,再通过*args
传入:func(*(1, 2, 3))
;
5.关键字参数既可以直接传入:func(a=1, b=2)
,又可以先组装dict,再通过**kw
传入:func(**{'a': 1, 'b': 2})
。