🔥 现在学 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 的多返回值
| 特性 | Python | C 语言 |
|---|
| 返回多个值 | 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, "ient, &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入门合集 —