一、概述
python和其他高级语言一样,支持函数
注意和scala不一样,结果必须使用return,否则默认return None!这和scala最后一个值作为返回是不一样的!
二、函数调用
和其他语言一样,写出函数名,传入合适的参数即可,例如调用内置函数abs:
>>> abs(-1)1
函数支持别名:
>>> a = abs # 变量a指向abs函数>>> a(-1) # 所以也可以通过a调用abs函数1
如果传入了错误的参数,Python会报TypeError错误
数据类型在Python中的转换可以通过相关的函数:
>>> int('1')1>>> str(1)'1'
三、函数定义
定义也是使用和scala一致的def关键字:
def fun1(x): if x > 0: print('正数') return x else: print('负数') return -x
如果什么都不做,那就用pass(如果返回空,使用return None)
def nop(): pass
由python这个函数定义也能知道,Python只能给我们做参数个数的检查,参数类型无法检查。要检查参数,只能通过手动编码使用instance实现:
def my_abs(x): if not isinstance(x, (int, float)): raise TypeError('bad operand type') if x >= 0: return x else: return -x
并且,在Python这类有tuple的语言中,是可以返回多个值的!
def fun1(x,y): if x > 0: return x,y else: return x,y
a,b = fun1(1,2)
当然,内在的是返回了一个tuple,只是返回值可以省略这个()来显示表明这是一个tuple
默认参数: 定义带有默认参数的函数时,注意默认参数必须放在后面且必须是不可变对象!
def fun1(x,y=1): if x > 0: return x+y else: return x-y
可变参数
在参数前面加一个星号*即可,内部使用的是一个tuple包装的
def calc(*numbers): sum = 0 for n in numbers: sum = sum + n * n return sum
如果要使用list或者tuple作为可变参数,类似calc(list[0],list[1]),可以使用*进行参数转换:
calc(*list)
关键字参数
在参数前面加两个星号**即可,内部会把这个关键字参数转换为dict(也就是map)
def person(name, age, **kw): print('name:', name, 'age:', age, 'other:', kw)
>>> person('Bob', 35, city='Beijing')name: Bob age: 35 other: { 'city': 'Beijing'}>>> person('Adam', 45, gender='M', job='Engineer')name: Adam age: 45 other: { 'gender': 'M', 'job': 'Engineer'}
//内部接收的dict是外部的副本,不会对传入的作改变
命名关键字参数(Python3独有)
在参数中使用*作为一个分隔符即可,这样可以对传入的关键字参数作命名检查,只能传入指定名字的关键字参数
def person(name, age, *, city, job): print(name, age, city, job)
这样,就可以对入参作命名检查了,只能传入city=xx,job=xx:
person('Jack', 24, city='Beijing', job='Engineer')
多种参数组合时,顺序必须严格控制:
必选参数、默认参数、可变参数、命名关键字参数和关键字参数。四、递归函数
和其他语言的递归函数是类似的:
def fact(n): if n==1: return 1 return n * fact(n - 1)