Python 零基础教程

Python 函数:参数与返回值

函数是 Python 中编写可重用代码的基础构建块。它们允许你将执行特定任务的代码块封装起来,然后你可以在程序的不同部分多次执行它。这提升了代码的组织性、可读性,并减少了冗余。

在本章中,我们将深入探讨如何定义函数,重点关注如何使用参数将信息传递给函数,以及如何使用返回值从函数获取结果。

1. 定义带参数的函数

参数(Parameters)是你在函数定义的圆括号内定义的变量。它们充当占位符,用于接收你在调用函数时传递给它的值。这些传递进来的值被称为参数值或实参(Arguments),函数会使用它们来执行计算或操作。

1.1 基础参数用法

让我们从一个简单的例子开始:一个通过名字向人打招呼的函数。

def greet(name):
  """这个函数向作为参数传入的人打招呼。"""
  print(f"你好,{name}!")

# 使用实参调用函数
greet("Alice")  # 输出: 你好,Alice!
greet("Bob")    # 输出: 你好,Bob!

在这个例子中,name 是参数(Parameter)。当我们调用 greet("Alice") 时,字符串 "Alice" 就是传递给 name 参数的实参(Argument)。随后,函数使用这个值来构建问候语。

1.2 多个参数

函数可以接收多个参数。在函数定义中定义参数的顺序,就是你在调用函数时必须传递实参的顺序。

def describe_person(name, age, city):
  """这个函数根据姓名、年龄和城市来描述一个人。"""
  print(f"{name} 今年 {age} 岁,住在 {city}。")

# 使用多个实参调用函数
describe_person("Charlie", 30, "New York") # 输出: Charlie 今年 30 岁,住在 New York。
describe_person("Diana", 25, "London")     # 输出: Diana 今年 25 岁,住在 London。

在这里,nameagecity 都是参数。调用函数时,我们必须按相同的顺序提供实参:先是姓名,然后是年龄,最后是城市。

1.3 默认参数值

你可以为参数分配默认值。如果调用者在调用函数时没有为带有默认值的参数提供实参,程序就会使用该默认值。

def power(base, exponent=2):
  """这个函数计算数字的乘方。
  如果没有提供指数 (exponent),它将默认为 2(即计算平方)。"""
  result = base ** exponent
  return result

# 使用一个实参调用函数(使用默认的指数)
square = power(5)  # base=5, exponent=2 (默认)
print(square)      # 输出: 25

# 使用两个实参调用函数(覆盖默认的指数)
cube = power(5, 3) # base=5, exponent=3
print(cube)        # 输出: 125

在这个例子中,exponent 的默认值为 2。如果我们调用 power(5),函数会计算 5 的 2 次方。如果我们调用 power(5, 3),函数则会计算 5 的 3 次方。

1.4 关键字参数

在调用函数时,你可以使用关键字参数来明确指定哪个实参对应哪个参数。这允许你以任何顺序传递实参,只要你指定了参数的名称即可。

def describe_pet(animal_type, pet_name):
  """显示关于宠物的信息。"""
  print(f"\n我有一只 {animal_type}。")
  print(f"我的 {animal_type} 的名字叫 {pet_name}。")

describe_pet(animal_type='hamster', pet_name='Harry')
describe_pet(pet_name='Lucy', animal_type='dog')

使用关键字参数可以提高代码的可读性,尤其是当一个函数有很多参数的时候。

1.5 结合位置参数与关键字参数

你可以在一次函数调用中混合使用位置参数(按顺序提供的实参)和关键字参数。但是,位置参数必须放在关键字参数之前

def format_name(first_name, last_name, middle_name=''):
    """格式化名字。"""
    if middle_name:
        full_name = f"{first_name} {middle_name} {last_name}"
    else:
        full_name = f"{first_name} {last_name}"
    return full_name.title()

print(format_name("john", "doe"))
print(format_name("john", "doe", middle_name="david"))
print(format_name("john", last_name="doe", middle_name="david")) # 正确

# print(format_name("john", middle_name="david", "doe")) # 错误 - 位置参数出现在了关键字参数之后

2. 从函数返回值

函数可以使用 return 语句将一个值返回给调用者。返回的值可以是任何数据类型(整数、浮点数、字符串、列表等)。如果一个函数没有 return 语句,它会隐式地返回 None

2.1 基础返回值

def add(x, y):
  """这个函数将两个数字相加并返回结果。"""
  sum_result = x + y
  return sum_result

# 调用函数并将返回的值存储在变量中
result = add(3, 5)
print(result)  # 输出: 8

在这个例子中,add 函数返回了 xy 的和。返回的值随后被赋值给了 result 变量。

2.2 返回多个值

Python 允许你从一个函数中返回多个值。这些值实际上是作为一个元组 (tuple) 被返回的。

def calculate_stats(numbers):
  """这个函数计算数字列表的总和与平均值。"""
  total = sum(numbers)
  average = total / len(numbers)
  return total, average

# 调用函数并解包返回的元组
numbers = [1, 2, 3, 4, 5]
sum_result, average_result = calculate_stats(numbers)
print(f"总和: {sum_result}, 平均值: {average_result}")  # 输出: 总和: 15, 平均值: 3.0

在这里,calculate_stats 返回了列表中数字的总和与平均值。然后调用者可以将返回的元组“解包 (unpack)”到独立的变量中。

2.3 条件返回

你可以使用条件语句根据不同的情况返回不同的值。

def is_even(number):
  """这个函数检查一个数字是否为偶数并返回 True 或 False。"""
  if number % 2 == 0:
    return True
  else:
    return False

# 调用函数并检查返回的值
print(is_even(4))  # 输出: True
print(is_even(7))  # 输出: False

在这个例子中,如果数字是偶数,is_even 函数返回 True,否则返回 False

2.4 返回 None

如果一个函数没有显式地返回一个值,它就会隐式地返回 None。这通常用于执行某个操作(比如打印日志、修改全局变量)但不需要返回特定结果的函数。

def print_message(message):
  """这个函数将一条消息打印到控制台。"""
  print(message)
  # 这里没有 return 语句

# 调用函数并检查返回的值
result = print_message("Hello, world!")
print(result)  # 输出: None