找回密码
立即注册
搜索
热搜: Java Python Linux Go
发回帖 发新帖

3710

积分

1

好友

502

主题
发表于 4 天前 | 查看: 17| 回复: 0

冬日暖帽

无论你是编程新手还是从其他语言转向Python,理解并掌握函数都是构建扎实编程基础的必经之路。这篇文章,我们就来一起看看Python中的函数到底是什么,以及如何亲手创建和使用它们。

为什么需要函数?

想象一下,当你需要反复执行一段特定的计算或操作时,比如校验用户输入、格式化数据或计算折扣,每次都写一遍同样的代码不仅低效,而且一旦逻辑需要调整,你就得修改所有地方。这时,函数(Function)就派上用场了。

函数是组织好的、可重复使用的代码块,用于实现单一或相关联的功能。它们将复杂的程序分解成一个个模块,极大地提高了代码的模块化程度和复用性。Python本身提供了丰富的内置函数,如我们熟悉的 print()len(),但真正的力量来自于创建你自己的定制化函数。

1. 如何定义一个函数?

在Python中,自定义函数遵循一套简单的语法规则,其核心是 def 关键字。

基本规则如下:

  • 函数代码块以 def 关键字开头,后接函数名和圆括号 ()
  • 任何传入的参数自变量都必须放在圆括号内。
  • 函数的第一行语句可以是一个可选的文档字符串(docstring),用于说明函数的功能。
  • 函数体从冒号 : 开始,并且必须缩进
  • 使用 return [表达式] 语句来结束函数,并可选地返回一个值给调用者。不带表达式的 return 或函数体末尾没有 return 语句,则函数返回 None

语法格式:

def 函数名(参数列表):
    """函数文档字符串(可选)"""
    # 函数体
    return [表达式]  # 可选

实例 1:一个简单的问候函数

这个函数接收一个名字作为参数,并打印一句个性化的问候语。

def greet(name):
    """接收一个名字,打印问候语"""
    print(f"你好,{name}!欢迎学习Python函数。")

# 调用函数
greet("小明")
greet("小红")

输出结果:

你好,小明!欢迎学习Python函数。
你好,小红!欢迎学习Python函数。

实例 2:带返回值的函数 - 计算矩形面积

函数不只是为了输出,更多时候是为了计算结果并返回。

def rectangle_area(length, width):
    """计算并返回矩形的面积"""
    area = length * width
    return area

# 调用函数
l = 10
w = 5
print(f"长为{l},宽为{w}的矩形面积是:{rectangle_area(l, w)}")

length2 = 7.5
width2 = 3.2
area2 = rectangle_area(length2, width2)
print(f"长为{length2},宽为{width2}的矩形面积是:{area2}")

输出结果:

长为10,宽为5的矩形面积是:50
长为7.5,宽为3.2的矩形面积是:24.0

实例 3:判断一个数是否为偶数

这个函数将根据判断结果返回布尔值(TrueFalse)。

def is_even(num):
    """如果数字是偶数,返回True;否则返回False"""
    if num % 2 == 0:
        return True
    else:
        return False

# 测试函数
numbers = [10, 15, 22, 37]
for n in numbers:
    if is_even(n):
        print(f"{n} 是偶数")
    else:
        print(f"{n} 是奇数")

输出结果:

10 是偶数
15 是奇数
22 是偶数
37 是奇数

2. 函数调用

定义好的函数并不会自己运行,你需要“调用”它。你可以从程序的主流程中调用,也可以在另一个函数内部调用它,这体现了函数的模块化特性。

实例:在另一个函数中调用函数

print_squares_up_to 函数内部调用了 get_square 函数来完成计算。

def get_square(x):
    """返回一个数的平方"""
    return x * x

def print_squares_up_to(n):
    """打印从1到n(包含n)的所有整数的平方"""
    print(f"1到{n}的平方:")
    for i in range(1, n+1):
        square = get_square(i)  # 在这里调用 get_square 函数
        print(f"{i}的平方 = {square}")

# 调用 print_squares_up_to 函数
print_squares_up_to(5)

输出结果:

1到5的平方:
1的平方 = 1
2的平方 = 4
3的平方 = 9
4的平方 = 16
5的平方 = 25

3. 理解参数传递:可变与不可变对象

Python中的参数传递,理解起来关键在于区分可变对象不可变对象。变量本身只是一个对内存中对象的引用。这个特性直接影响函数内部对参数的修改是否会影响到外部的原始变量。

  • 不可变对象:整数 (int)、浮点数 (float)、字符串 (str)、元组 (tuple) 等。在函数内部试图修改它们,实际上会创建一个新的对象
  • 可变对象:列表 (list)、字典 (dict)、集合 (set) 等。在函数内部修改其内容(如添加、删除元素),会影响外部引用的同一个对象。

理解参数传递

实例:传递不可变对象(以整数为例)

def try_modify_int(x):
    print(f"函数内部,初始x的id: {id(x)}")
    x += 10  # 尝试修改
    print(f"函数内部,修改后x的id: {id(x)},值: {x}")
    return x

a = 5
print(f"调用前,a的id: {id(a)},值: {a}")
result = try_modify_int(a)
print(f"调用后,a的id: {id(a)},值: {a}")
print(f"函数返回值的id: {id(result)},值: {result}")

输出结果(你的id数字可能不同):

调用前,a的id: 140736574012232,值: 5
函数内部,初始x的id: 140736574012232
函数内部,修改后x的id: 140736574012552,值: 15
调用后,a的id: 140736574012232,值: 5
函数返回值的id: 140736574012552,值: 15

分析: a 是整数(不可变对象)。传入函数时,xa 引用同一个对象(id相同)。但当执行 x += 10 时,因为整数不可变,系统创建了一个新对象 15 并让 x 引用它(id改变)。外部的 a 仍然指向原来的对象 5,没有受到任何影响。

实例:传递可变对象(以列表为例)

def add_item(my_list, item):
    """向列表末尾添加一个元素"""
    print(f"函数内部,初始列表的id: {id(my_list)}")
    my_list.append(item)
    print(f"函数内部,添加后列表的id: {id(my_list)},内容: {my_list}")

shopping_list = ["苹果", "香蕉"]
print(f"调用前,列表的id: {id(shopping_list)},内容: {shopping_list}")
add_item(shopping_list, "牛奶")
print(f"调用后,列表的id: {id(shopping_list)},内容: {shopping_list}")

输出结果:

调用前,列表的id: 4567890123,内容: ['苹果', '香蕉']
函数内部,初始列表的id: 4567890123
函数内部,添加后列表的id: 4567890123,内容: ['苹果', '香蕉', '牛奶']
调用后,列表的id: 4567890123,内容: ['苹果', '香蕉', '牛奶']

分析: shopping_list 是列表(可变对象)。传入函数后,my_listshopping_list 引用同一个列表对象。通过 append 方法修改列表内容,是在原对象上进行的操作,因此对象的id没有变。函数执行后,外部的 shopping_list 内容也被改变了,因为它们指向的就是同一个对象。


掌握函数的定义、调用和参数传递,你就已经迈出了编写结构化、可维护Python代码的第一步。这不仅是语法的学习,更是一种编程思维的训练。如果你想深入探索更多Python高级特性,比如列表推导式、装饰器或异步编程,欢迎到云栈社区的Python板块与其他开发者交流学习。




上一篇:基于Docker与Runner Fleet的GitHub Actions私有化部署与管理指南
下一篇:PVE集群网络性能瓶颈实战排查:从千兆阻塞到万兆满速
您需要登录后才可以回帖 登录 | 立即注册

手机版|小黑屋|网站地图|云栈社区 ( 苏ICP备2022046150号-2 )

GMT+8, 2026-2-23 11:44 , Processed in 0.625252 second(s), 41 queries , Gzip On.

Powered by Discuz! X3.5

© 2025-2026 云栈社区.

快速回复 返回顶部 返回列表