当前位置:首页>python>Day 16 函数定义与多返回值--Python函数和C不一样的

Day 16 函数定义与多返回值--Python函数和C不一样的

  • 2026-09-02 17:22:02
Day 16 函数定义与多返回值--Python函数和C不一样的
🔥 现在学 Python,你学的不只是编程 —— ChatGPT、DeepSeek、Copilot,这些改变世界的 AI 底层全是 Python;学会它,你才能真正用好 AI、甚至做出 AI。这个系列带你从零开始,38 篇打通 Python 核心。

写过 C 或 Java 的人第一次看 Python 函数,通常会有两个疑问:为什么没有大括号?为什么能返回两个值?

这正好点出了 Python 函数最不一样的两个地方:定义方式极简,以及多返回值是语法级的原生支持。今天就把这两个特性讲清楚。


定义函数:def 后面跟冒号,缩进代替大括号

Python 用 def 定义函数,用冒号 + 缩进划分函数体,不用大括号。

def greet(name):
    """向指定的人打招呼"""
    message = f"Hello, {name}!"
    print(message)
    return message

# 调用函数
result = greet("小明")
print(result)  # 输出: Hello, 小明!

对比 C 语言,同样的逻辑要写成:

#include <stdio.h>

char* greet(char* name) {
    char message[100];
    sprintf(message, "Hello, %s!", name);
    printf("%s\n", message);
    return message;
}

Python 版本少了类型声明、少了大括号、少了分号——代码即文档,读起来像伪代码。

函数文档字符串(docstring)

Python 函数体第一行如果是字符串,会自动变成函数的 __doc__ 属性,这是官方推荐的写文档方式。

def add(a, b):
    """计算两个数的和
    
    Args:
        a: 第一个数
        b: 第二个数
    
    Returns:
        两个数的和
    """
    return a + b

# 查看函数文档
print(add.__doc__)
# 输出:
# 计算两个数的和
# 
# Args:
#     a: 第一个数
#     b: 第二个数
# 
# Returns:
#     两个数的和

多返回值:一次性返回多个结果

C 语言要返回多个值,通常得用指针参数或者结构体。但 Python 直接支持返回多个值,本质是返回一个元组。

def divide_and_remainder(a, b):
    """返回商和余数"""
    quotient = a // b
    remainder = a % b
    return quotient, remainder  # 实际上是返回元组 (quotient, remainder)

# 接收返回值
result = divide_and_remainder(17, 5)
print(result)   # 输出: (3, 2)
print(type(result))  # 输出: <class 'tuple'>

# 更常用:直接解包
q, r = divide_and_remainder(17, 5)
print(f"商: {q}, 余数: {r}")  # 输出: 商: 3, 余数: 2

解包赋值:return 的隐藏技能

return a, b 其实是 return (a, b) 的语法糖。接收时可以用解包赋值一次性拿到每个值。
# 返回坐标点的 x, y 值
def get_coordinates():
    return 10, 20  # 返回元组 (10, 20)

x, y = get_coordinates()
print(f"x={x}, y={y}")  # 输出: x=10, y=20

这个特性特别适合需要返回多个相关结果的场景,比如:

def analyze_numbers(numbers):
    """分析一组数字:返回最小值、最大值、平均值"""
    min_val = min(numbers)
    max_val = max(numbers)
    avg_val = sum(numbers) / len(numbers)
    return min_val, max_val, avg_val

scores = [85, 92, 78, 90, 88]
min_score, max_score, avg_score = analyze_numbers(scores)
print(f"最低分: {min_score}, 最高分: {max_score}, 平均分: {avg_score:.1f}")
# 输出: 最低分: 78, 最高分: 92, 平均分: 86.6

对比:Python vs C 的多返回值

特性PythonC 语言
返回多个值return a, b(返回元组)用指针参数或结构体
接收方式解包赋值 a, b = func()逐个参数传递指针
代码简洁度极简,一行搞定较繁琐,需要额外定义
类型安全动态类型,灵活但无编译期检查静态类型,编译期检查

C 语言版本(用指针参数实现"多返回值"):

#include <stdio.h>

void divide_and_remainder(int a, int b, int* q, int* r) {
    *q = a / b;
    *r = a % b;
}

int main() {
    int quotient, remainder;
    divide_and_remainder(17, 5, &quotient, &remainder);
    printf("商: %d, 余数: %d\n", quotient, remainder);
    return 0;
}

对比之下,Python 版本是不是清爽很多?


小结

要点说明
def 定义函数冒号 + 缩进划分函数体,不用大括号
docstring函数体第一行的字符串自动变成 __doc__,是写文档的标准方式
多返回值return a, b 实际返回元组 (a, b),支持解包赋值
解包赋值a, b = func() 一次性接收多个返回值,代码更简洁
对比 C 语言Python 函数定义更简洁,多返回值原生支持,不用指针或结构体

下一篇:Day 17 默认参数有个大坑--可变默认值的陷阱

— 编程语言快速精通 · Python入门合集 —

最新文章

随机文章