Python语法5

发布时间 2023-10-10 21:27:19作者: du463

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