欢迎来到 罐子的实验室
今天我们进入 Python 的绝对核心领域——函数。函数不仅是代码封装的工具,更是构建复杂逻辑、实现高阶模式(如装饰器、迭代器、生成器)的基石。这一篇,我们将一次性把函数的所有底层逻辑与高级特性全部盘点清楚。
一、 函数概述与参数底层机制
- 核心定义
- 语法规则:使用
def 关键字声明函数名,后面紧跟代码块(函数体)。
- 参数的本质:参数可以在函数调用的时候,向函数内部传递一些必要的信息。
- 形参(形式参数):在函数定义时声明的变量,用于接收外界传来的信息。
- 实参(实际参数)
1. 实参的传参分类(调用时)
- 位置参数
- 关键字参数
- 混合参数:既有位置也有关键字。死铁律:位置参数必须放在前面,关键字参数必须放后面。
- 强制要求:实参在执行的时候,必须保证形参里的每一个变量都有参数成功入账。
2. 形参的分类与动态传参(定义时)
- 位置参数
- 默认值参数:在声明时直接给变量赋一个默认值。若实参传了就使用实参,不传就让默认值生效。
- 顺序规则:位置参数在前,默认值参数在后(位置 > 默认值)。
- 动态传参(万能参数)
*args:接收多余的位置参数,统一打包存储到一个**元组(tuple)**中。**kwargs:接收多余的关键字参数,统一打包存储到一个**字典(dict)**中。- ⚠️ 终极排列顺序:
位置参数 > *args > 默认值参数 > **kwargs。
💻 代码演示:打散与聚合
def func(a, b, *args, default=”胡辣汤”, **kwargs):print(a, b, args, default, kwargs)# 在实参前面加 * 是把列表/元组打散成位置参数传递;加 ** 是把字典打散成关键字参数传递lst = [3, 4, 5]dic = {”name”: ”maomao”, ”age”: 18}func(1, 2, *lst, **dic)# 打散后相当于:func(1, 2, 3, 4, 5, name=”maomao”, age=18)
二、 函数的返回值:return 铁律
- 立即停止:函数只要执行到了
return,整个函数就会立即停止并退出,后续的所有代码绝对不会执行。 - 隐式 None:如果函数内没有写
return,或者只写了 return 后面没跟任何数据,外界接收到的结果一律是 None。 - 单值与多值
return 值return 值1, 值2, 值3:外界会收到一个元组(tuple),里面存放着所有的返回值。
三、 必须掌握的高频内置函数
Python 提供了极其丰富的内置工具箱,以下是必须掌握的底层核心函数:
📊 进制、数学与编码相关
bin() / oct() / hex():将数字转换为二进制 / 八进制 / 十十六进制。sum() / min() / max() / pow():求和 / 最小值 / 最大值 / 幂运算。ord():查看字符在 Unicode 字符集中的位置编号。chr():给定 Unicode 编码位置,展示其对应的文字字符。format():功能极其强大的格式化工具(如控制进制显示、对齐等)。
a = 18print(format(a, ”08b”))# 输出: 00010010 (b:二进制, 08:占8位且用0填充)print(ord('中'))# 输出: 20013print(chr(20013))# 输出: '中'
🔍 逻辑、迭代与内存相关
all():相当于条件判定的 and。传入的序列里全部为真才返回 True。any():相当于条件判定的 or。传入的序列里只要有一个为真就返回 True。enumerate()hash():哈希运算。将一个不可变对象计算成一个数字,是字典和集合底层构建哈希表存储的基础。id()dir():告诉你当前这个数据对象能够执行哪些操作(查看所有方法名称)。
print(all([0, '123']))# 包含空值0,返回 Falseprint(any([0, '123']))# 存在非空字符串,返回 True
四、 作用域的深度控制:global 与 nonlocal
- 作用域(Scope)
- 全局作用域(全局变量)
- 局部作用域(局部变量)
- 作用域修改提权
global:在局部作用域内,将一个外部的全局变量引入进来,从而允许在函数内部对其进行修改。nonlocal:在多层嵌套函数中,将外层的局部变量引入到当前的内层局部变量中进行修改。
五、 高阶核心:闭包与装饰器
1. 闭包(Closure)
- 本质特征:内层函数对外层函数局部变量的使用。此时内层函数就被称为闭包函数。
- 核心价值:可以让一个局部变量常驻于内存之中而不被销毁,同时有效避免全局变量被外界污染修改。
💻 代码演示:闭包常驻内存
def ok():a = 0def ook():nonlocal aa += 1return areturn ookko = ok()# 此时 ko 拿到了内层函数 ook print(ko())# 输出: 1 (变量 a 没有被销毁)print(ko())# 输出: 2 (变量 a 持续累加)
2. 装饰器(Decorator)
- 函数的前提基石:在 Python 中,函数可以当成普通变量一样进行赋值、作为参数传递、以及作为返回值返回。
- 核心作用:在不改变原有函数调用方式、也不修改原有函数源代码的前提下,给函数动态添加新的功能。其本质就是一个闭包结构。
💻 代码演示:通用装饰器标准模型
def wan(fn):# 统一使用 *args 和 **kwargs 完美解决原函数的传参问题def zhe(*args, **kwargs):print(”【预处理】开挂/准备工作”)ty = fn(*args, **kwargs)# 完美解决原函数的返回值问题print(”【后处理】关闭外挂/善后工作”)return ty# 将原函数的返回值原封不动抛出return zhe@wan# 相当于语法糖:wangzhe = wan(wangzhe)def wangzhe(username, password):print(f”验证密码{password}正确,使用{username}打王者”)return ”上星10颗”po = wangzhe(”maomao”, 12345)print(po)# 输出结果完美包含前置、原函数、后置和返回值
六、 迭代器与生成器
1. 迭代器(Iterator)
- 诞生背景:为了统一不同数据类型(列表、字符串、字典等)的遍历工作。
- 核心机制:可迭代对象通过内置函数
iter() 可以拿出对应的迭代器。从迭代器里拿数据,需要使用内置函数 next()。 for 循环内幕:for 循环的底层一定是在拿迭代器,并且在循环内部不断自动调用 __next__()(或者 next())来吐出数据。
2. 生成器(Generator)
- 本质:生成器就是迭代器,它是自定义迭代器的一种高级实现方案。
- 核心关键字
- 运作特性:生成器函数执行的时候,并不会立刻执行函数体内的代码,而是得到一个生成器对象。只有当外界调用
next() 或进行 for 循环遍历时,函数才会开始执行,直到遇到 yield 挂起返回,实现分段执行。
七、 终极提速:推导式、生成器表达式与匿名函数
1. 推导式语法糖
用于极其简化地快速生成容器数据的代码。
- 列表推导式:
[数据 for 变量 in 可迭代对象 if 判断] - 集合推导式:
{数据 for 变量 in 可迭代对象 if 判断} - 字典推导式:
{key: value for 变量 in 可迭代对象 if 判断}
2. 生成器表达式
- 表现形式
- 绝杀优势:它不会像列表推导式那样一次性把海量数据全部塞满内存,而是得到一个惰性求值的生成器,要一个给一个,内存占用极低。
gen = (i**2 for i in range(100))# 得到生成器表达式for i in gen:print(i)# 动态计算并打印
3. 匿名函数(Lambda 表达式)
- 基本定义
- 语法格式:
变量 = lambda 参数一, 参数二 : 单行返回值
fn = lambda a, b : a + bro = fn(12, 15)# 调用执行,ro 的值为 27
尾声
如果在配置环境或理解基础类型时遇到错误,直接在评论区留言就可以。