介绍
在 Python 中,函数是一段组织良好、可重用的代码块,用于执行单个、相关的操作。函数可以为你的应用程序提供更好的模块化和高度的代码复用性。
在这个 Lab 中,你将学习创建和使用 Python 函数的基础知识。你将练习定义接受参数的函数、使用关键字参数以提高清晰度、返回值、理解局部变量和全局变量作用域的区别,以及使用 lambda 创建简洁的匿名函数。
函数参数
在这一步,你将学习如何定义一个接受参数的函数。函数可以接收 arguments(参数),这些是你调用函数时传递给它的值。
注意: 如果你不熟悉使用 WebIDE(类似 VS Code),请先在 这个实验 中学习。
让我们创建一个接受 name 参数并打印个性化问候的函数。
首先,从左侧的文件浏览器中打开文件 arguments.py。
接下来,将以下代码复制并粘贴到 arguments.py 文件中。这段代码定义了一个名为 say_hello 的函数,它接受一个参数 name。
## Define a function that takes one argument
def say_hello(name):
print(f'Hello {name}')
## Call the function with a string argument
say_hello('Carlos')
say_hello('Wanda')
say_hello('Rose')
现在,让我们运行脚本。在 WebIDE 中打开一个终端并执行以下命令:
python3 arguments.py
你应该会看到函数使用不同的名字被调用,为每个人生成独特的问候语。
Hello Carlos
Hello Wanda
Hello Rose
这展示了参数如何使函数变得灵活且可重用。
关键字参数
在这一步,你将学习如何使用关键字参数(keyword arguments)来提高代码的可读性。当一个函数有多个形参(parameters)时,你可以通过使用形参的名称来指定哪个实参(argument)对应哪个形参。这被称为 keyword argument(关键字参数)。
当你使用位置参数(positional arguments)时,传递它们的顺序很重要。使用关键字参数时,顺序无关紧要,这使得你的代码更明确,更易于理解。
从文件浏览器中打开文件 keywords.py。将以下代码复制并粘贴到其中。
## Function with multiple parameters
def say_hi(name, greeting):
print(f"{greeting} {name}")
## Positional arguments: order matters
print("Calling with positional arguments:")
say_hi('John', 'Hello')
## Keyword arguments: order doesn't matter, more readable
print("\nCalling with keyword arguments:")
say_hi(name='Anna', greeting='Hi')
现在,从终端运行脚本:
python3 keywords.py
你将看到两次函数调用的输出。注意关键字参数如何允许你按任意顺序传递值。
Calling with positional arguments:
Hello John
Calling with keyword arguments:
Hi Anna
返回值
在这一步,你将探索如何使用 return 语句使函数产生一个输出。虽然 print() 将值显示到控制台,但 return 会将一个值从函数中返回。这个被返回的值可以存储在一个变量中,或用于其他表达式。
让我们创建一个接受两个数字、将它们相加并返回结果的函数。
打开文件 returns.py 并添加以下代码。函数 sum_two_numbers 计算总和,并使用 return 关键字输出结果。
## Function that returns a value using return statement
def sum_two_numbers(number_1, number_2):
return number_1 + number_2
## Call function and store the returned value
result = sum_two_numbers(7, 8)
print(result)
在终端执行脚本:
python3 returns.py
输出将是函数返回的值,该值存储在 result 变量中,然后被打印出来。
15
局部和全局作用域
在这一步,你将发现局部(local)和全局(global)变量作用域之间的区别。变量的作用域决定了它在代码的哪个位置可以被访问。
- **全局作用域 (Global Scope)**:定义在任何函数之外的变量处于全局作用域,可以从代码的任何位置访问,包括函数内部。
- **局部作用域 (Local Scope)**:在函数内部创建的变量处于该函数的局部作用域。它们只存在于该函数内部,从外部无法访问。
我们首先看看尝试从全局作用域访问局部变量时会发生什么。如果你运行以下代码,它会引发一个 NameError,因为 local_variable 在全局作用域中未被定义。
## This code will cause an error
global_variable = 'I am available everywhere'
def some_function():
print(global_variable)
local_variable = "only available within this function"
print(local_variable)
## This will raise NameError because local_variable doesn't exist here
## print(local_variable)
global 语句
如果你需要在函数内部修改一个全局变量,你必须使用 global 语句明确告诉 Python 你正在这样做。
打开文件 scope.py 并添加以下代码。在这里,函数 spam 使用 global 关键字来修改全局变量 eggs。
## Use 'global' keyword to modify global variable from inside function
def spam():
global eggs ## Declare that we're modifying the global variable
eggs = 'spam' ## This changes the global variable
eggs = 'global'
print(f"Before calling spam(), eggs is: {eggs}")
spam() ## Function modifies global variable
print(f"After calling spam(), eggs is: {eggs}")
现在,运行脚本:
python3 scope.py
观察输出。全局变量 eggs 的值被函数调用永久改变了。
Before calling spam(), eggs is: global
After calling spam(), eggs is: spam
Lambda 函数
在这一步,你将学习如何使用 lambda 关键字创建匿名的、单行的函数。Lambda 函数可以有任意数量的参数,但只能有一个表达式。它们非常适合创建小的、临时的函数,而无需使用标准 def 函数定义的开销。
例如,一个用于将两个数字相加的常规函数:
## Regular function definition
def add(x, y):
return x + y
这等同于以下 lambda 函数:
## Lambda function: anonymous function defined in one line
add = lambda x, y: x + y
Lambda 也可以作为词法闭包(lexical closures)工作,这意味着它们可以“记住”在它们被创建的外层作用域中的一个值。让我们创建一个返回 lambda 的函数。
打开文件 lambdas.py 并添加以下代码。函数 make_adder 接受一个数字 n,并返回一个新的 lambda 函数,该函数将 n 加到任何数字 x 上。
## Lambda closure: lambda function that captures a variable from the outer scope
def make_adder(n):
return lambda x: x + n ## Lambda captures 'n' from the outer function
## Create a function that adds 3
plus_3 = make_adder(3)
## Use the new function
result = plus_3(4) ## This will be 4 + 3
print(result)
从你的终端运行脚本:
python3 lambdas.py
输出显示了调用由 make_adder 创建并返回的 lambda 函数的结果。
7
你也可以创建其他的加法器,例如 plus_5 = make_adder(5),这将创建一个将 5 加到其参数上的函数。
总结
在本次实验(Lab)中,你探索了 Python 中函数的核心概念。你学习了如何定义函数以及如何使用参数向函数传递信息。你练习了使用位置参数 (positional arguments) 和关键字参数 (keyword arguments) 来使函数调用更清晰。你还学习了如何使用 return 语句让函数产生结果,如何使用局部和全局作用域(scope)管理变量的可访问性,以及如何使用 global 关键字来修改函数外部的变量。最后,你了解了匿名 lambda 函数的强大和简洁性,它可用于创建简单的单行函数和闭包(closures)。



