今天我们来聊聊python里的函数。要注意的地方其实挺多的,一点点慢慢梳理。
首先,让我们来看看python的函数长什么样?
定义
# 定义一个函数 def my_func(a): a += 1 return a
注意函数的开头用的是def 而不是其他语言的function,第一行的结尾有个冒号,然后这里还要注意一个就是函数式没有{}这种括号的,python怎么去判断语句是否属于这个函数呢?它是用缩进来判断的,所以在写的时候注意好缩进。
这个函数里面具体的内容,这边不详细说,后面会说到。
调用
# 调用函数 print(my_func(2))
调用非常简单。
但是需要注意的是,如果参数的数量不对,运行的时候会报错。
返回值
返回值可以有一个、多个,也可以没有。
返回值为1个的时候就不说了,多个返回值的情况如下:
# 多个返回值 def my_multy(x): y = x+1 z = x-1 return y,z r = my_multy(3) print(r)
执行的结果为:
(4, 2)
也就是说,当返回多个值的时候,其实是以tuple也就是元组的形式返回的。
那如果不写返回值呢?
# 不写返回值 def none_return(): pass x = none_return() print(x)
执行的结果为:
None
也就是说,不写返回值的话,默认会返回None,当然你也可以手动返回None
参数
这一块最复杂,东西比较多,但是很重要。
位置参数
位置参数就是我们平常遇到的最多的参数了,调用的时候数量必须和定义的参数数量一致,否则会报错。这个比较简单,没什么好说的。
默认参数
默认参数就是定义函数的时候给参数设置一个默认值,调用函数的时候如果没有给这个参数,函数就会自动调用这个默认值,比如:
# 默认参数 def default_param(a,b=3): return a + b x = default_param(1) print(x)
执行的结果为:
4
这里引申一个概念,可变参数和不可变参数
可变参数有:列表、集合、字典
不可变参数有:数字、字符串、元组
默认参数必须用不可变参数!如果用可变参数,会出问题,比如:
def add_end(L=[]): L.append('END') return L print(add_end()) print(add_end()) print(add_end()) print(add_end())
结果为:
原因是函数在定义的时候,这个默认参数的值已经计算出来了,并且给了一个指向,这个指向是不变的,但是这个指向的内容,一直在改变
可变参数
可变参数允许你传入0个或任意个参数,这些可变参数在函数调用时自动组装为一个tuple
用法:
定义:
# 可变参数 def calc(*numbers): sum = 0 for n in numbers: sum = sum + n * n return sum
调用:
print(calc(1,2,3))
或
a = [1,2,3] print(calc(*a))
或
a = (1,2,3) print(calc(*a))
关键字参数
关键字参数允许你传入0个或任意个含参数名的参数,这些关键字参数在函数内部自动组装为一个dict
用法:
定义:
# 关键字参数 def person(name, age, **kw): print('name:', name, 'age:', age, 'other:', kw)
调用:
a = {'weight':130,'height':175} person('sun',27,**a)
或
person('sun',27,weight=130,height=175)
执行结果:
命名关键字参数
如果要限制关键字参数的名字,就可以用命名关键字参数,例如,只接收city
和job
作为关键字参数。这种方式定义的函数如下:
定义:
# 命名关键字参数 def person2(name, age, *, city, job): print(name, age, city, job)
调用:关键字参数只能是city和job
调用:
person2('Jack', 24, city='Beijing', job='Engineer')
或
b = {'city':'Beijing', 'job':'Engineer'} person2('Jack', 24, **b)
参数组合的顺序
参数定义的顺序必须是:必选参数、默认参数、可变参数、命名关键字参数和关键字参数
比如:
def f1(a, b, c=0, *args, **kw): print('a =', a, 'b =', b, 'c =', c, 'args =', args, 'kw =', kw) def f2(a, b, c=0, *, d, **kw): print('a =', a, 'b =', b, 'c =', c, 'd =', d, 'kw =', kw)
注意:
对于任意函数,都可以通过类似func(*args, **kw)
的形式调用它,无论它的参数是如何定义的,比如:
def f1(a, b, c=0, *args, **kw): print('a =', a, 'b =', b, 'c =', c, 'args =', args, 'kw =', kw) def f2(a, b, c=0, *, d, **kw): print('a =', a, 'b =', b, 'c =', c, 'd =', d, 'kw =', kw) def f3(a, b, c=0): print('a =', a, 'b =', b, 'c =', c) a = (1,2,3) b = {'name':'sun','weight':130} c = {'d':8,'name':'sun','weight':130} f1(*a,**b) f2(*a,**c) f3(*a)
执行结果为:
内置函数举例
python有很多内置函数,我们碰到了就记一下。
求绝对值函数
# 求绝对值函数 print(abs(10)) #10 print(abs(-28)) #28
求最大值函数
# 求最大值函数 print(max(1,-3,10)) #10
数据类型转换函数
# 数据类型转换函数 print(int('1111')) #1111 print(str(12.3)) #'12.3' print(bool(1)) #True