函数【篇1】

news/2025/3/25 5:05:56/文章来源:https://www.cnblogs.com/kyle-7Qc/p/18761210

1. 函数

  • 函数是一种封装代码的方式,将实现特定功能的代码片段通过函数名称进行封装,通过函数名称调用即可实现功能复用,达到“一次编写,多次调用”的目的。

1.1 内置函数

Python 提供了许多内置函数,可以直接使用,例如:

  • 输出函数print(),用于将内容输出到控制台。
  • 输入函数input(),用于从用户获取输入。
  • 列表自定义函数list(),用于创建列表。
  • 还有更多其他内置函数,如len()用于获取长度、type()用于获取数据类型等,这里不再一一列举。

1.2 自定义函数

我们可以根据自己的需求定义函数,其基本语法如下:

def 函数名称(参数列表):函数体[return 返回值列表]
  • def 是定义函数的关键字。
  • 函数名称:遵循变量命名规则,应具有描述性,方便理解函数的功能。
  • 参数列表:用于接收调用函数时传入的值,可以有多个参数,也可以没有参数。
  • 函数体:是函数的具体实现部分,包含一系列语句,完成特定的功能。
  • return 返回值列表return 用于返回函数的执行结果,可以返回一个值,也可以返回多个值(以元组形式),如果不写return,函数默认返回None

1.3 函数调用

函数定义后,需要通过函数名称和参数列表来调用它,其语法为:

函数名(参数列表)

1.4 应用示例

示例 1:累加求和

# 累加求和
def get_sum(n):s = 0for i in range(1, n + 1):s += iprint(f"1到{n}的累加和为:{s}")# print('1到{0}的累加和为:{1}'.format(n,s))# print('1到%d的累加和是:%d' %(n,s))get_sum(10)  # 函数调用
get_sum(100)

运行结果:

1到10的累加和为:55
1到100的累加和为:5050

示例 2:任意区间求和

# 任意区间求和
def get_sum(a, n):s = 0for i in range(a, n + 1):s += iprint(f"{a}到{n}的累加和为:{s}")get_sum(1, 10)
get_sum(99, 100)

运行结果:

1到10的累加和为:55
99到100的累加和为:199

2. 函数的参数传递

  • 函数的参数传递是函数调用时将实际参数传递给形式参数的过程,根据传递方式的不同,参数可以分为以下几种类型:

2.1 位置参数

  • 位置参数是指调用函数时,参数的个数顺序必须与定义的参数个数和顺序相同。

示例

def happy_birthday(name, age):print(f"祝{name}{age}岁生日快乐!")happy_birthday("kyle", 20)

运行结果:

祝kyle20岁生日快乐!

注意事项:

  1. 定义几个参数,传递几个位置参数。
  2. 参数位置顺序必须与定义时一致。
  3. 参数数据类型需要匹配。

2.2 关键字参数

  • 关键字参数是在函数调用时,使用“形参名称=值”的方式进行传参,传递参数的顺序可以与定义时参数的顺序不同。

示例

def happy_birthday(name, age):print(f"祝{name}{age}岁生日快乐!")# 关键字传参:指定关键字,不考虑顺序
happy_birthday(age=20, name="kyle")
happy_birthday("rock", 20)  # 位置传参
happy_birthday("ming", age=20)  # 位置传参 + 关键字传参

运行结果:

祝kyle20岁生日快乐!
祝rock20岁生日快乐!
祝ming20岁生日快乐!

注意事项:

  1. 函数定义的参数名称与传递的关键字参数名称必须完全一致。
  2. 当位置参数和关键字参数同时使用时,位置参数必须在关键字参数之前。

2.3 默认值参数

默认值参数是在函数定义时,直接对形式参数进行赋值。在调用时,如果该参数不传值,则使用默认值;如果该参数传值,则使用传递的值。

示例

def happy_birthday(name="kyle", age=18):print(f"祝{name}{age}岁生日快乐!")happy_birthday()  # 使用默认值
happy_birthday(age=10)  # 关键字传参,覆盖默认值
happy_birthday(name="rock")  # 关键字传参,覆盖默认值
happy_birthday("ming")  # 位置参数传参,覆盖默认值

运行结果:

祝kyle18岁生日快乐!
祝kyle10岁生日快乐!
祝rock18岁生日快乐!
祝ming18岁生日快乐!

注意事项:

  1. 默认值参数必须放在参数列表的最后。
  2. 位置参数和默认值参数同时存在时,位置参数在前,关键字参数和默认值参数在后。

2.4 可变参数

  • 可变参数是一种特殊的参数类型,允许函数接收任意数量的参数值。根据参数类型的不同,可变参数分为两种:个数可变的位置参数个数可变的关键字参数

2.4.1 个数可变的位置参数

  • 个数可变的位置参数是在函数定义时,在参数前加一颗星(*para),para是形式参数的名称。函数调用时,可接收任意个数的实际参数,并将它们放到一个元组中。

示例

def print_args(*args):print("位置参数列表:", args)  # args 是一个元组for arg in args:print(arg)# 调用示例
print_args(1, 2, 3, "hello")
print_args([11, 22, 50])  # 实际上传递的是一个参数

运行结果:

位置参数列表: (1, 2, 3, 'hello')
1
2
3
hello
位置参数列表: ([11, 22, 50],)
[11, 22, 50]

参数解包

在调用时,如果已经有一个列表或元组,可以在参数前加一颗星(*),将列表或元组中的元素作为多个独立的参数传递给函数,这种方式称为解包

def fun(*para):print(type(para))for item in para:print(item)# 调用示例
fun(10, 20, 30, 0)
fun(10)
fun(20, 40)
fun([11, 22, 50])  # 实际上传递的是一个参数# 在调用时,参数前加一颗星,会将列表进行解包
fun(*[11, 22, 50])

运行结果:

<class 'tuple'>
10
20
30
0
<class 'tuple'>
10
<class 'tuple'>
20
40
<class 'tuple'>
[11, 22, 50]
<class 'tuple'>
11
22
50

2.4.2 个数可变的关键字参数

个数可变的关键字参数是在函数定义时,在参数前加两颗星(**para),para是形式参数的名称。函数调用时,可接收任意多个“参数=值”形式的参数,并将它们放到一个字典中。

示例

def print_kwargs(**kwargs):print("关键字参数字典:", kwargs)  # kwargs 是一个字典for key, value in kwargs.items():print(f"{key}: {value}")# 调用示例
print_kwargs(name="kyle", age=20, city="Beijing")

运行结果:

关键字参数字典: {'name': 'kyle', 'age': 20, 'city': 'Beijing'}
name: kyle
age: 20
city: Beijing

字典解包

如果已经有一个字典,可以在调用时在参数前加两颗星(**),将字典中的键值对作为关键字参数传递给函数,这种方式也称为解包

def fun2(**kwpare):print(type(kwpare))for key, value in kwpare.items():print(key, '-->', value)# 调用示例
fun2(name='kyle', age=8)d = {'name': "kyle", 'age': 20, 'city': "Beijing"}
# fun2(d)  # TypeError: fun2() takes 0 positional arguments but 1 was given
fun2(**d)  # 传递的参数如果是一个字典,需要加两个**,进行解包

运行结果:

<class 'dict'>
name --> kyle
age --> 8
<class 'dict'>
name --> kyle
age --> 20
city --> Beijing

注意事项

  1. 个数可变的位置参数和关键字参数不能同时使用。如果需要同时处理位置参数和关键字参数,可以分别使用*args**kwargs,但*args必须在**kwargs之前。
  2. 解包操作
    • 使用*解包列表或元组时,会将其中的元素作为多个独立的位置参数传递。
    • 使用**解包字典时,会将其中的键值对作为关键字参数传递。
  3. 参数顺序
    • 如果函数同时包含普通位置参数、默认值参数、*args**kwargs,参数的顺序必须是:普通位置参数 -> 默认值参数 -> *args -> **kwargs

综合示例

以下是一个同时使用普通参数、默认值参数、*args**kwargs的函数示例:

def example_function(a, b, c=10, *args, **kwargs):print("普通位置参数:", a, b)print("默认值参数:", c)print("个数可变的位置参数:", args)print("个数可变的关键字参数:", kwargs)# 调用示例
example_function(1, 2, 3, 4, 5, name="kyle", age=20)

运行结果:

普通位置参数: 1 2
默认值参数: 3
个数可变的位置参数: (4, 5)
个数可变的关键字参数: {'name': 'kyle', 'age': 20}

3. 函数的返回值

3.1. 函数的返回值 return

  • 函数的返回值是函数执行的结果,使用 return 关键字返回。return 可以出现在函数中的任意位置,用于结束函数的执行,并将结果返回给调用者。

3.1.1 返回单个值

  • 如果函数的运行结果需要在其他函数中使用,那么这个函数应该被定义为带返回值的函数。返回值可以是一个值。

示例代码

def calc(a, b):print(a + b)  # 仅打印结果,没有返回值calc(10, 20)  # 输出 30
print(calc(1, 2))  # 输出 None,因为没有返回值

带返回值的函数

def sum(a, b):s = a + breturn s  # 返回计算结果print('--' * 20)get_calc = sum(5, 7)  # 调用函数并接收返回值
print(get_calc)  # 输出 12
print(sum(get_calc, 6))  # 输出 18
print(sum(4, 2))  # 输出 6

3.1.2 返回多个值

  • 函数可以返回多个值,这些值会以元组的形式返回。可以通过解包的方式接收多个返回值。

示例代码

def get_sum(num):s = 0  # 累加和odd_sum = 0  # 奇数累加和even_sum = 0  # 偶数累加和for i in range(1, num + 1):if i % 2 != 0:odd_sum += ielse:even_sum += is += ireturn s, odd_sum, even_sum  # 返回多个值result = get_sum(10)
print(type(result), result)  # <class 'tuple'> (55, 25, 30)# 解包赋值
sum_val, odd_sum, even_sum = get_sum(10)
print("sum=%d" % sum_val)
print(f"odd_sum={odd_sum}")
print("even_sum={0}".format(even_sum))

3.2. 变量的作用域

  • 变量的作用域决定了变量的可用范围。Python 中的变量分为 局部变量全局变量

3.2.1 局部变量

  • 局部变量是在函数内部定义的变量,仅在函数内部有效。函数执行结束后,局部变量的生命周期结束。

示例代码

def calc(a, b):s = a + b  # 局部变量return sresult = calc(10, 20)
print(result)  # 输出 30# print(a, b, s)  # NameError: name 'a' is not defined
# a 和 b 是函数参数,s 是函数内部定义的变量,都是局部变量

3.2.2 全局变量

  • 全局变量是在函数外部定义的变量,或者在函数内部使用 global 关键字修饰的变量。全局变量的作用范围是整个程序,程序运行结束后,全局变量的生命周期才结束。

示例代码

a = 50  # 全局变量def calc(x, y):return a + x + y  # 使用全局变量 asum1 = calc(1, 2)
print(sum1)  # 输出 53

3.2.3 局部变量与全局变量的冲突

  • 如果局部变量和全局变量的名称相同,局部变量的优先级更高。

示例代码

a = 50  # 全局变量def calc2(x, y):a = 200  # 局部变量,与全局变量同名print(a + x + y)  # 使用局部变量 acalc2(1, 2)  # 输出 203

3.2.4 使用 global 关键字

  • 在函数内部,如果需要修改全局变量的值,必须使用 global 关键字声明。

示例代码

def calc3(x, y):global s  # 使用 global 关键字声明 s 为全局变量s = 300return s + x + yprint(calc3(1, 2))  # 输出 303
print(s)  # 输出 300,s 是全局变量

总结

  1. 函数的返回值

    • 使用 return 返回函数的执行结果。
    • 返回值可以是一个值,也可以是多个值(以元组形式返回)。
    • 返回值可以被其他函数调用或处理。
  2. 变量的作用域

    • 局部变量:仅在函数内部有效,函数执行结束后销毁。
    • 全局变量:在函数外部定义,或在函数内部使用 global 关键字声明,作用范围是整个程序。
    • 如果局部变量和全局变量名称相同,局部变量优先级更高。
    • 使用 global 关键字可以在函数内部修改全局变量的值。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.hqwc.cn/news/904237.html

如若内容造成侵权/违法违规/事实不符,请联系编程知识网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

List集合--java进阶day09

1.List集合以下面的例子来解释存储有序和存储重复如上图,我们是怎么添加这些字符串的,打印的时候就是按照这个顺序打印的--存取有序 并且“张三”出现了两次,也存入了两次--存储重复 因为List有索引,所以该接口有关于索引的独特的api..1.remove注意事项 List有两个remove方…

Pydantic字段级校验:解锁@validator的12种应用

title: Pydantic字段级校验:解锁@validator的12种应用 date: 2025/3/23 updated: 2025/3/23 author: cmdragon excerpt: Pydantic校验系统支持通过pre验证器实现原始数据预处理,在类型转换前完成字符清洗等操作。格式验证涵盖正则表达式匹配与枚举值约束,确保护照编号等字…

20244126 2024-2025-2 《python程序设计》实验一报告

课程:《Python程序设计》 班级:2441 姓名:马晓霞 学号:20244126 实验教师:王志强 实验日期:2025年3月23日 必修/选修:公选课 (一)实验内容 1.熟悉Python开发环境 2.练习Python运行,调试技能 3.编写技能,练习变量和类型、字符串、对象、缩进和注释等 4.编写一个猜数字…

1.6K star!这个开源文本提取神器,5分钟搞定PDF/图片/Office文档!

Kreuzberg 是一个基于 Python 的文本提取库,支持从 PDF、图像、Office 文档等 20+ 格式中提取文本内容。采用 MIT 开源协议,具备本地处理、异步架构、智能 OCR 等特性,特别适合需要隐私保护的文档处理场景。嗨,大家好,我是小华同学,关注我们获得“最新、最全、最优质”开…

leetcode每日一题:判断一个括号字符串是否有效

题目 一个括号字符串是只由 ( 和 ) 组成的 非空 字符串。如果一个字符串满足下面 任意 一个条件,那么它就是有效的:字符串为 (). 它可以表示为 AB(A 与 B 连接),其中A 和 B 都是有效括号字符串。 它可以表示为 (A) ,其中 A 是一个有效括号字符串。给你一个括号字符串 s 和…

实验2c语言分支与循环基础应用编程

任务一:1 #include <stdio.h>2 #include <stdlib.h>3 #include <time.h>4 5 #define N 56 7 int main() {8 int number;9 int i; 10 11 srand(time(0)); // 以当前系统时间作为随机种子 12 for(i = 0; i < N; ++i) { 13 nu…

矿用人员违规闯入监控报警系统

矿用人员违规闯入监控报警系统,设置警戒预警功能,巷道正在行车时,当有行人闯入时,及时抓拍、识别现场违章入侵人员同时闪光警示和音箱报警提示禁止进入,在绞车运行期间人员误入斜巷能够及时报警,自动停止绞车运行。该系统做到绞车运行和行人的安全隔离,有力保障了煤矿斜…

工厂车间人员违规闯入禁区报警系统

工厂车间人员违规闯入禁区报警系统前端设备嵌入AI人体识别算法,对人员的检测、跟踪,实现对人体检测分析识别,实时预警周界区域内人员入侵事件。当有可疑人员进入监测范围内可对其自动识别,即对其抓拍并将当时图像传输到管理中心,在管理中心输出报警信号。工厂车间人员违规…

iis备份还原工具,想要备份iis有哪些工具可以实现?

想要备份IIS(Internet Information Services),可以使用多种专门的备份还原工具。以下是一些常用的IIS备份还原工具及其简要介绍:IISBackUp 功能:专注于备份和恢复IIS站点设置,包括网站配置文件、站点绑定信息、应用程序池设置、SSL证书和密钥信息等。 特点: 提供一种方便…

集合的通用遍历方法--java进阶day09

1.集合的三种通用遍历方法之前我们学习过集合的遍历方法,为什么这里还要再学呢? 这是因为,之前我们用的遍历方法使用了索引,但我们知道set接口的实现类的集合均无索引,所以我们要学习通用的遍历方法 2.迭代器遍历 1.迭代器 迭代器叫做Iterator,是一个接口,我们知道接口是…

安卓逆向:adb连接模拟器进行jeb动态调试

这篇文章的内容记录下我在各个文章搜索学习最后解决了安卓进行模拟器动态调试的方法。 参考的文章有: ADB:https://blog.csdn.net/Python_0011/article/details/132040387 ADB的使用https://blog.csdn.net/SM1555/article/details/112608576 Androidkiller:https://blog.csdn.…

Java中的Map CAS AQS

Java中的Map 1.基本介绍和api使用就免了 Java中的Map是一种用于存储键值对(Key-Value)的接口,属于java.util包,是集合框架的重要组成部分。 2.HashMap从图中的关系可以看出这些类间关系了。 ①基本分析 HashMap的一些属性 // 默认容量 16 static final int DEFAULT_INITIAL…