第1章:接触输入输出、变量、简单程序
让我们直接深入第 1 章。对于有 C 语言基础的人来说,理解 Python 基础语法的最快方式就是直接进行代码对比:
🛠️ 1.1 环境搭建与第一行代码
环境搭建
略
但是我还是要说一下,我用的是pycharm+anaconda管理env
然后如果要做一些简单的题(算法题或者其他不需要项目/包管理的题目)我建议配一个 轻量化的编译器,这边我用的sublime_text
参考资料
hhu史秋实老师的ppt 点击这里查看或下载 PDF 文档
在 C 语言中,你需要经历“编写 .c 文件 -> 预处理 -> 编译 -> 汇编 -> 链接 -> 运行”的漫长过程。而 Python 是解释型语言,写完直接运行。
代码对比:打印 Hello World
- C 语言:
- Python:
细节注意: Python 的
print()默认自带换行。如果不想换行,可以修改end参数:print("Hello", end=" ")。此外,Python 不需要分号;结尾。
🏷️ 1.2 变量与动态类型 (核心思维转变)
在 C 语言中,变量像是一个固定的盒子(例如声明了 int a,这个盒子只能装整数,且占据 4 个字节)。
在 Python 中,变量更像是一张便利贴(标签)。你可以把这张标签贴在整数上,下一秒也可以撕下来贴在字符串上。
代码对比:变量声明与赋值 我们先放下刚才的输入输出,直接来深入看看变量的底层逻辑。对于 C 语言开发者来说,理解 Python 变量的关键在于一次核心的思维转换:从“装数据的盒子”变成“贴在数据上的标签”。
1.2.1 声明与赋值的区别
-
C 语言(静态类型):变量是内存中的一个固定“盒子”。 在使用变量前,你必须向系统申请一个特定大小的盒子(声明),然后才能往里面放东西(赋值)。
-
Python(动态类型):变量只是一个指向内存对象的“标签”。 Python 没有独立的声明过程。当你第一次给变量赋值时,Python 会在内存中创建那个值(对象),然后把变量名当作一张便利贴,贴在这个对象上。
1.2.2 连续赋值与多变量赋值
因为变量只是标签,Python 在赋值操作上比 C 语言灵活得多:
连续赋值(多个标签贴在同一个对象上):
多变量同时赋值(C 语言中没有此特性):
这里有一个非常经典的实战场景。在 C 语言中,如果你想交换两个变量 a 和 b 的值,通常必须引入第三个临时变量(比如 int temp = a; a = b; b = temp;)。
结合上面提到的多变量同时赋值特性,你觉得在 Python 中,我们要如何用一行代码优雅地完成 a 和 b 的值交换呢?
基本数据类型 - 整数 🔢(int) - 示例:a = 1024 - C 对照:int / long long - 核心特点: - 任意精度(不会溢出) - 只受内存限制
- 浮点数 🌊(float)
- 示例:pi = 3.14
- C 对照:double
-
核心特点:
- 统一为 64 位浮点数
- 存在精度误差(和 C 一样)
-
布尔值 ⚖️(bool)
- 示例:is_ready = True
- C 对照:bool
-
核心特点:
- True / False(必须大写)
- 本质是 int(True=1,False=0)
-
字符串 🔤(str)
- 示例:s = "Hello"
- C 对照:char[]
- 核心特点:
- 不可变对象
- 无 char 类型(单字符也是字符串)
- 支持 Unicode(中文友好)
-
常用操作:
- s[0](索引)
- s[1:3](切片)
- s + "!"(拼接)
-
空值 🈳(NoneType)
- 示例:n = None
- C 对照:NULL / nullptr
-
核心特点:
- 唯一单例 None
- 表示“无值/未定义”
-
列表 📋(list)
- 示例:a = [1, 2, 3]
- C 对照:数组(但更强)
- 核心特点:
- 可变(mutable)
- 可存不同类型
- 动态扩容
-
常用操作:
- a.append(4)
- a.pop()
- a[0] = 10
- len(a)
-
元组 📦(tuple)
- 示例:t = (1, 2, 3)
- C 对照:类似“只读结构体/数组”
- 核心特点:
- 不可变(immutable)
- 比 list 更轻量
- 可作为字典 key
-
注意:
- 单元素写法:t = (1,)
-
字典 🗂️(dict)
- 示例:d = {"name": "Tom", "age": 18}
- C 对照:无(类似哈希表/Map)
- 核心特点:
- 键值对结构(key-value)
- 查询速度快(哈希)
- key 必须是不可变类型
-
常用操作:
- d["name"]
- d.get("age")
- d["new"] = 123
-
集合 🧩(set)
- 示例:s = {1, 2, 3}
- C 对照:无(类似数学集合)
- 核心特点:
- 无序 + 不重复
- 自动去重
- 支持集合运算
- 常用操作:
- s.add(4)
- s.remove(1)
- s1 & s2(交集)
- s1 | s2(并集)
📥 1.3 基本输入输出与格式化
你说得对。对于打过 C 语言基础,特别是未来可能参与算法竞赛或数据处理的人来说,输入输出的细节极其重要。C 语言的 scanf 和 printf 强大但有时略显繁琐,而 Python 提供了更优雅且高度封装的解决方案。
我们来深度拆解 1.3 节,看看 Python 是如何处理复杂的输入输出场景的。
📥 深入 input():如何处理多变量输入
在 C 语言中,如果你想在一行内读取两个用空格隔开的整数,你会写 scanf("%d %d", &a, &b);。
在 Python 中,input() 永远只读取一整行的字符串,包括空格。如果不做处理,输入 10 20,你得到的是字符串 "10 20"。
为了达到 scanf 的效果,我们需要使用 Python 的“连招”:split() + map()。
split():将字符串按空格切分成列表。"10 20".split()会变成["10", "20"]。map(函数, 序列):将某个函数应用到序列的每一个元素上。
对比示例:一行输入多个数值
原理解析:input().split() 获取了 ["10", "20"]。map(int, ...) 相当于把 int() 作用于里面的每一个字符串,变成了真正的整数,最后分别赋值给 a 和 b。
🖨️ 深入 print():告别手动写循环打印
在 C 语言中,打印一个数组通常需要写一个 for 循环。在 Python 中,print() 极其灵活,它不仅可以直接打印列表,还内置了两个非常实用的参数:
sep(Separator):控制多个变量之间的分隔符(默认是空格)。end:控制打印结束后的尾随字符(默认是换行符\n)。
代码演示:
x = 2024
y = 10
z = 24
# 1. 默认情况:用空格隔开并换行
print(x, y, z) # 输出: 2024 10 24
# 2. 修改分隔符 sep
print(x, y, z, sep="-") # 输出: 2024-10-24
# 3. 修改结束符 end (实现不换行)
print("Loading", end="...")
print("Complete!")
# 输出: Loading...Complete!
✨ 终极格式化杀手锏:f-string
Python 3.6 引入了 f-string(格式化字符串字面量),它完全取代了老旧的 % 占位符写法(如 %d, %.2f)。
你只需要在字符串开头加一个字母 f,然后把变量或任何合法的数学表达式直接丢进花括号 {} 里。
| 需求场景 | C 语言写法 | Python f-string 写法 |
|---|---|---|
| 基础插值 | printf("Age: %d", age); |
print(f"Age: {age}") |
| 保留小数 (如2位) | printf("%.2f", pi); |
print(f"{pi:.2f}") |
| 前导补零 (如宽4位) | printf("%04d", num); |
print(f"{num:04d}") |
| 表达式计算 | printf("Sum: %d", a+b); |
print(f"Sum: {a + b}") |
高阶对齐技巧:
f-string 还自带了排版对齐功能(< 左对齐,> 右对齐,^ 居中),这在 C 里需要计算字符宽度。