跳转至

第1章:接触输入输出、变量、简单程序

让我们直接深入第 1 章。对于有 C 语言基础的人来说,理解 Python 基础语法的最快方式就是直接进行代码对比:

🛠️ 1.1 环境搭建与第一行代码

环境搭建


但是我还是要说一下,我用的是pycharm+anaconda管理env
然后如果要做一些简单的题(算法题或者其他不需要项目/包管理的题目)我建议配一个 轻量化的编译器,这边我用的sublime_text

参考资料

hhu史秋实老师的ppt 点击这里查看或下载 PDF 文档

在 C 语言中,你需要经历“编写 .c 文件 -> 预处理 -> 编译 -> 汇编 -> 链接 -> 运行”的漫长过程。而 Python 是解释型语言,写完直接运行。

代码对比:打印 Hello World

  • C 语言:
    #include <stdio.h>
    int main() {
        printf("Hello World\n");
        return 0;
    }
    
  • Python:
    print("Hello World")
    
    细节注意: Python 的 print() 默认自带换行。如果不想换行,可以修改 end 参数:print("Hello", end=" ")。此外,Python 不需要分号 ; 结尾。

🏷️ 1.2 变量与动态类型 (核心思维转变)

在 C 语言中,变量像是一个固定的盒子(例如声明了 int a,这个盒子只能装整数,且占据 4 个字节)。 在 Python 中,变量更像是一张便利贴(标签)。你可以把这张标签贴在整数上,下一秒也可以撕下来贴在字符串上。

代码对比:变量声明与赋值 我们先放下刚才的输入输出,直接来深入看看变量的底层逻辑。对于 C 语言开发者来说,理解 Python 变量的关键在于一次核心的思维转换:从“装数据的盒子”变成“贴在数据上的标签”。

1.2.1 声明与赋值的区别

  • C 语言(静态类型):变量是内存中的一个固定“盒子”。 在使用变量前,你必须向系统申请一个特定大小的盒子(声明),然后才能往里面放东西(赋值)。

    int a;      // 声明:在内存中挖一块 4 字节的空间,命名为 a
    a = 10;     // 赋值:把 10 这个值存入 a 的空间
    a = "Hi";   // 编译报错!整型的盒子里不能装字符串
    

  • Python(动态类型):变量只是一个指向内存对象的“标签”。 Python 没有独立的声明过程。当你第一次给变量赋值时,Python 会在内存中创建那个值(对象),然后把变量名当作一张便利贴,贴在这个对象上。

    a = 10      # 内存中生成整数对象 10,把标签 a 贴上去
    a = "Hi"    # 内存中生成字符串对象 "Hi",把标签 a 撕下来,贴到 "Hi" 上(完全合法!)
    

1.2.2 连续赋值与多变量赋值

因为变量只是标签,Python 在赋值操作上比 C 语言灵活得多:

连续赋值(多个标签贴在同一个对象上):

x = y = z = 0  # x, y, z 都指向同一个整数对象 0

多变量同时赋值(C 语言中没有此特性):

# 左边是变量名,右边是对应的值,用逗号隔开
name, age = "Alice", 20

这里有一个非常经典的实战场景。在 C 语言中,如果你想交换两个变量 ab 的值,通常必须引入第三个临时变量(比如 int temp = a; a = b; b = temp;)。

结合上面提到的多变量同时赋值特性,你觉得在 Python 中,我们要如何用一行代码优雅地完成 ab 的值交换呢?

基本数据类型 - 整数 🔢(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 语言的 scanfprintf 强大但有时略显繁琐,而 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(函数, 序列):将某个函数应用到序列的每一个元素上。

对比示例:一行输入多个数值

# 用户输入: 10 20
a, b = map(int, input("请输入两个整数: ").split())

print(a + b) # 输出: 30
原理解析: input().split() 获取了 ["10", "20"]map(int, ...) 相当于把 int() 作用于里面的每一个字符串,变成了真正的整数,最后分别赋值给 ab

🖨️ 深入 print():告别手动写循环打印

在 C 语言中,打印一个数组通常需要写一个 for 循环。在 Python 中,print() 极其灵活,它不仅可以直接打印列表,还内置了两个非常实用的参数:

  1. sep (Separator):控制多个变量之间的分隔符(默认是空格)。
  2. 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 里需要计算字符宽度。

name = "Alice"
# 占 10 个字符宽度,居中对齐,两边用 * 填充
print(f"[{name:*^10}]") # 输出: [**Alice***]