在Python中函数这个概念,根据我的理解就是我们可以根据自己的需要定义不同功能的函数(在类里面叫方法),而且可以重复调用。还有一些内建函数是系统自带的,可以直接使用。
详细教程如下:
https://www.liaoxuefeng.com/wiki/1016959663602400/1017105145133280.
定义函数
定义一个函数要用到关键字def
,下面就定义一个简单的求绝对值的函数:
def my_abs(x):
if not isinstance(x,(int,float)): #isinstance() 系统内置函数 对数据类型做检查,本列只允许传入整数和浮点数
raise TabError("bad operand type") # raise抛出指定的异常信息
if x >= 0:
return x
else:
return -x
调用该函数,并传入参数
>> my_abs(-3)
3
>>my_abs('sdf')
TabError: bad operand type
函数的参数
位置参数
先写一个计算 x2的函数:
def f(x):
return x * x
当我们调用函数f的时候,参数x
就是一个位置参数,所有我们调用的时候必须传入有且仅有一个参数x
;
>>>f(5)
25
>>>f(15)
225
但是呢上面的函数有一个缺陷不能计算xn ,那么我们接下来实现这个功能:
def f(x,n)
s = 1
while n > 0
n = n - 1
s = s * x
return s
修改后的power(x, n)函数有两个参数:x
和n
,这两个参数都是位置参数,调用函数时,传入的两个值按照位置顺序依次赋给参数x
和n
。
默认参数
默认参数就是我们给定参数一个默认值,这样我们不传入这个参数的时候,默认值就会生效,我们也可以自己传入指定的参数去替代设置的默认值。
def power(x, n=2):
s = 1
while n > 0:
n = n - 1
s = s * x
return s
调用
>>> power(5)
25
>>> power(5, 3)
125
注意:
1、必选参数在前,默认参数在后,否则Python的解释器会报错;
我们也可以同时定义几个默认参数,如果要改变其中一个默认参数的值,在传参的时候就需要加上参数名。
默认参数一定要用不可变对象,如果是可变对象,程序运行时会有逻辑错误!
可变参数
可变参数,就像他的名字一样,我们传入的参数的数量是不确定的,可以是1个、2个、3个到任意个,还可以是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(*nms)
14
关键字参数
关键字参数允许你传入0个或任意个含参数名的参数,这些关键字参数在函数内部自动组装为一个dict。
def person(name, age, **kw):
print('name:', name, 'age:', age, 'other:', kw)
>>> person('Michael', 30)
name: Michael age: 30 other: {}
我们可以传入任意个关键字参数:
>>> 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'}
同样使用类似可变参数的方法,我们可以传入一个字典。
命名关键字参数
关键字参数无法对参数的多少个参数名进行限制,而命名关键字参数刚好解决了这个问题。
def aaa(name,age,*,city,job)
pring(name,age,city,job)
上面列举了语法格式很简单,下面我们看看如何调用
>>>person('Jack', 24, city='Beijing', job='Engineer')
Jack 24 Beijing Engineer
这是我们就必须传入city和job这两个关键字参数了。
我们在定义命名关键字参数的时候,也可以使用类似默认参数的方法,给city或job设置默认值,这样我们就可以不传入这个参数了。使用方法和默认参数一样。
def aaa(name,age,ages*,city,job)
pring(name,age,city,job)
如上所示我们在定义命名关键字参数的时候,如果前面有可变参数,那么后面的就是命名关键字参数,我们并不需要做其他的操
作了。
参数组合
我们可以根据需要对上面讲的几种参数进行组合使用,可以同时包含上述所有参数,然后这样做没有意义。
当定义func(*args, **kw)
这样同时包含可变参数和关键字参数的函数时,那么它可以接受任意参数。
函数的变量的作用域
var0 = 123
print(var0)
def func():
global var0 # 如果没有global 这行语句 变量var0的赋值只会在函数内生效,
# 如果有这行语句var0将会变成全局变量,函数内的赋值将会影响到函数外的变量。
var0 = 456
print(var0)
#调用函数
func()
>>>123
>>>456
可以看到函数体内对变量进行赋值,改变了函数体外的变量
递归函数
在函数内部,可以调用其他函数。如果一个函数在内部调用自身本身,这个函数就是递归函数。
我们来写一个计算乘阶运算的函数:
def fact(n):
if n == 1
return 1
return n * fact(n - 1)
可以看出
fact(n)=n!=1×2×3×⋅⋅⋅×(n−1)×n=(n−1)!×n=fact(n−1)×n