目录
[二、Python 函数介绍](#二、Python 函数介绍)
[2.1 什么是函数](#2.1 什么是函数)
[2.2 函数结构](#2.2 函数结构)
[3.1 函数定义](#3.1 函数定义)
[3.2 函数如何调用](#3.2 函数如何调用)
[3.3 带参数的函数](#3.3 带参数的函数)
[3.4 函数默认参数](#3.4 函数默认参数)
[3.5 关键字参数](#3.5 关键字参数)
[3.6 位置参数与关键字参数对比](#3.6 位置参数与关键字参数对比)
[3.7 可变参数(*args 和 **kwargs)](#3.7 可变参数(*args 和 **kwargs))
[3.8 函数返回值](#3.8 函数返回值)
[3.8.1 返回值return 说明](#3.8.1 返回值return 说明)
[3.8.2 函数返回值特点](#3.8.2 函数返回值特点)
[3.9 函数作用域](#3.9 函数作用域)
[3.10 函数说明文档](#3.10 函数说明文档)
[3.11 函数的参数类型](#3.11 函数的参数类型)
[3.12 匿名函数](#3.12 匿名函数)
[3.12.1 什么是匿名函数](#3.12.1 什么是匿名函数)
[3.12.2 匿名函数特点](#3.12.2 匿名函数特点)
[3.12.3 匿名函数基本语法](#3.12.3 匿名函数基本语法)
[3.12.4 匿名函数带参数](#3.12.4 匿名函数带参数)
[3.12.5 匿名函数与其他内置函数结合使用](#3.12.5 匿名函数与其他内置函数结合使用)
一、前言
在日常项目开发中,函数(方法)可以说无处不在,使用函数可以为项目的开发带来很多好处,让工程代码变得可维护性更好,本篇将详细介绍一下Python中的函数使用。
二、Python 函数介绍
2.1 什么是函数
函数是组织好的,可重复使用的,用来实现单一,或相关联功能的代码段。
函数能提高应用的模块性,和代码的重复利用率。你已经知道Python提供了许多内建函数,比如print()。但你也可以自己创建函数,这被叫做用户自定义函数。
2.2 函数结构
在pythno 中,一个完整的函数结构如下:

在自定义函数时,可以参考下面的原则:
-
函数代码块以 def 关键词开头,后接函数标识符名称和圆括号 ()。
-
任何传入参数和自变量必须放在圆括号中间,圆括号之间可以用于定义参数。
-
函数的第一行语句可以选择性地使用文档字符串---用于存放函数说明。
-
函数内容以冒号 : 起始,并且缩进。
-
return 表达式 结束函数,选择性地返回一个值给调用方,不带表达式的 return 相当于返回 None。
三、函数基本使用
3.1 函数定义
Python 定义函数使用 def 关键字,一般格式如下:
- 默认情况下,参数值和参数名称是按函数声明中定义的顺序匹配起来的
bash
def 函数名(参数列表):
"""文档字符串(可选)"""
函数体
return 返回值 # 可选
如下定义一个基本的函数并调用:
bash
def hello() :
print("Hello World!")
hello()
def greet():
"""向指定的人打招呼"""
return "Hello!"
print(greet())
输出结果:

3.2 函数如何调用
定义一个函数:给了函数一个名称,指定了函数里包含的参数,和代码块结构。
这个函数的基本结构完成以后,你可以通过另一个函数调用执行,也可以直接从 Python 命令提示符执行。
如下实例调用了 printme() 函数:
bash
# 定义函数
def printme( str ):
# 打印任何传入的字符串
print (str)
return
# 调用函数
printme("我要调用用户自定义函数!")
printme("再次调用同一函数")
注意事项:
-
函数必须先定义,在调用
-
函数定义时,并不会执行,只有在调用函数时,函数体的逻辑才会运行
-
函数中通过缩进来描述归属关系
3.3 带参数的函数
在真实的项目开发场景下,函数使用时一般会带上参数,默认情况下,带有参数的函数在调用时按顺序传入,下面这个函数,比较两个数的大小并输出
bash
def max(a, b):
if a > b:
return a
else:
return b
a = 11
b = 21
print(max(a, b))

3.4 函数默认参数
给参数设定一个默认值,外部调用时可省略这个默认参数:
-
注意:默认参数必须是不可变对象(如None、数字、字符串),不要用列表/字典,否则会有坑
-
默认参数必须放在没有默认值的参数列表的后面,一个函数在定义时是可以设置多个默认参数的
-
函数调用时,如果为默认参数传递了值,则会修改默认的参数值;如果没有传递该参数,则直接使用默认值
bash
def power(base, exp=2):
return base ** exp
print(power(3))
print(power(3, 3))

3.5 关键字参数
调用函数时指定参数名,顺序可任意,这种比较灵活:
-
调用函数时,通过"形参名=值"的形式传递参数,顺序没有要求
-
如果同时存在位置参数与关键字参数,位置参数在前,关键字参数在后
bash
def info(name, age):
return f"{name} is {age} years old"
print(info(age=25, name="Bob"))

当然也可以混用,参考下面的案例
bash
def reg_stu(name, age,gender, city):
print(f"注册成功,姓名:{name},年龄:{age},性别:{gender},城市:{city}")
return {"name": name, "age": age, "gender": gender, "city": city}
#传参方式一:位置参数
stu = reg_stu("张三",18,"男","北京")
print(stu)
#传参方式二:关键字参数
stu = reg_stu(name="王林",age=28,gender="男",city="北京")
print(stu)
stu = reg_stu(age=20, gender="女", city="北京", name="李慕婉")
print(stu)
# 传参方式三:位置参数+关键字参数--->位置参数在前,关键字参数在后
stu = reg_stu("李慕婉", 20, gender="女", city="北京")
print(stu)
3.6 位置参数与关键字参数对比
两者对比与适用场景:
-
一切以代码结构清晰明了(可读性)、便于维护(维护性)为目标
-
如果参数比较少(不超过3个),可直接使用位置参数
-
如果参数数量较多,建议使用关键字参数

3.7 可变参数(*args 和 **kwargs)
也叫不定长参数或者可变参数,用于函数定义及调用时参数个数不确定(0个或多个)的场景
-
*args:接收任意数量的位置参数,打包成元组 -
**kwargs:接收任意数量的关键字参数,打包成字典 -
传递的所有匹配的位置参数都会被args变量收集,这些参数会合并封装为一个元组,args是元组类型(注意并不会封装关键字参数)
-
args只是约定俗成的变量名,并不是关键字,这里可以使用任何合法的变量名(如*data)
bash
def sum_all(*args):
return sum(args)
print(sum_all(1,2,3,4)) # 10
print()
def show_info(**kwargs):
for k, v in kwargs.items():
print(f"{k}: {v}")
print(show_info(name="Tom", city="Beijing"))

如果是不定长参数与关键字参数一起使用,使用形式如下

注意:
-
参数是以"键=值"形式传递的关键字参数,这些"键=值"参数都会被kwargs接受,并合并封装为一个字典类型
-
kwargs只是约定俗成的变量名,并不是关键字,这里可以使用任何合法的变量名(如 **options)
3.8 函数返回值
在很多情况下,在工程中定义函数的时候是需要返回值的。
3.8.1 返回值return 说明
return 表达式 语句用于退出函数,选择性地向调用方返回一个表达式。不带参数值的 return 语句返回 None。之前的例子都没有示范如何返回数值,以下实例演示了 return 语句的用法:
bash
# 可写函数说明
def sum( arg1, arg2 ):
# 返回2个参数的和."
total = arg1 + arg2
print ("函数内 : ", total)
return total
# 调用sum函数
total = sum( 10, 20 )
print ("函数外 : ", total)
运行结果:

3.8.2 函数返回值特点
对函数返回值来说,具有如下特点:
-
使用
return返回结果,可以返回任意类型(数字、字符串、列表、函数等)。 -
没有
return或只写return,函数返回None。 -
可以返回多个值(实际是返回一个元组):
在下面的函数中,入参是一个列表
bash
def get_min_max(lst):
return min(lst), max(lst)
a, b = get_min_max([1,5,3]) # a=1, b=5
print(a,b)
运行结果如下:

注意:
-
return语句只有返回功能,而没有输出打印的功能,如果要输出,需要结合print()函数来实现
-
函数可以有多个返回值,多个返回值最终封装到元组中
3.9 函数作用域
变量的作用域指的是变量的作用范围(标识这个变量在哪里可以使用,在哪儿不可以使用)。
基本特点:
-
局部变量:在函数内部定义的变量,称之为局部变量,只能在该函数内部使用,外部无法访问(函数执行完毕后,会自动销毁其内部局部变量)
-
全局变量:在函数之外定义的变量,称之为全局变量,在整个文件中(包括函数内)都可以使用(通常定义在文件的顶部)

比如在下面的函数中,x是一个全局变量,函数内部和外部都可以访问
bash
x = 10
print(x)
def change():
global x
x = 20
change()
print(x) # 20
运行结果:

注意事项:
-
尽量避免在函数中使用全局变量,因为会使代码难以维护和调试
-
考虑使用函数参数和返回值来传递数据,而不是依赖全局变量
-
global主要用在程序的状态、配置和计数器等场景中
3.10 函数说明文档
函数的说明文档(Docstring)是写在函数开头,用三个引号包裹的字符串,用于解释函数的功能、参数、返回值等信息,方便调用者清楚函数的具体作用及细节。

定义一个带说明的函数
bash
def rec(l,r):
"""
根据长度和宽度,计算长方形面积
:param l: 长
:param r: 宽
:return:
"""
return l * r
help(rec)
当执行的时候,就可以把这个函数的作用输出出来

3.11 函数的参数类型
函数支持的普通参数包括:数字、布尔、字符串、列表、元组、集合、字典等。也支持特殊的参数:函数,即函数也可以作为参数传入。
在下面的演示代码中,既有普通函数的参数传递,也有函数作为参数的传递
bash
def circle_area(r):
area = 3.14 * r ** 2
return area
print(circle_area(5))
def calc_score(score_list):
min_s = min(score_list)
max_s = max(score_list)
avg_s = round(sum(score_list) / len(score_list), 1)
return max_s, min_s, avg_s
s_list = [589, 609, 605, 643, 677, 455, 477, 489, 503]
max_score, min_score, avg_score = calc_score(s_list)
def add (x, y):
return x + y
def subtract (x, y):
return x - y
def calc(x,y,oper):
return oper(x,y)
result = calc(10, 20, add)
print(result)
函数作为参数传递的一个典型场景就是递归,如下:
bash
def cal(n):
if n ==1:
return 1
else:
return n * cal(n-1)
res = cal(5)
print(res)
3.12 匿名函数
3.12.1 什么是匿名函数
Python 中使用 lambda 来创建匿名函数。
-
lambda 函数是一种小型、匿名的、内联函数,它可以具有任意数量的参数,但只能有一个表达式。
-
匿名函数不需要使用 def 关键字定义完整函数。
-
lambda 函数通常用于编写简单的、单行的函数,通常在需要函数作为参数传递的情况下使用,例如在 map()、filter()、reduce() 等函数中。
3.12.2 匿名函数特点
lambda 函数 特点:
-
lambda 函数是匿名的,它们没有函数名称,只能通过赋值给变量或作为参数传递给其他函数来使用。
-
lambda 函数通常只包含一行代码,这使得它们适用于编写简单的函数。
-
匿名函数中可以返回结果,也可以不返回结果。返回结果时,不需要写return,表达式的运行结果就是要返回的结果。
3.12.3 匿名函数基本语法
lambda 基本格式如下:
bash
lambda arguments: expression
参数解释:
-
lambda是 Python 的关键字,用于定义 lambda 函数。 -
arguments是参数列表,可以包含零个或多个参数,但必须在冒号(:)前指定。 -
expression是一个表达式,用于计算并返回函数的结果。
下面这个 lambda 函数没有参数:
bash
f = lambda: "Hello, world!"
print(f()) # 输出: Hello, world!
3.12.4 匿名函数带参数
带参数的匿名函数更常见,以下实例使用 lambda 创建匿名函数,设置一个函数参数 a,函数计算参数 a 加 10,并返回结果:
bash
x = lambda a : a + 10
print(x(5))
lambda 函数也可以设置多个参数,参数使用逗号 , 隔开:
以下实例使用 lambda 创建匿名函数,函数参数 a 与 b 相乘,并返回结果:
bash
x = lambda a, b : a * b
print(x(5, 6))
以下实例使用 lambda 创建匿名函数,函数参数 a、b 与 c 相加,并返回结果:
bash
x = lambda a, b, c : a + b + c
print(x(5, 6, 2))
3.12.5 匿名函数与其他内置函数结合使用
lambda 函数通常与内置函数如 map()、filter() 和 reduce() 一起使用,以便在集合上执行操作。如下:
bash
numbers = [1, 2, 3, 4, 5]
squared = list(map(lambda x: x**2, numbers))
print(squared) # 输出: [1, 4, 9, 16, 25]
使用 lambda 函数与 filter() 一起,筛选偶数:
bash
numbers = [1, 2, 3, 4, 5, 6, 7, 8]
even_numbers = list(filter(lambda x: x % 2 == 0, numbers))
print(even_numbers) # 输出:[2, 4, 6, 8]
下面是一个使用 reduce() 和 lambda 表达式演示如何计算一个序列的累积乘积:
bash
from functools import reduce
numbers = [1, 2, 3, 4, 5]
# 使用 reduce() 和 lambda 函数计算乘积
product = reduce(lambda x, y: x * y, numbers)
print(product) # 输出:120
在上面的实例中,reduce() 函数通过遍历 numbers 列表,并使用 lambda 函数将累积的结果不断更新,最终得到了 1 * 2 * 3 * 4 * 5 = 120 的结果。
补充:什么时候使用匿名 函数 ?
-
建议使用匿名函数的情况:函数逻辑简单,只在一个地方调用(常作为高阶函数的参数)
-
建议使用命名函数的情况:函数逻辑复杂,需要多步操作,需要多个地方重复使用或需要加文档说明的场景
四、写在最后
本文通过较大的篇幅详细介绍了Python中函数的使用,希望对看到的同学有帮助,本篇到此结束,感谢观看。