Python 函数

PythonBeginner
立即练习

介绍

在 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)。