目录
1. 函数介绍
1.1 函数组成
1.2 关键术语
1.2.1 函数定义
1.2.2 形参和实参
1.2.3 返回值
2. 函数的调试
3. 变量的作用域
3.1 作用域分类
3.1.1 局部作用域
3.1.2 全局作用域
3.1.3 嵌套作用域
3.1.4 内置作用域
3.2 函数的参数类型
3.2.1 位置参数
3.2.2 默认参数
3.2.3 关键字参数
3.2.4 可变参数
3.2.5 可变关键值参数
3.3 匿名函数
3.4 递归函数
1. 函数介绍
在 Python 中,函数是一段可重复使用的代码块,用于实现特定的功能,函数又叫做方法,英文就是 function。函数接受参数(可选)并返回一个值(可选)。通过使用函数,可以将代码分解为更小的、可组合和可复用的模块,使程序更加清晰、简洁和易于维护。
1.1 函数组成
函数主要由以下几个部分组成:
- 函数头:包含
def
关键字、函数名和参数列表。参数列表指定了函数接受的输入值,可以有零个或多个参数。 - 函数体:包含在函数内部执行的代码块。函数体中的代码实现了特定的功能。
- 返回语句:可选的,用于指定函数的返回值。如果没有返回语句,函数将默认返回
None
。
1.2 关键术语
1.2.1 函数定义
函数的定义要用到关键字 def ,其实就是英文单词 define(定义) 的缩写。后面加上函数名,可以任意选取,但要注意不要和 python中的关键字重复。然后是 ()和 :。函数中的代码块要缩进。
下面是一个简单的示例函数:
# 定义函数名为 add_numbers 的函数
def add_numbers(a, b):
result = a + b
return result
代码中使用了参数和 return,下文会进行详细解释。
函数调用:
add_numbers(2, 3)
对,就是直接写函数名加括号,当定义时加入了形参,使用时就必须加上实参。往下看。
1.2.2 形参和实参
简单说,位于函数名后面的变量通常称为形参,而调用函数时提供的值称为实参。
详细来讲,形参没有固定值,其值是通过函数调用时实参为其赋予的,实参就是实际参数,你调用函数时写入参数。很抽象,看代码。
def add_numbers(a, b):
result = a + b
return result
total = add_numbers(2, 3)
# 打印函数返回值
print(total)
输出结果:5
上面的代码沿用了 1.2.1 的代码,其中在调用函数时写入的 2 和 3 就是实参,定义函数时写入的 a 和 b 就是形参。调用函数,实参按位置顺序把 2 赋值给 a,3 赋值给 b。请往下看。
1.2.3 返回值
简单说,返回值就是函数结束后的计算结果。
1.2.2 中的代码 add_numbers
函数接受两个参数 a
和 b
,并将它们相加得到结果。通过 return
语句,函数返回了计算的结果,即 result
。然后,我们将函数调用的返回值存储在 total 变量中,并打印输出,得到结果 5。
详细介绍:
函数的返回值是指函数执行完毕后,通过
return
语句返回的结果。它可以是任何有效的 Python 对象,包括数字、字符串、列表、字典等等。函数的返回值可以在调用该函数的地方进行进一步处理或使用。当函数执行到
return
语句时,会立即退出函数,并将指定的值作为函数的返回值返回给调用者。如果函数没有显式地使用return
语句,或者没有指定返回值,函数将默认返回None
。
2. 函数的调试
如果你使用的是 pycharm,请看下面的操作。
在 total 那行打上断点:
点击右上角的调试按钮:
然后在调试框里点步入按钮就行了:
这样你就会发现代码执行提示进入到了函数中。自己动手试一下。
3. 变量的作用域
在 Python 中,函数内部和函数外部的变量存在不同的作用域。作用域定义了变量的可见性和访问范围。
3.1 作用域分类
3.1.1 局部作用域
局部作用域(Local Scope):局部作用域是在函数内部定义的变量的作用域。这些变量只能在函数内部访问,对于函数外部来说是不可见的。当函数执行完毕后,局部变量将被销毁。
def my_function():
x = 10 # 局部变量
print(x)
my_function() # 输出 10
print(x) # 报错,x 在函数外部不可见
此函数执行的话会报错,因为 x 只能在函数内部被访问。
3.1.2 全局作用域
全局作用域(Global Scope):全局作用域是在函数外部定义的变量的作用域。这些变量可以在整个程序中的任何地方访问。全局变量在程序开始执行时创建,并在程序结束后销毁。
x = 10 # 全局变量
def my_function():
print(x)
my_function() # 输出 10
print(x) # 输出 10
x 可以被访问是因为它在函数被定义之前声明,且处于函数外部。 但是不能改变,如果非要改动其值的话可以用 global 声明,由于并不建议用,所以不在用代码介绍,如果想了解可以问下 C 老师(Chat GPT)。
3.1.3 嵌套作用域
嵌套作用域(Nested Scope):嵌套作用域是指函数内部可以访问函数外部的变量,但不包括全局作用域。如果在函数内部定义了一个与外部变量同名的变量,则会创建一个新的局部变量。在函数内部访问变量时,首先查找局部作用域,然后是嵌套作用域,最后是全局作用域。
x = 10 # 全局变量
def my_function():
x = 5 # 嵌套作用域,与全局作用域的 x 不同
print(x)
my_function() # 输出 5
print(x) # 输出 10
这是由于函数内部又声明了 x,这就等于在函数内部新创建了一个局部变量 x,与外部变量无关。
3.1.4 内置作用域
内置作用域(Built-in Scope):内置作用域是指 Python 内置的函数和变量的作用域。这些函数和变量可以直接在代码中使用,无需导入任何模块。例如,print()
和 len()
函数就属于内置作用域。
def my_function():
print(len("Hello"))
my_function() # 输出 5
3.2 函数的参数类型
3.2.1 位置参数
位置参数(Positional Arguments):位置参数是指根据参数的位置来传递值的参数。当调用函数时,按照定义函数时的参数顺序依次传递对应的值。
def add_numbers(a, b):
return a + b
result = add_numbers(2, 3)
print(result) # 输出 5
在上述例子中,a
和 b
是位置参数,在调用 add_numbers
函数时需要按照顺序传递对应的值。
3.2.2 默认参数
默认参数(Default Arguments):默认参数是在函数定义时为参数提供默认值的参数。如果在函数调用时没有传递该参数的值,将使用默认值。
def greet(name, message="Welcome"):
print(f"Hello, {name}! {message}")
greet("John")
# 输出 "Hello, John! Welcome"
greet("Emily", "Good morning")
# 输出 "Hello, Emily! Good morning"
在上述例子中,message
是默认参数,定义时提供了默认值 "Welcome"。在第一个函数调用中,由于没有传递 message
的值,所以使用了默认值。而在第二个函数调用中,显式指定了 message
的值为 "Good morning"。
3.2.3 关键字参数
关键字参数(Keyword Arguments):关键字参数是指通过参数名来传递值的参数。在函数调用时,指定参数名和对应的值,可以不按照参数定义的顺序传递值。
def greet(name, message):
print(f"Hello, {name}! {message}")
greet(message="Welcome to our website.", name="John")
# 输出 "Hello, John! Welcome to our website."
在上述例子中,name
和 message
是关键字参数。函数调用时,通过参数名指定对应的值,可以不考虑参数定义的顺序。
3.2.4 可变参数
可变参数(Variable Arguments):可变参数是指可以接受任意数量参数的参数。在函数定义时,使用 *args
表示可变参数,在函数体内,args
将作为一个元组来存储传递给函数的所有参数。
def calculate_sum(*args):
total = 0
for num in args:
total += num
return total
result = calculate_sum(1, 2, 3, 4)
print(result) # 输出 10
在上述例子中,args
是可变参数,它可以接受任意数量的参数。在函数调用时,我们传递了四个整数作为参数,这些参数将被打包成一个元组 (1, 2, 3, 4)
。
3.2.5 可变关键值参数
可变关键字参数(Variable Keyword Arguments):来接收任意数量的关键字参数,这些参数以字典的形式传递给函数。可变字典参数使用双星号(**)进行声明。
下面是一个示例,演示了如何在函数中使用可变字典参数:
def print_info(**kwargs):
for key, value in kwargs.items():
print(f"{key}: {value}")
print_info(name="Alice", age=25, city="New York")
输出结果:
name: Alice
age: 25
city: New York
可变字典参数允许我们以一种灵活的方式传递多个关键字参数给函数,而无需提前指定参数的名称和数量。它特别适用于处理具有动态属性的对象或需要处理大量可选参数的函数。
注意:可变字典参数只能出现在函数定义中的最后一个位置参数后面,因为它会捕获所有未匹配的关键字参数。如果在函数定义中同时使用了可变字典参数和其他类型的参数,例如位置参数或默认参数,那么调用函数时需要按照相应的顺序传递参数。
3.3 匿名函数
在 Python 中,匿名函数(Anonymous Functions),也被称为 lambda 函数,是一种没有函数名的小型函数。匿名函数通常用于需要一个简单函数的场景,而不想定义整个函数。
lambda 函数的语法如下:
lambda arguments: expression
其中,arguments
是函数的参数列表,可以包含零个或多个参数,用逗号分隔。expression
是函数的返回值表达式。
以下是一个使用 lambda 函数的示例,计算两个数的和:
add = lambda x, y: x + y
result = add(3, 5)
print(result) # 输出 8
在这个例子中,我们定义了一个匿名函数 lambda x, y: x + y
,它接受两个参数 x
和 y
,并返回它们的和。然后,我们将这个匿名函数赋值给变量 add
。最后,我们调用 add(3, 5)
,得到结果 8,并打印出来。
除了上面的示例,lambda 函数还可以用于更复杂的操作,例如排序、过滤等。它通常与内置函数 map()
、filter()
、reduce()
等一起使用,以提供更简洁的代码。
注意:虽然 lambda 函数很方便,但由于其简化的语法,只能表示一些简单的逻辑。如果需要编写更复杂的函数,建议使用常规的函数定义。
3.4 递归函数
在 Python 中,递归(Recursion)是一种函数调用自身的技术。递归函数通常用于处理具有重复结构或需要进行深度遍历的问题。
下面是一个使用递归计算斐波那契数列的示例:
def fibonacci(n):
if n <= 1:
return n
else:
return fibonacci(n-1) + fibonacci(n-2)
# 输出前 10 个斐波那契数列
for i in range(10):
print(fibonacci(i), end=" ")
输出结果:0 1 1 2 3 5 8 13 21 34
注意:递归函数可能会导致栈溢出或性能问题,因此应该谨慎使用。在实际开发中,建议使用迭代等其他技术来替代递归。
over,持续更新中,如果想获取更多连续递进的python相关知识,可以关注我哦🌹🌹🌹