python—函数
函数
常用
参数数量不对 TypeError错误
参数类型错误,TypeError的错误,并且给出错误信息
int()转换为int类型
float()
bool()
str()
函数名为一指向函数对象的引用,可以将变量指向函数,再调用
1
2
3abs # 变量a指向abs函数 a =
1) # 所以也可以通过a调用abs函数 a(-
1
定义函数
示例
1
2
3
4
5def my_abs(x):
if x >= 0:
return x
else:
return -xdef 函数名(参数) :
函数体
return没有return 则返回 None
import 包含模块,java一样
空函数 pass 语句.
1
2def nop():
pass示例 返回多个参数
1
2
3
4
5
6import math
def move(x, y, step, angle=0):
nx = x + step * math.cos(angle)
ny = y - step * math.sin(angle)
return nx, ny返回的是一个tuple … 按位置赋值给变量
函数参数
- 参数定义的顺序必须是:必选参数、默认参数、可变参数、命名关键字参数和关键字参数
默认参数
示例:
1
2
3
4def power(x, n=2):
...
power(5) power(5, 2) power(n=3,5)默认参数必须指向不变对象
多个参数时,变化大的参数在前,变化小的参数在后。变化小的参数就可以作为默认参数。
多个默认参数,可以按顺序提供默认参数
也可以不按顺序提供。当不按顺序提供部分默认参数时,需要把参数名写上
enroll('Adam', 'M', city='Tianjin')
坑
- 默认参数 不可变性 每次调用均会改变其值.
可变参数
示例:
1
2
3
4
5
6
7
8
9def calc(*numbers):
sum = 0
for n in numbers:
sum = sum + n * n
return sum
nums = [1, 2, 3]
calc(*nums) #相同
calc(1, 2, 3)传入的参数个数可变,传入组装成了tuple
当作c语言指针吧😂 传入数组的地址
命名关键字参数
示例:
1
2
3
4def person(name, age, *, city, job):
print(name, age, city, job)
person('Jack', 24, city='Beijing', job='Engineer')命名关键字参数需要一个特殊分隔符*,*后面的参数被视为命名关键字参数
函数定义中已经有了一个可变参数,后面跟着的命名关键字参数就不再需要一个特殊分隔符*
1
2def person(name, age, *args, city, job):
print(name, age, args, city, job)如果没有可变参数,就必须加一个作为特殊分隔符。如果缺少,Python解释器将无法识别位置参数和命名关键字参数
关键字参数
示例
1
2
3
4
5
6
7
8def person(name, age, **kw):
print('name:', name, 'age:', age, 'other:', kw)
extra = {'city': 'Beijing', 'job': 'Engineer'}
person('Jack', 24, city=extra['city'], job=extra['job'])
#相同
extra = {'city': 'Beijing', 'job': 'Engineer'}
person('Jack', 24, **extra)关键字参数在函数内部组装为一个dict
函数内部获得是 dict的拷贝,修改对原值无影响.
可以传入任意不受限制的关键字参数
递归函数
- python 不含尾递归优化,注意层级,否则非常容易堆栈溢出.