从C/C++到Python

如果你学过C或C++,现在想快速上手Python,那这篇文章就是为你准备的。直接告诉你”C++里这个东西对应Python里怎么写”。


前语

很多人在学完C/C++之后接触Python,第一反应往往是:”这也太随意了吧?不用写类型?不用大括号?”

别慌。Python的语法设计就是为了让你少写代码、多做事。如果你已经习惯了C/C++的严谨,那Python对你来说基本就是”降维打击”——你唯一要做的,就是习惯它的表达方式。

这篇文章不会把每个知识点讲得特别深,但足够让你看懂别人的代码、自己写一些实用的小工具。遇到不会的,翻到对应的部分,看一眼就能想起来。


1. 缩进替代了大括号

这大概是最让人困惑的地方,但其实适应起来很快。

代码示例

C/C++ 写法:

1
2
3
4
if (score >= 60) {
printf("及格了");
printf("恭喜你!");
}

Python 写法:

1
2
3
4
if score >= 60:
print("及格了")
print("恭喜你!")
# 缩进回到这里,表示if结束了

效果演示

C/C++ 输出:

1
2
及格了
恭喜你!

Python 输出:

1
2
及格了
恭喜你!

核心要点:同一层缩进的代码,属于同一个代码块。大部分编辑器都会帮你自动处理缩进,按Tab就行了(编辑器一般会自动转成4个空格)。

常见陷阱:别混用Tab和空格,会报错。绝大多数编辑器默认Tab→4空格,保持这个习惯就行。


2. 变量不用声明类型

这个确实方便不少。

代码示例

C/C++ 写法:

1
2
3
int age = 20;
string name = "张三";
double score = 95.5;

Python 写法:

1
2
3
age = 20
name = "张三"
score = 95.5

更妙的是,变量可以随时改变类型:

1
2
3
x = 10        # 整数
x = "hello" # 现在变成字符串了,完全合法
x = [1, 2, 3] # 现在又变成列表了

效果演示

Python运行结果:

1
2
3
4
x = 10        # 整数
x = "hello" # 现在变成字符串了
x = [1, 2, 3] # 现在又变成列表了
# 全程不会报错,非常灵活

对于习惯静态类型的人来说,这可能会有点不踏实。但你很快会发现,写小脚本的时候,这种灵活性能省掉很多不必要的类型声明。


3. 常用的数据类型

其实和C/C++差不多,就是换了个名字或者写法。

代码示例

基础类型对照:

用途 C/C++ Python 示例
整数 int int age = 20
小数 float/double float pi = 3.14
字符/字符串 char/string str name = "小明"
真假值 bool bool is_student = True
空值 NULL/nullptr None result = None

字符串操作:

1
2
3
4
5
6
7
8
9
10
s = "Hello, World!"

len(s) # 长度 → 13
s[0] # 第一个字符 → 'H'
s[-1] # 最后一个字符 → '!'
s[0:5] # 切片,取前5个 → 'Hello'
s.lower() # 全小写 → 'hello, world!'
s.upper() # 全大写 → 'HELLO, WORLD!'
s.replace("World", "Python") # 替换 → 'Hello, Python!'
"123".isdigit() # 判断是否全数字 → True

类型转换:

1
2
3
4
int("123")          # → 123
str(123) # → "123"
float("3.14") # → 3.14
bool(0) # → False(0、空字符串、空列表、None都是False)

效果演示

1
2
3
4
5
6
7
8
9
10
11
12
13
len("Hello, World!") → 13
s[0] → 'H'
s[-1] → '!'
s[0:5] → 'Hello'
s.lower() → 'hello, world!'
s.upper() → 'HELLO, WORLD!'
s.replace("World", "Python") → 'Hello, Python!'
"123".isdigit() → True

int("123") → 123
str(123) → "123"
float("3.14") → 3.14
bool(0) → False

4. 输入输出

代码示例

输出:

1
2
3
4
5
6
7
8
9
10
11
name = "小明"
age = 20

# 方式1:逗号分隔,自动加空格
print("姓名:", name, ",年龄:", age)

# 方式2:f-string,推荐这个(最直观)
print(f"姓名:{name},年龄:{age}")

# 方式3:format方法
print("姓名:{},年龄:{}".format(name, age))

输入:

1
2
3
name = input("请输入姓名:")        # 返回字符串
age = int(input("请输入年龄:")) # 转成整数
score = float(input("请输入成绩:")) # 转成小数

效果演示

输出结果:

1
2
3
姓名: 小明 ,年龄: 20
姓名:小明,年龄:20
姓名:小明,年龄:20

输入交互:

1
2
3
4
请输入姓名:小明
请输入年龄:20
请输入成绩:95.5
# name = "小明", age = 20, score = 95.5

f-string是最方便的,花括号里可以直接写变量名,甚至能写表达式,比如 {age + 1}
记住:input() 永远返回字符串,要数字就自己转。


5. 条件判断

写法上最大的区别就是 else if 变成了 elif

代码示例

1
2
3
4
5
6
7
8
9
10
11
12
score = 85

if score >= 90:
grade = 'A'
elif score >= 80: # 注意是 elif
grade = 'B'
elif score >= 60:
grade = 'C'
else:
grade = 'D'

print(f"成绩等级:{grade}")

三目运算符(条件表达式):

1
2
# C/C++: a > b ? a : b
max_val = a if a > b else b

逻辑运算符:

1
2
3
4
5
if age >= 18 and score >= 60:
print("成年且及格")

if not is_holiday:
print("今天上班")

效果演示

1
2
3
4
5
6
成绩等级:B

# 逻辑运算符对照表
and → && (并且)
or → || (或者)
not → ! (非)

6. 循环

代码示例

for循环:

1
2
3
4
5
6
7
8
9
10
11
12
13
# C/C++: for (int i = 0; i < 10; i++)
for i in range(10): # 0,1,2,3,4,5,6,7,8,9
print(i, end=" ")

print()

for i in range(2, 10): # 2,3,4,5,6,7,8,9
print(i, end=" ")

print()

for i in range(0, 10, 2): # 0,2,4,6,8
print(i, end=" ")

遍历列表:

1
2
3
4
5
6
7
8
9
fruits = ["苹果", "香蕉", "橘子"]

# 遍历元素
for fruit in fruits:
print(fruit)

# 同时拿到索引和值
for i, fruit in enumerate(fruits):
print(f"第{i}个是{fruit}")

while循环:

1
2
3
4
i = 0
while i < 10:
print(i, end=" ")
i += 1 # 不能写 i++

效果演示

1
2
3
4
5
6
7
8
9
10
11
12
13
for i in range(10):      → 0 1 2 3 4 5 6 7 8 9
for i in range(2, 10): → 2 3 4 5 6 7 8 9
for i in range(0, 10, 2):→ 0 2 4 6 8

遍历列表:
苹果
香蕉
橘子
第0个是苹果
第1个是香蕉
第2个是橘子

while循环:0 1 2 3 4 5 6 7 8 9

range(n) 生成0到n-1的序列,range(start, end, step) 可以指定起始、结束和步长。
Python里没有 i++ 这种写法,要用 i += 1


7. 列表:Python里的”数组”

列表是Python里最常用的数据结构,相当于C++里的 vector

代码示例

1
2
3
4
5
6
7
8
9
10
11
12
13
14
# 创建列表
arr = [1, 2, 3, 4, 5]
mixed = [1, "hello", 3.14, True] # 什么类型都能装

# 访问元素
print(arr[0]) # 1
print(arr[-1]) # 5(倒数第一个)
print(arr[-2]) # 4(倒数第二个)

# 切片
print(arr[1:4]) # [2, 3, 4](索引1到3)
print(arr[:3]) # [1, 2, 3](从开头到索引2)
print(arr[2:]) # [3, 4, 5](从索引2到末尾)
print(arr[::-1]) # [5, 4, 3, 2, 1](翻转)

常用方法:

1
2
3
4
5
6
7
8
arr.append(6)        # 末尾加一个 → [1,2,3,4,5,6]
arr.insert(0, 0) # 在位置0插入0 → [0,1,2,3,4,5,6]
arr.pop() # 删除末尾,返回删除的值
arr.pop(0) # 删除位置0,返回删除的值
arr.remove(3) # 删除第一个值为3的元素
print(len(arr)) # 长度
arr.sort() # 原地排序
sorted(arr) # 返回排序后的新列表

列表推导式:

1
2
3
4
5
6
7
# 生成1到10的平方
squares = [x**2 for x in range(1, 11)]
print(squares)

# 筛选偶数
evens = [x for x in range(20) if x % 2 == 0]
print(evens)

效果演示

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
arr[0] → 1
arr[-1] → 5
arr[-2] → 4
arr[1:4] → [2, 3, 4]
arr[:3] → [1, 2, 3]
arr[2:] → [3, 4, 5]
arr[::-1] → [5, 4, 3, 2, 1]

常用方法演示:
arr.append(6) → [1, 2, 3, 4, 5, 6]
arr.insert(0, 0) → [0, 1, 2, 3, 4, 5, 6]
len(arr) → 7

列表推导式:
squares → [1, 4, 9, 16, 25, 36, 49, 64, 81, 100]
evens → [0, 2, 4, 6, 8, 10, 12, 14, 16, 18]

8. 字典:键值对存储

字典相当于C++里的 mapunordered_map

代码示例

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
# 创建字典
student = {
"name": "小明",
"age": 20,
"score": 95.5
}

# 访问
print(student["name"]) # → "小明"
print(student.get("name")) # → "小明"(更安全)
print(student.get("gender", "未知")) # → "未知"(不存在时返回默认值)

# 修改或添加
student["age"] = 21 # 修改
student["gender"] = "男" # 添加

# 删除
del student["gender"]
student.pop("age") # 删除并返回

# 遍历
for key in student:
print(key, student[key])

for key, value in student.items():
print(f"{key}: {value}")

# 判断键是否存在
if "name" in student:
print("有name这个键")

效果演示

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
student["name"] → 小明
student.get("name") → 小明
student.get("gender", "未知") → 未知

添加gender后:
student → {"name": "小明", "age": 21, "score": 95.5, "gender": "男"}

遍历输出:
name 小明
age 21
score 95.5

name: 小明
age: 21
score: 95.5

判断结果:有name这个键

9. 函数

代码示例

基本定义:

1
2
3
4
5
def add(a, b):
return a + b

result = add(3, 5)
print(result) # → 8

默认参数:

1
2
3
4
5
def greet(name, greeting="你好"):
print(f"{greeting}{name}")

greet("小明") # 你好,小明
greet("小明", "Hello") # Hello,小明

返回多个值:

1
2
3
4
5
def divide(a, b):
return a // b, a % b

quot, rem = divide(10, 3)
print(f"商:{quot},余数:{rem}") # 商:3,余数:1

不定长参数:

1
2
3
4
5
6
7
8
9
10
11
12
# *args:接收任意多个位置参数
def sum_all(*args):
return sum(args)

print(sum_all(1, 2, 3, 4)) # → 10

# **kwargs:接收任意多个关键字参数
def print_info(**kwargs):
for key, value in kwargs.items():
print(f"{key}: {value}")

print_info(name="小明", age=20)

效果演示

1
2
3
4
5
6
7
8
9
10
11
12
add(3, 5) → 8

greet("小明") → 你好,小明
greet("小明", "Hello") → Hello,小明

divide(10, 3) → 商:3,余数:1

sum_all(1, 2, 3, 4) → 10

print_info(name="小明", age=20) →
name: 小明
age: 20

如果没有 return,函数会返回 None(类似于C++里的 void)。
默认参数不要用列表、字典这种可变对象。


10. 简单的类

Python的类写法比C++简洁很多。

代码示例

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
class Student:
def __init__(self, name, age): # 构造函数
self.name = name
self.age = age

def introduce(self):
print(f"我叫{self.name},今年{self.age}岁")

def study(self, subject):
print(f"{self.name}正在学习{subject}")

# 使用(不需要new)
stu = Student("小明", 20)
stu.introduce() # 我叫小明,今年20岁
stu.study("Python") # 小明正在学习Python

继承:

1
2
3
4
5
6
7
8
9
10
11
class CollegeStudent(Student):
def __init__(self, name, age, major):
super().__init__(name, age) # 调用父类构造函数
self.major = major

def introduce(self): # 重写
print(f"我叫{self.name},专业是{self.major}")

# 使用
stu2 = CollegeStudent("小红", 22, "网络工程")
stu2.introduce() # 我叫小红,专业是网络工程

效果演示

1
2
3
4
5
6
创建Student对象:
stu.introduce() → 我叫小明,今年20岁
stu.study("Python") → 小明正在学习Python

继承演示:
stu2.introduce() → 我叫小红,专业是网络工程

11. 异常处理

C/C++里通常用返回值来判断错误,Python里用 try-except 捕获异常。

代码示例

1
2
3
4
5
6
7
8
9
10
11
12
13
14
try:
num = int(input("请输入数字:"))
result = 10 / num
print(f"结果是:{result}")
except ValueError:
print("输入的不是有效数字")
except ZeroDivisionError:
print("不能除以零")
except Exception as e:
print(f"发生错误:{e}")
else:
print("计算成功")
finally:
print("程序结束")

效果演示

正常输入:

1
2
3
4
请输入数字:5
结果是:2.0
计算成功
程序结束

输入0:

1
2
3
请输入数字:0
不能除以零
程序结束

输入字母:

1
2
3
请输入数字:abc
输入的不是有效数字
程序结束

finally 里的代码不管有没有异常都会执行,适合做清理工作。


12. 文件操作

读写文件最推荐用 with 语句,它会自动关闭文件。

代码示例

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
# 读文件
with open("test.txt", "r", encoding="utf-8") as f:
content = f.read() # 全部读取
print(content)
# 或者逐行读取
for line in f:
print(line, end="")

# 写文件(覆盖)
with open("output.txt", "w", encoding="utf-8") as f:
f.write("第一行\n")
f.write("第二行\n")

# 追加
with open("output.txt", "a", encoding="utf-8") as f:
f.write("第三行\n")

效果演示

文件模式说明:

模式 说明
'r' 读(默认)
'w' 写(覆盖)
'a' 追加
'rb'/'wb' 二进制读写

执行结果:

1
2
# test.txt 内容被读取并打印
# output.txt 被写入三行内容

13. 常用的内置模块

代码示例

math模块:

1
2
3
4
5
import math
print(math.sqrt(16)) # 开平方 → 4.0
print(math.pow(2, 10)) # 幂 → 1024.0
print(math.pi) # 圆周率
print(math.factorial(5)) # 阶乘 → 120

random模块:

1
2
3
4
import random
print(random.randint(1, 10)) # 1到10之间的随机整数
print(random.random()) # 0到1之间的随机小数
print(random.choice(['a', 'b', 'c'])) # 随机选一个

datetime模块:

1
2
3
4
5
from datetime import datetime, timedelta
now = datetime.now()
print(now.strftime("%Y-%m-%d %H:%M:%S")) # 格式化输出
tomorrow = now + timedelta(days=1)
print(tomorrow)

os模块:

1
2
3
4
5
import os
print(os.getcwd()) # 当前目录
print(os.listdir(".")) # 列出目录内容
print(os.path.exists("file.txt")) # 判断文件是否存在
print(os.path.join("a", "b.txt")) # 拼接路径

效果演示

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
math.sqrt(16) → 4.0
math.pow(2, 10) → 1024.0
math.pi → 3.141592653589793
math.factorial(5) → 120

random.randint(1, 10) → 7(随机)
random.random() → 0.456789(随机)
random.choice(['a', 'b', 'c']) → 'b'(随机)

datetime格式化 → 2026-08-08 14:30:00
tomorrow → 2026-08-09 14:30:00

os.getcwd() → /path/to/current/directory
os.listdir(".") → ['file1.py', 'file2.txt', ...]
os.path.exists("file.txt") → False
os.path.join("a", "b.txt") → a/b.txt

14. 一个小例子

把上面这些串起来,写一个简单的联系人管理程序:

代码示例

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
class ContactManager:
def __init__(self):
self.contacts = []

def add(self, name, phone):
self.contacts.append({"name": name, "phone": phone})
print(f"已添加:{name}")

def show_all(self):
if not self.contacts:
print("暂无联系人")
return
for c in self.contacts:
print(f"{c['name']}: {c['phone']}")

def search(self, name):
for c in self.contacts:
if c['name'] == name:
print(f"找到:{c['name']} - {c['phone']}")
return
print("未找到该联系人")

def save(self, filename):
import json
with open(filename, 'w', encoding='utf-8') as f:
json.dump(self.contacts, f, ensure_ascii=False)
print("保存成功")

# 使用
mgr = ContactManager()
mgr.add("张三", "13800138001")
mgr.add("李四", "13800138002")
mgr.show_all()
mgr.search("张三")
mgr.save("contacts.json")

效果演示

1
2
3
4
5
6
已添加:张三
已添加:李四
张三: 13800138001
李四: 13800138002
找到:张三 - 13800138001
保存成功

15. 速查对照表

代码示例(对照表)

需求 C/C++ Python
循环n次 for (int i=0; i<n; i++) for i in range(n):
遍历数组 for (int i=0; i<n; i++) for item in arr:
带索引遍历 - for i, item in enumerate(arr):
条件判断 if (x > 0) { ... } if x > 0:
多分支 else if elif
逻辑与 && and
逻辑或 || or
逻辑非 ! not
三目运算 a ? b : c b if a else c
数组长度 sizeof(arr)/sizeof(arr[0]) len(arr)
字符串转数字 atoi() int()
数字转字符串 to_string() str()
函数定义 int add(int a, int b) def add(a, b):
构造函数 Student(...) def __init__(self, ...)
继承 class Dog : public Animal class Dog(Animal):
空指针 NULL/nullptr None
文件读 fopen/fread with open(...) as f:
注释 // #
打印 printf/cout print()
输入 scanf/cin input()

效果演示

以上对照表覆盖了C/C++开发者最常用的语法场景,建议收藏备用。


结语

Python跟C/C++最大的不同,其实不是语法,而是”思维方式”。C/C++让你关心内存、类型、编译,Python让你专注”我要做什么”。

如果你已经熟悉C/C++,学Python大概只需要一周就能上手。遇到不懂的,多 print() 调试,多看报错信息(Python的错误信息其实挺友好的),多试几次就熟练了。

希望这份手册能帮你顺利过渡到Python。

写代码愉快!