大家好。今天这篇文章将覆盖四个独立但同样重要的知识点:JSON与Pickle的序列化对比、Turtle绘图库的基础案例、函数的定义与参数类型,以及匿名函数(lambda)的使用。每个部分都会配合代码示例,方便理解和实践。
一、JSON与Pickle:序列化方式对比
在之前的文章中,我们详细介绍了JSON序列化。这里重点介绍Pickle,并将两者进行系统对比。
1. Pickle 简介
Pickle 是 Python 自带的序列化模块,可以将 Python 对象转换为字节流,也可以从字节流还原对象。与 JSON 不同,Pickle 支持几乎所有 Python 对象,包括函数、类实例等。
2. Pickle 的基本使用
import pickle # 准备数据 data = { "name": "张三", "age": 25, "scores": [85, 92, 78], "is_active": True } # 序列化:Python对象 → 字节流(bytes) bytes_data = pickle.dumps(data) print(type(bytes_data)) # <class 'bytes'> print(bytes_data) # 不可读的二进制数据 # 反序列化:字节流 → Python对象 restored_data = pickle.loads(bytes_data) print(restored_data) # 还原为字典3. Pickle 文件读写
import pickle data = {"name": "李四", "age": 30, "scores": [90, 85, 88]} # 写入文件(wb:二进制写入) with open("data.pkl", "wb") as f: pickle.dump(data, f) # 读取文件(rb:二进制读取) with open("data.pkl", "rb") as f: loaded_data = pickle.load(f) print(loaded_data) # {'name': '李四', 'age': 30, 'scores': [90, 85, 88]}4. JSON 与 Pickle 对比
| 对比项 | JSON | Pickle |
|---|---|---|
| 格式 | 文本格式(可读) | 二进制格式(不可读) |
| 数据范围 | 字符串、数字、布尔、列表、字典、null | 几乎所有 Python 对象 |
| 跨语言 | 支持(通用格式) | 仅限 Python |
| 安全性 | 安全(只解析数据) | 不安全(反序列化可能执行恶意代码) |
| 文件大小 | 较大 | 较小 |
| 使用场景 | 前后端通信、配置文件、数据交换 | Python 内部存储、缓存、复杂对象持久化 |
5. 选择建议
# 需要跨语言、可读性强 → 用 JSON import json config = {"host": "localhost", "port": 8080} json.dump(config, open("config.json", "w")) # 需要保存复杂对象、只在 Python 内部使用 → 用 Pickle import pickle model = {"weights": [0.1, 0.2, 0.3], "bias": 0.5} pickle.dump(model, open("model.pkl", "wb"))二、Turtle 绘图:基础案例
Turtle(海龟绘图)是 Python 内置的绘图库,非常适合初学者理解编程中的坐标、角度和循环逻辑。
1. Turtle 基本概念
海龟:屏幕上的一个小箭头,移动时会留下轨迹
方向:默认向右(0度),可通过
left()/right()旋转坐标:屏幕中心为 (0, 0)
2. 基本绘图命令
| 命令 | 说明 |
|---|---|
forward(distance) | 向前移动指定距离 |
backward(distance) | 向后移动指定距离 |
left(angle) | 左转指定角度 |
right(angle) | 右转指定角度 |
up()/ | 抬起画笔(移动不留痕迹) |
down() | 放下画笔(移动留下痕迹) |
color(color) | 设置画笔颜色 |
pensize(width) | 设置线条粗细 |
go_to(x, y) | 移动到指定坐标 |
circle(radius) | 画圆形 |
3. 案例一:绘制正方形
import turtle # 创建海龟对象 t = turtle.Turtle() # 设置画笔 t.pensize(3) t.color("blue") # 绘制正方形 for _ in range(4): t.forward(100) t.left(90) # 保持窗口 turtle.done()4. 案例四:绘制圆形
import turtle t = turtle.Turtle() t.color("green") t.pensize(3) # 方法一:直接画圆 t.circle(80) # 半径为80的圆 # 方法二:移动到不同位置画多个圆 t.penup() t.goto(-150, 0) t.pendown() t.circle(60) t.penup() t.goto(150, 0) t.pendown() t.circle(60) turtle.done()三、函数基础
函数是组织代码、提高复用性的核心工具。将一段具有独立功能的代码封装成函数,可以让程序结构更清晰。
1. 函数的定义与调用
# 定义函数 def greet(): print("Hello, World!") # 调用函数 greet() # Hello, World!2. 带参数的函数
def greet(name): print(f"Hello, {name}!") greet("张三") # Hello, 张三!3. 带返回值的函数
def add(a, b): return a + b result = add(3, 5) print(result) # 84. 默认参数
def greet(name, msg="你好"): print(f"{msg}, {name}!") greet("张三") # 你好, 张三! greet("李四", "欢迎") # 欢迎, 李四!四、函数参数的类型
Python 函数的参数非常灵活,主要分为以下几种类型。
1. 位置参数(必需参数)
调用时必须按顺序传入,且数量必须一致。
def info(name, age, city): print(f"{name}, {age}岁, 来自{city}") info("张三", 25, "北京") # 顺序必须一致2. 默认参数
定义时给参数设置默认值,调用时可传可不传。默认参数必须放在位置参数之后。
def info(name, age, city="未知"): print(f"{name}, {age}岁, 来自{city}") info("张三", 25) # 张三, 25岁, 来自未知 info("李四", 30, "上海") # 李四, 30岁, 来自上海3. 关键字参数
调用时通过参数名=值的方式传入,顺序可以打乱。
def info(name, age, city): print(f"{name}, {age}岁, 来自{city}") info(city="深圳", age=28, name="王五") # 顺序可乱4. 可变位置参数(*args)
接收任意数量的位置参数,以元组形式存储。
def sum_all(*args): total = 0 for num in args: total += num return total print(sum_all(1, 2, 3)) # 6 print(sum_all(1, 2, 3, 4, 5)) # 155. 可变关键字参数(**kwargs)
接收任意数量的关键字参数,以字典形式存储。
def print_info(**kwargs): for key, value in kwargs.items(): print(f"{key}: {value}") print_info(name="张三", age=25, city="北京") # 输出: # name: 张三 # age: 25 # city: 北京6. 参数组合顺序
函数参数可以组合使用,但必须按以下顺序定义:
def func(位置参数, 默认参数, *args, **kwargs): pass # 实际示例 def example(a, b=10, *args, **kwargs): print(f"a={a}, b={b}, args={args}, kwargs={kwargs}") example(1, 2, 3, 4, name="张三", age=25) # 输出:a=1, b=2, args=(3, 4), kwargs={'name': '张三', 'age': 25}7. 参数类型速查表
| 参数类型 | 定义方式 | 调用方式 | 特点 |
|---|---|---|---|
| 位置参数 | def f(a, b) | f(1, 2) | 按顺序传入,数量必须一致 |
| 默认参数 | def f(a, b=10) | f(1)或f(1, 20) | 不传则使用默认值 |
| 关键字参数 | def f(a, b) | f(b=2, a=1) | 顺序可打乱 |
| 可变位置参数 | def f(*args) | f(1, 2, 3) | 接收任意数量位置参数 |
| 可变关键字参数 | def f(**kwargs) | f(a=1, b=2) | 接收任意数量关键字参数 |
五、匿名函数(lambda)
1. 什么是匿名函数
匿名函数是指没有名字的函数,用lambda关键字定义。它通常用于需要临时定义简单函数的场景。
2. 基本语法
lambda 参数: 表达式 # 等价于 def 函数名(参数): return 表达式3. 基本使用
# 普通函数 def add(a, b): return a + b # 匿名函数 add_lambda = lambda a, b: a + b print(add(3, 5)) # 8 print(add_lambda(3, 5)) # 84. lambda 使用注意事项
# 1. lambda 只能写一行表达式,不能写多行语句 # lambda x: if x > 0: return x else: return -x # 语法错误 # 2. 可以用条件表达式(三元运算符) abs_val = lambda x: x if x > 0 else -x print(abs_val(-5)) # 5 # 3. 多个参数 product = lambda a, b, c: a * b * c print(product(2, 3, 4)) # 24 # 4. 无参数 hello = lambda: "Hello" print(hello()) # Hello5. lambda 与普通函数对比
| 对比项 | lambda | 普通函数 |
|---|---|---|
| 名称 | 匿名(无名字) | 有名字 |
| 语法 | 单行表达式 | 多行语句 |
| 返回值 | 自动返回表达式结果 | 使用return返回 |
| 使用场景 | 简单、临时的操作 | 复杂、需要复用的逻辑 |
| 可读性 | 适合简单场景 | 复杂逻辑更清晰 |
六、总结
| 知识点 | 核心要点 |
|---|---|
| JSON | 文本格式、跨语言、可读性好,适合配置文件和数据交换 |
| Pickle | 二进制格式、支持任意Python对象,适合Python内部存储 |
| Turtle | 内置绘图库,通过海龟移动理解坐标和循环 |
| 函数基础 | def定义、参数传递、返回值 |
| 参数类型 | 位置参数、默认参数、关键字参数、*args、**kwargs |
| 匿名函数 | lambda单行表达式,常配合map()、filter()、sorted() |
以上四个知识点在实际开发中都有各自的适用场景:JSON和Pickle解决数据持久化问题,Turtle帮助理解编程逻辑,函数是组织代码的核心工具。建议多动手练习,加深理解。
如果觉得这篇内容对你有帮助,欢迎收藏备用。