Python语法5
这次我们讲的是函数在Python中的应用。
其实函数是一个很重要的用法,我们写项目的时候会很多行代码,如果出错了找起来比较麻烦,但是我们用函数将某一个功能进行一个打包,那么我们就可以对某一功能进行单独的实现。
定义函数
Python中一个典型的函数定义包括以下部分:关键字def、函数名称、由0个或多个形参组成的列表以及函数体。
def func(n):
res=1
for i in range(1,n+1):
res*=i;
return res#返回res的值
上述我们就是定义了一个实现n的阶乘的函数,用起来比较简单。
往往函数只有在主函数中调用到之后才会执行,执行完函数才会继续执行主函数中的其他内容
调用函数
n =4
print(func(n))#这里我们就调用了func函数
形参与实参
这一块就不过多详细说了,主函数给函数的是实参,在函数里面的是形参,如果之前学过C语言或者Java的同学,这点应该很好理解。
def add(a,b):
return a+b
print(add(1,5))
形参的初始方法
第一种是用位置实参来初始化形参。顾名思义,实参会按位置关系来初始化形参,第一个实参初始化第一个形参,第二个实参初始化第二个形参,依此类推。形参和实参的个数必须匹配。例如:
def func(a, b, c, d):
print("a =", a, end=", ")
print("b =", b, end=", ")
print("c =", c, end=", ")
print("d =", d)
func(1, True, "Python", 4.2) # 输出 a = 1, b = True, c = Python, d = 4.2
func(1, True, "Python", 4.2, 3) # 会报错,因为实参个数多于形参
func(1, True, "Python") # 会报错,因为实参个数少于形参
第二种是用关键字实参来初始化形参。此时实参不再按位置关系来初始化形参,而是按变量名初始化。例如:
func(b=1, c=True, a="Python", d=4.2) # 输出 a = Python, b = 1, c = True, d = 4.2
两种方式也可以混合使用,但是位置实参一定要放到关键字实参之前。例如:
# func()的定义如上所述
func(1, 2, d="Python", c=4.2) # 输出 a = 1, b = 2, c = 4.2, d = Python
func(1, b=3, "Python", d=4.2) # 会报错,因为位置实参位于关键字实参后面了。
形参也可以设置默认值,但所有带默认值的形参必须是最后几个。当某些形参没有被初始化时,这些形参会使用默认值。例如:
def func(a, b, c=3, d="Python"):
print("a =", a, end=", ")
print("b =", b, end=", ")
print("c =", c, end=", ")
print("d =", d)
func(1, 2) # c和d没有被初始化,采用默认值。输出 a = 1, b = 2, c = 3, d = Python
func(1, b=2, d="du463") # c没有被初始化,采用默认值。输出 a = 1, b = 2, c = 3, d = du463
变量的作用域
函数内定义的变量为局部变量,只能在函数内部使用。
当需要修改用全局变量时,需要用global关键字在函数内声明全局变量。例如:
x = 1
def func():
global x # 在函数内声明全局变量
x = 666
y = 777
print(x, y)
func() # 输出 666 777
print(x) # 会发现全局变量x也被修改了
print(y) # 会报错,因为y是局部变量,函数外无法使用
嵌套定义函数
Python中是可以在函数中定义函数的,但是在C语言和Java中就不太现实
def func():
def func1(x): # 定义函数func1()
x += 1
print(x)
func1(5) # 调用函数func1()
func() # 输出6
pass语句
当函数定义完但还不想实现时,可以用pass占位符,来避免出现语法错误。例如:
def func():
pass
参数传递
值传递
将实参的初始值拷贝给形参。此时,对形参的改动不会影响实参的初始值。例如:
def func(x):
x=1
print(x)#输出是1
x = 10
func(x)
print(x)#输出还是10
引用传递
列表采用引用传递。将实参的引用传给形参,此时对形参的修改会影响实参的初始值。例如:
def func(b):
for i in range(len(b)):
b[i] += 1
a = [0, 1, 2, 3, 4]
func(a)
print(a) # 会发现列表a中的每个数加了1
return语句
return语句终止当前正在执行的函数并将控制权返回到调用该函数的地方,并返回结果。例如:
def func(x):
if x == 1:
return # 不写返回值时,会返回None
if x == 2:
return 3 # 返回一个变量
if x == 3:
return 4, 5 # 返回多个变量
a = func(1)
b = func(2)
c, d = func(3)
e = func(4) # 没写return时,也会返回None
print(a, b, c, d, e) # 输出 None 3 4 5 None
lambda表达式
lambda关键字可以创建匿名函数,目的是为了简化代码。可以对比下面两种写法,会发现lambda表达式的写法更短一些。
常与sort()函数配合使用,例如:
pairs = [[1, "one"], [2, "two"], [3, "three"], [4, "four"]]
pairs.sort(key=lambda pair: pair[1]) # 每个元素使用第二个变量比较大小,这是sort的一个用法
print(pairs) # 输出:[[4, 'four'], [1, 'one'], [3, 'three'], [2, 'two']]
等价于
pairs = [[1, "one"], [2, "two"], [3, "three"], [4, "four"]]
def compare(pair):
return pair[1]
pairs.sort(key=compare) # 每个元素使用第二个变量比较大小
print(pairs) # 输出:[[4, 'four'], [1, 'one'], [3, 'three'], [2, 'two']]
要是按照倒叙怎么实现呢
pairs = [[1, "one"], [2, "two"], [3, "three"], [4, "four"]]
def compare(pair):
return -pair[0]#这里进行了改变
pairs.sort(key=compare) # 每个元素使用第二个变量比较大小
print(pairs) # 输出:[[4, 'four'], [1, 'one'], [3, 'three'], [2, 'two']]
函数递归
在一个函数内部,也可以调用函数自身。这种写法被称为递归。
想必学过C语言或者是Java的已经知道什么是递归了,理解应该不算很难。
写递归函数可以从集合的角度来思考。理解递归函数的执行顺序可以用树的形式来思考。
例如,求解斐波那契数列第 n项可以采用如下写法:
def func(n):
if n <= 2:
return 1
return func(n - 1) + func(n - 2)
print(func(6)) # 输出 8