欢迎来到CILMY23的博客
本篇主题为: 掌握Python函数:从Hello World到高级技巧
个人主页:CILMY23-CSDN博客
系列专栏:Python | C++ | C语言 | 数据结构与算法
感谢观看,支持的可以给个一键三连,点赞关注+收藏。
目录
一、函数的定义与调用
什么是函数?
在Python中,函数是组织好的,可重复使用的,用来实现单一或相关联功能的代码块,也是一段可重复使用的代码块,用于执行特定任务或操作。函数可以接受输入参数,并且可以返回一个结果。使用函数可以将代码模块化,提高代码的可读性和可维护性。
python中的函数分内建函数和自定义函数,
内建函数(Built-in Functions):
- 这些函数是Python语言提供的内置函数,无需额外导入任何模块即可直接使用。
- 例如,print(),len(),input()等都是内建函数。
- 内建函数通常用于执行常见的任务,如输出、数据处理、类型转换等。
自定义函数(Custom Functions):
- 这些函数是由开发者根据需要自行定义的函数。
- 通过使用
def
关键字来定义函数,并在需要时调用它们。 - 自定义函数可以根据具体需求来实现各种功能,使得代码更加模块化、可维护和可重用。
我们接下来说的函数都是自定义函数
1.1 函数的定义
自定义函数的格式为:
# 1.1 自定义函数
def 函数名(参数1,参数2,参数3.......):
""" 函数的说明文档 """
函数体
return 返回值
- 函数关键字: 函数以关键字 def 开头,后接函数名和圆括号 ()
- 函数内容: 函数内容用 : 起始,并且加一层缩进
- 函数名: 函数名遵循标识符命名规则,函数名最好是用英文命名
- 参数: 必须放在圆括号中间,称为形式参数,简称形参,这些参数是函数在执行时所需的输入,可以有零个或多个形参,中间用逗号隔开
- 函数说明: 三重引号内的内容是函数的说明文档,用于描述函数的功能、参数、返回值等信息。它是可选的,但是良好的文档能够提高代码的可读性和可维护性。
- 函数体: 函数体包含了具体的代码实现,是函数执行的主要部分。在函数体内部,你可以编写实现特定功能的代码,使用参数传递的数据,执行各种操作。如果函数体为 pass 语句,则表示什么事都不做
- 返回值: 当函数结束时,return语句用于指定函数的返回值。在函数体内部,当遇到return语句时,函数会立即停止执行,并返回指定的值给调用函数的地方。返回值可以是任何Python数据类型,包括数字、字符串、列表、字典等。如果没有return,则默认返回None
1.2 函数的调用
例如:定义一个hello函数
# 1.2 函数的调用
def hello():
return """hello world!"""
print(hello())
结果如下:
函数调用时的顺序如下:
- 执行函数调用前的语句
- 执行函数调用,运行被调用函数内的语句,并返回相应结果
- 执行函数调用后的语句
函数调用的注意事项我们结合之后的第二点实参和形参讲。
1.3 函数成员
在python中,函数是一种对象,因此函数可以有自己的成员,也可以为函数动态增加、修改和删除成员。(了解对象可以看链接),我们用 . 添加成员,del 关键字删除成员
例如:
# 1.3 函数成员
def my_func():
print("This is my function")
# 添加一个成员到函数对象上
my_func.author = "John Doe"
# 访问函数的成员
print("Author:", my_func.author) # 输出: Author: John Doe
# 删除成员
del my_func.author
注意,如果我们在函数内部添加了成员,这个成员在函数外部是无法删除的,有的也把函数成员称为函数属性,二者是相同的。
二、函数参数
2.1 实参与形参
在函数调用和函数定义中,我们通常会遇到两个概念:实际参数(Arguments)和形式参数(Parameters)简称 实参和形参。
- 形参(Parameters):在函数定义时,用来接收传递给函数的值的变量称为形参。形参是在函数定义时指定的,它们充当了函数内部的变量,用于接收外部传入的数据。
- 实参(Arguments):在函数调用时,实参是传递给函数的具体值。它们是函数调用时提供给函数的数据。
# 2.1 实参和形参
def add(a,b):
return a + b
print(add(3,5))
在上述代码中,a和b就是形参,3,5就是实参。所以形参是函数定义中的占位符,用来接收实际参数的值,而实参则是在函数调用时提供给函数的具体值。函数调用的时候形参和实参的个数和顺序是一一对应的,从左向右的结合性。
2.2 参数传递
python中的对象可分为不可变对象(数字、字符串、元组等)和可变对象(列表、字典、集合等)对应地,python函数的参数传递也有以下两种情况:
- 实参为不可变对象: 当实参为不可变对象时,函数调用是将实参的值复制一份给形参。在函数调用中修改形参时,不会影响函数外面的实参。
- 实参为可变对象: 当实参为可变对象时,函数调用是将实参的引用复制给形参。在函数调用中修改形参时,函数外面的实参也会随之改变。
不过上述的第一种传递我们更习惯说是传值调用,第二种传递更称为传引用调用。
更深入的说法如下:
按值传递(传值调用)和按引用传递(传址调用)。这两种方式的区别在于传递的是数据的值还是数据的引用(内存地址)。
按值传递:
- 在按值传递中,函数接收的是实参的值的副本,对形参的修改不会影响实参的值。
- 函数内部对形参的修改不会影响到函数外部的实参。
按引用传递:
- 在按引用传递中,函数接收的是实参的引用(内存地址),形参指向的是实参的内存地址,因此对形参的修改会影响到实参的值。
- 函数内部对形参的修改会直接影响到函数外部的实参。
实际上,我们创建变量,就是在内存地址中开辟空间,这个空间有唯一的标识 --- 内存地址,如果我们知道了地址,我们就可以修改内部空间的值。 传引用实际上就是知道了外部实参的地址位置,可以直接修改位置。(可以看链接了解一下地址)
例如:定义一个函数Swap(x,y),交换内部的两个值。
def swap(x, y):
temp = x
x = y
y = temp
a = 5
b = 10
print("Before swapping:")
print("a =", a)
print("b =", b)
swap(a, b)
print("After swapping:")
print("a =", a)
print("b =", b)
结果:
因为是传值调用,所以外部的实参并不会因为内部的形参改变而改变。
例如:如果我们要传引用调用,这里使用列表演示
def swap(arr):
arr[0], arr[1] = arr[1], arr[0]
arr = [5, 10]
print("Before swapping:")
print("arr =", arr)
swap(arr)
print("After swapping:")
print("arr =", arr)
结果:
2.3 参数类型
调用函数时,可使用的正式参数类型包括:必须参数,关键字参数,默认参数和不定长参数。
2.3.1 必需参数
必需参数也称位置参数(调用函数时根据函数定义的参数位置来传递参数),它要求函数调用时传入的实参个数、顺序和函数定义时形参的个数、顺序完全一致。
例如:
#2.3.1 必需参数
def add(a,b):
return a + b
print(add(3,))
如果我将5删除,则pycharm就会报错
2.3.2 关键字参数
关键字参数是一种在函数调用中使用的参数形式,它们与函数定义中的形参相对应,通过指定形参名来传递参数值。这种传递方式使得在函数调用时可以不必考虑参数的顺序,而只需指定参数名即可。
例如:
#2.3.2 关键字参数
def greet(name, message):
return f"{message}, {name}!"
# 使用关键字参数调用函数
print(greet( message="Hi",name="Bob"))
结果:
说白了,关键字参数就是通过“键=值”形式加以指定,有点类似组合类型中的字典,这样可以直接忽略参数顺序。
2.3.3 默认参数
默认参数又被称为缺省参数(点击链接跳转查看C++缺省参数),我们更习惯叫它缺省参数,缺省参数是在定义函数时为参数指定的一个默认值,当调用函数时没有提供对应参数的值时,将会使用这个默认值。
例如:
#2.3.3 缺省参数
def greet(name, message = "hello"):
return f"{message}, {name}!"
# 使用关键字参数调用函数
print(greet("job"))
print(greet( message="Hi",name="Bob"))
结果:
2.3.4 不定长参数
不定长参数也叫可变参数。用于不确定调用的时候会传递多少个参数(不传参也可以)的场景。不定长参数有如下两种形式:
- *args: 将接收的多个参数放入一个元组中
- **kargs:将显示赋值的多个参数放入字典中
例如:
# 2.3.4 不定长参数
def sum_values(*args):
result = 0
for num in args:
result += num
return result
print(sum_values(1, 2, 3))
print(sum_values(1, 2, 3, 4, 5))
结果:
*args 表示可以接受任意数量的位置参数,并将它们存储在一个元组中。在函数体内,我们遍历这个元组并计算所有参数的总和,从而实现了对任意数量参数的求和。
类似地,可以使用**kargs表示接受任意数量的关键字参数,它会将这些关键字参数存储在一个字典中。
例如:
def print_values(**kwargs):
for key, value in kwargs.items():
print(f"{key}: {value}")
print_values(a=1, b=2, c=3)
结果:
补充:kwargs.items () 是字典类型的方法,用于获取字典中所有键值对(key-value pairs).
三、函数的嵌套
嵌套函数指在一个函数(称为外函数)中定义了另外一个函数(称为内函数)。
# 三、 函数的嵌套
def outer_function(): # 外函数
print("This is outer function.")
def inner_function(): # 内函数
print("This is inner function.")
inner_function() # 在外函数内部调用内函数
# 调用外函数
outer_function()
结果如下:
嵌套函数中的内函数只能在外函数中调用,不能在外函数外面调用。
例如:
# 三、 函数的嵌套
def outer_function(): # 外函数
print("This is outer function.")
def inner_function(): # 内函数
print("This is inner function.")
inner_function() # 在外函数内部调用内函数
# 调用外函数
outer_function()
inner_function() # 在外函数外部调用内函数
结果:
四、函数的说明文档
函数的说明文档(docstring)是在函数定义中用来描述函数功能、参数、返回值等信息的字符串。它是可选的。
在Python中,通常使用三重引号 """
来定义函数的说明文档,放置在函数定义的第一行或者紧随其后。
def greet(name):
"""
这个函数用于向指定的名字打招呼。
参数:
name -- 要打招呼的名字。
返回值:
一个包含打招呼消息的字符串。
"""
return f"Hello, {name}!"
要查看函数的说明文档,可以使用Python内置的 help()
函数或者查看函数的 __doc__
属性
help(greet)
print(greet.__doc__)
感谢各位同伴的支持,本期python就讲解到这啦,如果你觉得写的不错的话,可以给个一键三连,点赞关注+收藏,若有不足,欢迎各位在评论区讨论。