Python快速入门专业版(二十六):Python函数基础:定义、调用与返回值(Hello函数案例)

目录

在编程中,当一段代码需要重复使用(如多次计算圆面积、反复验证用户输入),或者逻辑复杂需要单独封装时,函数就成为了必不可少的工具。函数是Python中组织代码的基本单元,它能将一段逻辑完整的代码块封装起来,实现"一次定义,多次调用",大幅提升代码的复用性和可读性。

本文将从函数的核心作用讲起,详细介绍函数的定义语法、调用方式和返回值处理,通过"Hello函数""加法函数""圆面积计算函数"等案例,帮助你掌握函数的基础用法,理解函数在模块化编程中的核心价值。

一、函数的核心作用:代码复用与模块化

想象一个场景:你需要在程序的10个不同位置打印"Hello, World!"。如果不使用函数,你需要重复编写10次print("Hello, World!");如果使用函数,只需定义一次打印逻辑,然后在10个位置调用即可。这就是函数的核心价值------代码复用

函数的作用远不止于此:

  • 模块化:将复杂程序拆分为多个功能独立的函数,每个函数专注于解决一个小问题,使程序结构清晰,便于调试和维护。
  • 抽象逻辑 :通过函数名即可理解功能(如calculate_area()显然是计算面积的函数),无需关心内部实现细节。
  • 参数化 :通过参数传递不同的值,使函数能处理多种情况(如add(2,3)add(5,8)用同一个函数实现不同计算)。

二、函数的定义:用def关键字创建函数

在Python中,函数通过def关键字定义,基本语法结构如下:

python 复制代码
def 函数名(参数列表):
    """函数文档字符串(可选,用于说明函数功能)"""
    函数体(实现功能的代码块,必须缩进)
    return 返回值(可选,用于返回结果)
  • def:定义函数的关键字,必须放在函数名前。
  • 函数名 :遵循Python命名规则(字母、数字、下划线组成,不能以数字开头),建议使用小写字母和下划线(如say_hellocalculate_area),见名知意。
  • 参数列表 :函数接收的输入值,多个参数用逗号分隔,无参数时留空(())。
  • 函数体:实现函数功能的代码,必须缩进(通常4个空格)。
  • return :可选,用于将结果返回给调用者;若省略,函数默认返回None
  • 文档字符串 :用三引号包裹的说明文字,可通过help(函数名)查看,增强代码可读性。

1. 无参数函数:不需要输入的函数

当函数不需要外部输入即可完成功能时,参数列表为空。最典型的例子是打印固定信息的函数。

示例1:定义并调用无参数的say_hello函数

python 复制代码
# 定义无参数函数
def say_hello():
    """打印Hello, World!"""
    print("Hello, World!")

# 调用函数(函数名+括号)
say_hello()  # 输出:Hello, World!
say_hello()  # 再次调用,输出同样结果

执行流程解析

  1. def say_hello():定义函数:创建一个名为say_hello的函数,无参数,函数体为打印"Hello, World!"。
  2. say_hello()调用函数:程序跳转到函数定义处,执行print语句,然后回到调用位置继续执行。
  3. 再次调用时,重复步骤2,实现代码复用。

2. 有参数函数:接收外部输入的函数

大多数情况下,函数需要根据外部输入的不同值执行不同操作,这时就需要定义参数。参数相当于函数内部的变量,其值由调用者传入。

示例2:定义并调用带参数的greet函数

python 复制代码
# 定义带一个参数的函数
def greet(name):
    """向指定姓名的人打招呼"""
    print(f"Hello, {name}!")

# 调用函数时传入参数
greet("Alice")  # 输出:Hello, Alice!
greet("Bob")    # 输出:Hello, Bob!

解析

  • 函数定义时,name形式参数(简称"形参"),表示函数需要接收一个输入。
  • 调用函数时,"Alice""Bob"实际参数 (简称"实参"),会被赋值给形参name
  • 函数体通过name使用外部传入的值,实现"向不同人打招呼"的灵活功能。

示例3:带多个参数的函数(计算两数之和)

python 复制代码
# 定义带两个参数的函数
def add(a, b):
    """计算两个数的和并返回"""
    result = a + b
    return result  # 返回计算结果

# 调用函数,传入两个实参
sum1 = add(3, 5)   # 实参3赋值给a,5赋值给b,返回8
sum2 = add(10, 20) # 返回30

print(sum1)  # 输出:8
print(sum2)  # 输出:30

解析

  • 函数add有两个形参ab,分别接收两个加数。
  • 函数体计算a + b,并通过return result将结果返回给调用者。
  • 调用时,返回值被赋值给变量sum1sum2,实现了"复用加法逻辑"的目的。

三、函数的返回值:用return传递结果

return语句用于将函数的计算结果传递给调用者,是函数与外部通信的重要方式。它有以下特性:

  1. 返回单个值:直接返回一个数据(数字、字符串、列表等)。
  2. 返回多个值:用逗号分隔多个值,Python会自动将它们封装为元组返回。
  3. 终止函数执行return语句执行后,函数会立即结束,后续代码不再执行。

1. 返回单个值

最常见的用法,如示例3中的add函数返回两数之和,或计算圆面积的函数返回面积值。

示例4:计算圆面积的函数(返回单个值)

python 复制代码
import math  # 导入数学模块,用于获取π值

def circle_area(radius):
    """根据半径计算圆的面积(πr²)"""
    if radius < 0:
        print("错误:半径不能为负数")
        return None  # 返回None表示无效结果
    area = math.pi * radius **2
    return area  # 返回面积值

# 调用函数
area1 = circle_area(2)  # 半径为2的圆面积
area2 = circle_area(-1) # 无效半径

print(f"半径为2的圆面积:{area1:.2f}")  # 输出:12.57(保留2位小数)
print(f"无效半径的返回值:{area2}")     # 输出:None

解析

  • 函数首先判断半径是否为负数,若无效则返回None(表示"无有效结果")。
  • 有效时计算面积并返回,调用者通过变量接收结果并使用。
  • return不仅返回值,还会终止函数(若半径为负,return None后不会执行面积计算)。

2. 返回多个值

当函数需要返回多个相关结果时(如同时返回两数之和与乘积),可在return后用逗号分隔多个值,调用者可用多个变量接收(自动解包)。

示例5:返回多个值的函数(求和与乘积)

python 复制代码
def calculate(a, b):
    """返回a与b的和、差、积"""
    sum_ab = a + b
    diff_ab = a - b
    product_ab = a * b
    return sum_ab, diff_ab, product_ab  # 返回多个值(自动封装为元组)

# 调用函数,用多个变量接收返回值
sum_val, diff_val, product_val = calculate(5, 3)

print(f"和:{sum_val}")     # 输出:8
print(f"差:{diff_val}")    # 输出:2
print(f"积:{product_val}") # 输出:15

# 也可以用单个变量接收(得到元组)
results = calculate(4, 2)
print(f"返回的元组:{results}")  # 输出:(6, 2, 8)

解析

  • return sum_ab, diff_ab, product_ab实际返回的是一个元组(sum_ab, diff_ab, product_ab)
  • 调用时,sum_val, diff_val, product_val = ...会自动解包元组,将三个值分别赋值给变量。
  • 若用单个变量接收(如results),则变量会存储整个元组,可通过索引访问其中的值(如results[0]获取和)。

3. 无return语句的函数

若函数没有return语句,或return后没有值,则默认返回None(Python中表示"无"的特殊值)。

python 复制代码
def print_greeting():
    print("Welcome!")  # 没有return语句

result = print_greeting()
print(f"函数返回值:{result}")  # 输出:None

四、函数的调用:执行函数并传递参数

定义函数后,需要通过"函数名(参数)"的方式调用才能执行其功能。调用时,实参的数量和类型需与函数定义的形参匹配(除非使用默认参数等高级特性)。

1. 位置参数:按顺序传递参数

最常用的参数传递方式,实参与形参按位置一一对应。

python 复制代码
def describe_person(name, age):
    """描述一个人的姓名和年龄"""
    print(f"{name}今年{age}岁")

# 位置参数:第一个实参给name,第二个给age
describe_person("张三", 25)  # 输出:张三今年25岁

注意:位置参数必须按顺序传递,否则会导致逻辑错误:

python 复制代码
# 错误示例:参数顺序颠倒
describe_person(25, "张三")  # 输出:25今年张三岁(逻辑错误)

2. 关键字参数:按名称传递参数

为避免位置错误,可在调用时指定"形参名=实参",明确参数对应关系,参数顺序可任意。

python 复制代码
# 关键字参数:明确指定参数对应的形参
describe_person(age=25, name="张三")  # 输出:张三今年25岁(顺序颠倒但结果正确)

适用场景:当函数参数较多时,关键字参数能提高代码可读性,避免因参数顺序错误导致的bug。

3. 函数调用的执行流程

函数调用时,程序的执行流程会发生跳转,具体步骤如下:

  1. 调用函数时,计算实参的值,传递给对应的形参。
  2. 程序跳转到函数定义处,执行函数体中的代码。
  3. 遇到return语句时,将返回值传递给调用者,程序跳转回调用位置。
  4. 若函数体执行完毕仍未遇到return,则返回None,程序跳转回调用位置。

示例6:函数调用流程演示

python 复制代码
def multiply(x, y):
    print("开始计算乘积...")
    result = x * y
    print("计算结束,准备返回结果")
    return result

print("程序开始")
product = multiply(3, 4)  # 调用函数
print(f"3×4的结果是:{product}")
print("程序结束")

执行流程与输出

复制代码
程序开始
开始计算乘积...
计算结束,准备返回结果
3×4的结果是:12
程序结束

解析

  • 程序先执行print("程序开始")
  • 调用multiply(3,4)时,跳转到函数内,执行打印和计算。
  • return result将12返回给product,程序跳转回调用处。
  • 继续执行后续的print语句。

五、综合案例:自定义数学工具函数

我们通过一个"数学工具"案例,综合应用函数的定义、调用和返回值,实现三个功能:计算绝对值、判断奇偶性、求两数中较大值。

1. 案例代码实现

python 复制代码
def absolute_value(num):
    """计算一个数的绝对值"""
    if num < 0:
        return -num  # 负数的绝对值是其相反数
    else:
        return num   # 非负数的绝对值是自身

def is_even(num):
    """判断一个数是否为偶数,返回布尔值"""
    return num % 2 == 0  # 能被2整除则为偶数

def max_of_two(a, b):
    """返回两个数中较大的那个数"""
    if a > b:
        return a
    else:
        return b

# 测试函数
if __name__ == "__main__":
    # 测试绝对值函数
    print(f"-5的绝对值:{absolute_value(-5)}")  # 输出:5
    print(f"3的绝对值:{absolute_value(3)}")    # 输出:3
    
    # 测试奇偶性判断
    print(f"6是否为偶数:{is_even(6)}")   # 输出:True
    print(f"7是否为偶数:{is_even(7)}")   # 输出:False
    
    # 测试求最大值
    print(f"4和9中较大的是:{max_of_two(4, 9)}")  # 输出:9
    print(f"10和5中较大的是:{max_of_two(10, 5)}") # 输出:10

2. 案例解析

  • 函数封装:每个函数专注于单一功能,代码逻辑清晰,可独立测试和复用。
  • 返回值设计
    • absolute_value返回数值(绝对值)。
    • is_even返回布尔值(True/False),适合直接用于条件判断。
    • max_of_two返回两个数中的较大值,便于后续计算。
  • 测试代码if __name__ == "__main__":确保测试代码仅在直接运行该文件时执行,当文件被导入为模块时不执行,符合模块化设计原则。

六、函数的参数默认值(进阶技巧)

为了让函数更灵活,Python允许为参数设置默认值:当调用者未传递该参数时,函数使用默认值;若传递了参数,则覆盖默认值。

python 复制代码
def greet(name="Guest"):
    """向指定姓名的人打招呼,默认是Guest"""
    print(f"Hello, {name}!")

greet("Alice")  # 传递参数,输出:Hello, Alice!
greet()         # 未传递参数,使用默认值,输出:Hello, Guest!

注意:带默认值的参数必须放在无默认值参数的后面(否则会报错):

python 复制代码
# 正确:无默认值参数在前,有默认值在后
def introduce(name, age=18):
    print(f"{name}今年{age}岁")

# 错误:有默认值参数不能放在无默认值参数前
# def introduce(age=18, name):
#     print(f"{name}今年{age}岁")  # SyntaxError

七、总结与练习

函数是Python编程的基础组件,本文核心知识点:

  • 定义语法def 函数名(参数): 函数体 return 返回值
  • 核心作用:代码复用(避免重复编写)、模块化(拆分复杂逻辑)。
  • 参数传递:位置参数(按顺序)和关键字参数(按名称),确保实参与形参匹配。
  • 返回值return可返回单个值或多个值(自动封装为元组),无return则返回None
  • 执行流程:调用时跳转至函数定义,执行后返回调用位置。

练习题目(从易到难)

  1. 定义一个无参数函数print_menu(),打印餐厅菜单(至少3个菜品)。
  2. 定义一个带参数的函数calculate_rect_area(length, width),返回长方形的面积。
  3. 定义一个函数get_user_info(name, age, city),返回一个包含这三个信息的字典。
  4. 定义一个函数temperature_convert(celsius, target_unit),将摄氏度转换为华氏度(默认)或开尔文度,返回转换后的值(华氏度公式:celsius×1.8+32;开尔文度公式:celsius+273.15)。

通过这些练习,你将逐步掌握函数的灵活应用,为后续学习函数的高级特性(如可变参数、匿名函数)打下基础。

相关推荐
island13142 小时前
【C++框架#5】Elasticsearch 安装和使用
开发语言·c++·elasticsearch
周周记笔记2 小时前
学习笔记:Python的起源
开发语言·python
懒大王95272 小时前
uni-app + Vue3 + EZUIKit.js 播放视频流
开发语言·javascript·uni-app
_extraordinary_2 小时前
Java 多线程进阶(四)-- 锁策略,CAS,synchronized的原理,JUC当中常见的类
java·开发语言
魂尾ac3 小时前
Django + Vue3 前后端分离技术实现自动化测试平台从零到有系列 <第一章> 之 注册登录实现
后端·python·django·vue
JasmineX-13 小时前
数据结构——顺序表(c语言笔记)
c语言·开发语言·数据结构·笔记
Source.Liu3 小时前
【Pywinauto库】10.7 pywinauto.controls.uia_controls控件
windows·python·自动化
人工干智能3 小时前
建自己的Python项目仓库,使用工具:GitHub(远程仓库)、GitHub Desktop(版本控制工具)、VSCode(代码编辑器)
python·编辑器·github
java搬砖工-苤-初心不变3 小时前
OpenResty 配合 Lua 脚本的使用
开发语言·lua·openresty