【Python基础】函数使用实战操作详解
目录
一、前言
二、Python 函数介绍
2.1 什么是函数
2.2 函数结构
三、函数基本使用
3.1 函数定义
3.2 函数如何调用
3.3 带参数的函数
3.4 函数默认参数
3.5 关键字参数
3.6 位置参数与关键字参数对比
3.7 可变参数(*args 和 **kwargs)
3.8 函数返回值
3.8.1 返回值return 说明
3.8.2 函数返回值特点
3.9 函数作用域
3.10 函数说明文档
3.11 函数的参数类型
3.12 匿名函数
3.12.1 什么是匿名函数
3.12.2 匿名函数特点
3.12.3 匿名函数基本语法
3.12.4 匿名函数带参数
3.12.5 匿名函数与其他内置函数结合使用
四、写在最后
一、前言
在日常项目开发中,函数(方法)可以说无处不在,使用函数可以为项目的开发带来很多好处,让工程代码变得可维护性更好,本篇将详细介绍一下Python中的函数使用。
二、Python 函数介绍
2.1 什么是函数
函数是组织好的,可重复使用的,用来实现单一,或相关联功能的代码段。
函数能提高应用的模块性,和代码的重复利用率。你已经知道Python提供了许多内建函数,比如print()。但你也可以自己创建函数,这被叫做用户自定义函数。
2.2 函数结构
在pythno 中,一个完整的函数结构如下:
在自定义函数时,可以参考下面的原则:
函数代码块以def关键词开头,后接函数标识符名称和圆括号()。
任何传入参数和自变量必须放在圆括号中间,圆括号之间可以用于定义参数。
函数的第一行语句可以选择性地使用文档字符串—用于存放函数说明。
函数内容以冒号:起始,并且缩进。
return [表达式]结束函数,选择性地返回一个值给调用方,不带表达式的 return 相当于返回 None。
三、函数基本使用
3.1 函数定义
Python 定义函数使用 def 关键字,一般格式如下:
默认情况下,参数值和参数名称是按函数声明中定义的顺序匹配起来的
def 函数名(参数列表): """文档字符串(可选)""" 函数体 return 返回值 # 可选如下定义一个基本的函数并调用:
def hello() : print("Hello World!") hello() def greet(): """向指定的人打招呼""" return "Hello!" print(greet())输出结果:
3.2 函数如何调用
定义一个函数:给了函数一个名称,指定了函数里包含的参数,和代码块结构。
这个函数的基本结构完成以后,你可以通过另一个函数调用执行,也可以直接从 Python 命令提示符执行。
如下实例调用了printme()函数:
# 定义函数 def printme( str ): # 打印任何传入的字符串 print (str) return # 调用函数 printme("我要调用用户自定义函数!") printme("再次调用同一函数")注意事项:
函数必须先定义,在调用
函数定义时,并不会执行,只有在调用函数时,函数体的逻辑才会运行
函数中通过缩进来描述归属关系
3.3 带参数的函数
在真实的项目开发场景下,函数使用时一般会带上参数,默认情况下,带有参数的函数在调用时按顺序传入,下面这个函数,比较两个数的大小并输出
def max(a, b): if a > b: return a else: return b a = 11 b = 21 print(max(a, b))3.4 函数默认参数
给参数设定一个默认值,外部调用时可省略这个默认参数:
注意:默认参数必须是不可变对象(如None、数字、字符串),不要用列表/字典,否则会有坑
默认参数必须放在没有默认值的参数列表的后面,一个函数在定义时是可以设置多个默认参数的
函数调用时,如果为默认参数传递了值,则会修改默认的参数值;如果没有传递该参数,则直接使用默认值
def power(base, exp=2): return base ** exp print(power(3)) print(power(3, 3))3.5 关键字参数
调用函数时指定参数名,顺序可任意,这种比较灵活:
调用函数时,通过"形参名=值"的形式传递参数,顺序没有要求
如果同时存在位置参数与关键字参数,位置参数在前,关键字参数在后
def info(name, age): return f"{name} is {age} years old" print(info(age=25, name="Bob"))当然也可以混用,参考下面的案例
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)
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 语句的用法:
# 可写函数说明 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。可以返回多个值(实际是返回一个元组):
在下面的函数中,入参是一个列表
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是一个全局变量,函数内部和外部都可以访问
x = 10 print(x) def change(): global x x = 20 change() print(x) # 20运行结果:
注意事项:
尽量避免在函数中使用全局变量,因为会使代码难以维护和调试
考虑使用函数参数和返回值来传递数据,而不是依赖全局变量
global主要用在程序的状态、配置和计数器等场景中
3.10 函数说明文档
函数的说明文档(Docstring)是写在函数开头,用三个引号包裹的字符串,用于解释函数的功能、参数、返回值等信息,方便调用者清楚函数的具体作用及细节。
定义一个带说明的函数
def rec(l,r): """ 根据长度和宽度,计算长方形面积 :param l: 长 :param r: 宽 :return: """ return l * r help(rec)当执行的时候,就可以把这个函数的作用输出出来
3.11 函数的参数类型
函数支持的普通参数包括:数字、布尔、字符串、列表、元组、集合、字典等。也支持特殊的参数:函数,即函数也可以作为参数传入。
在下面的演示代码中,既有普通函数的参数传递,也有函数作为参数的传递
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)函数作为参数传递的一个典型场景就是递归,如下:
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 基本格式如下:
lambda arguments: expression参数解释:
lambda是 Python 的关键字,用于定义 lambda 函数。arguments是参数列表,可以包含零个或多个参数,但必须在冒号(:)前指定。expression是一个表达式,用于计算并返回函数的结果。
下面这个 lambda 函数没有参数:
f = lambda: "Hello, world!" print(f()) # 输出: Hello, world!3.12.4 匿名函数带参数
带参数的匿名函数更常见,以下实例使用 lambda 创建匿名函数,设置一个函数参数 a,函数计算参数 a 加 10,并返回结果:
x = lambda a : a + 10 print(x(5))lambda 函数也可以设置多个参数,参数使用逗号,隔开:
以下实例使用 lambda 创建匿名函数,函数参数 a 与 b 相乘,并返回结果:
x = lambda a, b : a * b print(x(5, 6))以下实例使用 lambda 创建匿名函数,函数参数 a、b 与 c 相加,并返回结果:
x = lambda a, b, c : a + b + c print(x(5, 6, 2))3.12.5 匿名函数与其他内置函数结合使用
lambda 函数通常与内置函数如 map()、filter() 和 reduce() 一起使用,以便在集合上执行操作。如下:
numbers = [1, 2, 3, 4, 5] squared = list(map(lambda x: x**2, numbers)) print(squared) # 输出: [1, 4, 9, 16, 25]使用 lambda 函数与 filter() 一起,筛选偶数:
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 表达式演示如何计算一个序列的累积乘积:
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中函数的使用,希望对看到的同学有帮助,本篇到此结束,感谢观看。
