从 C 语言过渡到 Python:给 C 程序员的快速入门教程
从 C 语言过渡到 Python:给 C 程序员的快速入门教程
面向已经学过 C 语言、理解变量、函数、数组、指针、结构体、文件操作和基本算法的同学。
本文目标不是重新教你编程,而是帮助你把 C 语言思维平滑迁移到 Python。
一、为什么 C 程序员要学习 Python?
如果你已经学过 C 语言,你通常已经掌握了这些基础能力:
- 变量和数据类型
- 条件判断
- 循环结构
- 函数封装
- 数组使用
- 指针理解
- 结构体
- 文件操作
- 基本算法
- 程序调试思维
这些能力非常重要,因为 C 语言更接近底层,能帮助你理解内存、地址、数据结构和程序执行过程。
但是在很多场景下,Python 会更加高效。
例如:
- 自动化脚本
- 数据处理
- 爬虫开发
- 人工智能
- 机器学习
- 后端开发
- 测试工具
- 文件批处理
- 图像处理
- 科学计算
- 数据可视化
可以简单理解:
C 语言:更接近底层,适合系统开发、嵌入式、驱动、性能敏感场景
Python:更接近业务和工具层,适合快速开发、自动化、数据处理、AI 应用
如果你已经会 C,那么学习 Python 会比零基础更快,因为你已经理解了程序的基本逻辑。
二、C 和 Python 的核心区别
1. C 语言需要编译,Python 通常直接运行
C 语言执行流程:
源代码 .c
↓
编译
↓
生成可执行文件
↓
运行程序
例如:
gcc main.c -o main
./main
Python 执行流程:
源代码 .py
↓
解释器执行
例如:
python main.py
Python 不需要像 C 那样手动编译生成 exe 文件,因此更适合快速测试和快速开发。
2. C 语言需要声明类型,Python 不需要显式声明类型
C 语言:
int age = 18;
float price = 9.9;
char name[] = "Tom";
Python:
age = 18
price = 9.9
name = "Tom"
Python 是动态类型语言,变量不需要提前声明类型。
但是这不代表 Python 没有类型,而是解释器会根据赋值自动判断类型。
x = 10
print(type(x))
x = "hello"
print(type(x))
输出:
<class 'int'>
<class 'str'>
3. C 语言用大括号表示代码块,Python 用缩进表示代码块
C 语言:
if (age >= 18)
{
printf("成年人\n");
}
Python:
if age >= 18:
print("成年人")
Python 非常重视缩进。
错误写法:
if age >= 18:
print("成年人")
正确写法:
if age >= 18:
print("成年人")
建议统一使用 4 个空格缩进。
4. C 语言每行通常要加分号,Python 不需要
C 语言:
int a = 10;
int b = 20;
int c = a + b;
Python:
a = 10
b = 20
c = a + b
Python 不需要在每行末尾加分号。
5. C 语言手动管理内存,Python 自动管理内存
C 语言中你可能会用:
malloc()
free()
Python 通常不需要手动申请和释放内存。
例如:
nums = [1, 2, 3, 4, 5]
Python 会自动管理对象的创建和释放。
但是你依然要理解:
变量名不是数据本身,而是对象的引用
这一点和 C 语言中的指针思想有一点相似。
三、C 和 Python 基础语法对照表
| C 语言 | Python | 说明 |
|---|---|---|
int a = 10; |
a = 10 |
Python 不需要声明类型 |
printf() |
print() |
输出 |
scanf() |
input() |
输入 |
if (...) {} |
if 条件: |
条件判断 |
for(i=0;i<n;i++) |
for i in range(n) |
循环 |
while (...) {} |
while 条件: |
while 循环 |
| 数组 | 列表 list | Python 列表更灵活 |
| 字符数组 | 字符串 str | Python 字符串更方便 |
| 结构体 struct | 类 class / 字典 dict | 根据场景选择 |
| 指针 | 引用 | Python 没有 C 那种裸指针 |
#include |
import |
导入库 |
.c / .h |
.py |
文件类型 |
| 编译运行 | 解释执行 | Python 更适合快速开发 |
四、输入和输出
1. C 语言输出
#include <stdio.h>
int main()
{
printf("Hello C\n");
return 0;
}
2. Python 输出
print("Hello Python")
Python 的输出非常简单。
3. C 语言输入
int age;
scanf("%d", &age);
printf("age = %d\n", age);
4. Python 输入
age = input("请输入年龄:")
print(age)
注意:input() 得到的默认是字符串。
如果需要整数,要手动转换:
age = int(input("请输入年龄:"))
print(age + 1)
如果需要小数:
price = float(input("请输入价格:"))
print(price)
五、变量和数据类型
1. C 语言常见类型
int a = 10;
float b = 3.14;
double c = 3.1415926;
char d = 'A';
char str[] = "hello";
2. Python 常见类型
a = 10 # int 整数
b = 3.14 # float 小数
c = "hello" # str 字符串
d = True # bool 布尔值
e = [1, 2, 3] # list 列表
f = (1, 2, 3) # tuple 元组
g = {"name": "Tom"} # dict 字典
h = {1, 2, 3} # set 集合
查看变量类型:
x = 100
print(type(x))
六、条件判断
1. C 语言写法
if (score >= 90)
{
printf("优秀\n");
}
else if (score >= 60)
{
printf("及格\n");
}
else
{
printf("不及格\n");
}
2. Python 写法
score = 85
if score >= 90:
print("优秀")
elif score >= 60:
print("及格")
else:
print("不及格")
注意:
C 语言:else if
Python:elif
七、循环结构
1. while 循环
C 语言:
int i = 0;
while (i < 5)
{
printf("%d\n", i);
i++;
}
Python:
i = 0
while i < 5:
print(i)
i += 1
2. for 循环
C 语言:
for (int i = 0; i < 5; i++)
{
printf("%d\n", i);
}
Python:
for i in range(5):
print(i)
输出:
0
1
2
3
4
range(5) 表示生成 0 到 4。
3. 指定起点和终点
for i in range(1, 6):
print(i)
输出:
1
2
3
4
5
4. 指定步长
for i in range(0, 10, 2):
print(i)
输出:
0
2
4
6
8
5. break 和 continue
C 语言和 Python 都有 break 和 continue。
Python 示例:
for i in range(10):
if i == 5:
break
print(i)
for i in range(10):
if i == 5:
continue
print(i)
八、函数
1. C 语言函数
int add(int a, int b)
{
return a + b;
}
int main()
{
int result = add(10, 20);
printf("%d\n", result);
return 0;
}
2. Python 函数
def add(a, b):
return a + b
result = add(10, 20)
print(result)
Python 使用 def 定义函数。
格式:
def 函数名(参数1, 参数2):
函数体
return 返回值
3. Python 函数可以返回多个值
C 语言中如果想返回多个值,通常需要使用指针或结构体。
Python 可以直接返回多个值:
def get_info():
name = "Tom"
age = 18
return name, age
name, age = get_info()
print(name)
print(age)
4. 默认参数
Python 支持默认参数:
def say_hello(name="同学"):
print("你好," + name)
say_hello()
say_hello("小明")
输出:
你好,同学
你好,小明
九、数组和列表
1. C 语言数组
int nums[5] = {1, 2, 3, 4, 5};
printf("%d\n", nums[0]);
C 语言数组长度通常固定,操作也比较底层。
2. Python 列表 list
nums = [1, 2, 3, 4, 5]
print(nums[0])
print(nums[1])
Python 列表可以存储不同类型的数据:
data = [1, "hello", 3.14, True]
print(data)
3. 添加元素
nums = [1, 2, 3]
nums.append(4)
print(nums)
输出:
[1, 2, 3, 4]
4. 删除元素
nums = [1, 2, 3, 4]
nums.remove(3)
print(nums)
输出:
[1, 2, 4]
5. 按下标删除
nums = [10, 20, 30, 40]
del nums[1]
print(nums)
输出:
[10, 30, 40]
6. 遍历列表
nums = [10, 20, 30, 40]
for num in nums:
print(num)
如果需要下标:
nums = [10, 20, 30, 40]
for i in range(len(nums)):
print(i, nums[i])
更推荐使用:
nums = [10, 20, 30, 40]
for index, value in enumerate(nums):
print(index, value)
十、字符串
1. C 语言字符串
C 语言中字符串本质上是字符数组:
char str[] = "hello";
操作字符串通常需要:
strlen()
strcpy()
strcmp()
strcat()
2. Python 字符串
Python 字符串非常方便:
name = "Python"
print(name)
print(len(name))
print(name[0])
3. 字符串拼接
first = "Hello"
second = "Python"
result = first + " " + second
print(result)
4. 格式化字符串
推荐使用 f-string:
name = "Tom"
age = 18
print(f"我叫{name},今年{age}岁")
类似 C 语言:
printf("我叫%s,今年%d岁", name, age);
5. 常用字符串方法
text = " hello python "
print(text.strip()) # 去掉两边空格
print(text.upper()) # 转大写
print(text.lower()) # 转小写
print(text.replace("python", "C"))
print(text.split())
十一、字典 dict:类似更强大的结构体和键值表
C 语言中如果要描述一个学生,可能会用结构体:
struct Student
{
char name[20];
int age;
float score;
};
Python 可以用字典:
student = {
"name": "Tom",
"age": 18,
"score": 95.5
}
print(student["name"])
print(student["age"])
print(student["score"])
1. 修改字典
student["age"] = 19
student["score"] = 98
print(student)
2. 添加字段
student["school"] = "ABC大学"
print(student)
3. 删除字段
del student["score"]
print(student)
4. 遍历字典
student = {
"name": "Tom",
"age": 18,
"score": 95.5
}
for key, value in student.items():
print(key, value)
十二、元组 tuple
元组和列表类似,但是元组创建后不能修改。
point = (10, 20)
print(point[0])
print(point[1])
适合表示固定数据,例如坐标:
position = (100, 200)
列表和元组区别:
| 类型 | 是否可修改 | 写法 |
|---|---|---|
| list 列表 | 可以修改 | [1, 2, 3] |
| tuple 元组 | 不可修改 | (1, 2, 3) |
十三、集合 set
集合的特点是:
元素不重复
适合去重
适合交集、并集、差集操作
示例:
nums = {1, 2, 3, 3, 4, 4, 5}
print(nums)
输出:
{1, 2, 3, 4, 5}
列表去重:
nums = [1, 2, 2, 3, 3, 4]
new_nums = list(set(nums))
print(new_nums)
十四、指针思维如何迁移到 Python?
C 语言中你会接触指针:
int a = 10;
int *p = &a;
printf("%d\n", *p);
Python 没有 C 语言那种裸指针,不能直接操作内存地址。
但是 Python 中变量保存的是对象的引用。
例如:
a = [1, 2, 3]
b = a
b.append(4)
print(a)
print(b)
输出:
[1, 2, 3, 4]
[1, 2, 3, 4]
原因是:
a 和 b 指向同一个列表对象
如果想复制一个新列表:
a = [1, 2, 3]
b = a.copy()
b.append(4)
print(a)
print(b)
输出:
[1, 2, 3]
[1, 2, 3, 4]
对于 C 程序员来说,可以这样理解:
Python 没有指针语法,但变量本质上是对象引用
可变对象要注意共享引用问题
十五、可变对象和不可变对象
Python 中常见不可变对象:
int
float
str
tuple
bool
常见可变对象:
list
dict
set
示例:
def change_list(data):
data.append(100)
nums = [1, 2, 3]
change_list(nums)
print(nums)
输出:
[1, 2, 3, 100]
因为列表是可变对象,函数内部修改会影响原列表。
再看整数:
def change_num(x):
x = x + 1
a = 10
change_num(a)
print(a)
输出:
10
因为整数是不可变对象,函数内部重新赋值不会改变外部变量。
十六、类和对象
C 语言没有原生的面向对象语法,一般用结构体加函数模拟。
C 语言结构体:
struct Student
{
char name[20];
int age;
};
Python 可以直接定义类:
class Student:
def __init__(self, name, age):
self.name = name
self.age = age
def show_info(self):
print(f"姓名:{self.name},年龄:{self.age}")
stu = Student("Tom", 18)
stu.show_info()
1. __init__ 是什么?
__init__ 是构造方法,对象创建时自动调用。
def __init__(self, name, age):
self.name = name
self.age = age
相当于初始化对象数据。
2. self 是什么?
self 表示当前对象本身。
类似 C 语言中你写结构体函数时传入结构体指针:
void show_info(struct Student *stu)
{
printf("%s", stu->name);
}
Python 中:
def show_info(self):
print(self.name)
可以粗略理解:
self ≈ 当前对象的指针
十七、模块和导入
C 语言中使用头文件:
#include <stdio.h>
#include "my_func.h"
Python 中使用 import:
import math
print(math.sqrt(16))
也可以这样导入:
from math import sqrt
print(sqrt(16))
1. 自定义模块
创建文件 tools.py:
def add(a, b):
return a + b
创建文件 main.py:
import tools
result = tools.add(10, 20)
print(result)
也可以:
from tools import add
print(add(10, 20))
十八、文件操作
1. C 语言文件操作
FILE *fp = fopen("test.txt", "w");
fprintf(fp, "hello");
fclose(fp);
2. Python 写文件
with open("test.txt", "w", encoding="utf-8") as f:
f.write("hello python")
3. Python 读文件
with open("test.txt", "r", encoding="utf-8") as f:
content = f.read()
print(content)
4. 按行读取
with open("test.txt", "r", encoding="utf-8") as f:
for line in f:
print(line.strip())
with open() 的好处是文件使用完会自动关闭。
十九、异常处理
C 语言中通常用返回值判断错误:
FILE *fp = fopen("test.txt", "r");
if (fp == NULL)
{
printf("文件打开失败\n");
}
Python 使用异常处理:
try:
with open("test.txt", "r", encoding="utf-8") as f:
content = f.read()
print(content)
except FileNotFoundError:
print("文件不存在")
except Exception as e:
print("发生错误:", e)
基本格式:
try:
可能出错的代码
except 异常类型:
出错后的处理
二十、列表推导式
Python 有一种非常方便的写法,叫列表推导式。
普通写法:
nums = []
for i in range(1, 6):
nums.append(i * i)
print(nums)
列表推导式:
nums = [i * i for i in range(1, 6)]
print(nums)
输出:
[1, 4, 9, 16, 25]
带条件:
nums = [i for i in range(10) if i % 2 == 0]
print(nums)
输出:
[0, 2, 4, 6, 8]
二十一、Python 常用内置函数
| 函数 | 作用 |
|---|---|
print() |
输出 |
input() |
输入 |
type() |
查看类型 |
len() |
获取长度 |
int() |
转整数 |
float() |
转小数 |
str() |
转字符串 |
list() |
转列表 |
dict() |
创建字典 |
set() |
创建集合 |
range() |
生成数字序列 |
sum() |
求和 |
max() |
最大值 |
min() |
最小值 |
sorted() |
排序 |
enumerate() |
同时获取下标和值 |
示例:
nums = [3, 1, 5, 2, 4]
print(len(nums))
print(sum(nums))
print(max(nums))
print(min(nums))
print(sorted(nums))
二十二、包管理工具 pip
Python 的生态非常丰富,很多功能可以直接安装第三方库。
安装库:
pip install requests
使用库:
import requests
response = requests.get("https://www.example.com")
print(response.text)
常见第三方库:
| 库名 | 作用 |
|---|---|
| requests | 网络请求 |
| pandas | 数据处理 |
| numpy | 数值计算 |
| matplotlib | 数据可视化 |
| flask | Web 后端 |
| django | Web 后端 |
| opencv-python | 图像处理 |
| beautifulsoup4 | 网页解析 |
| selenium | 自动化测试 / 动态网页 |
| pyserial | 串口通信 |
二十三、虚拟环境
Python 项目建议使用虚拟环境,避免不同项目依赖冲突。
创建虚拟环境:
python -m venv venv
Windows 激活:
venv\Scripts\activate
macOS / Linux 激活:
source venv/bin/activate
退出虚拟环境:
deactivate
安装依赖:
pip install requests
导出依赖:
pip freeze > requirements.txt
安装依赖文件:
pip install -r requirements.txt
二十四、C 程序员最容易踩的 Python 坑
1. 忘记缩进
错误:
if True:
print("hello")
正确:
if True:
print("hello")
2. 把 = 和 == 搞混
赋值:
a = 10
判断相等:
if a == 10:
print("a 等于 10")
3. input 得到的是字符串
错误:
age = input("请输入年龄:")
print(age + 1)
正确:
age = int(input("请输入年龄:"))
print(age + 1)
4. 列表下标越界
nums = [1, 2, 3]
print(nums[3])
错误原因:
nums 的下标只有 0、1、2
5. 可变对象共享引用
a = [1, 2, 3]
b = a
b.append(4)
print(a)
输出:
[1, 2, 3, 4]
如果想复制:
b = a.copy()
6. 不要用 C 的思维强行写 Python
C 风格:
nums = [1, 2, 3, 4, 5]
for i in range(len(nums)):
print(nums[i])
Python 更推荐:
nums = [1, 2, 3, 4, 5]
for num in nums:
print(num)
如果需要下标:
for index, value in enumerate(nums):
print(index, value)
二十五、从 C 到 Python 的学习路线
阶段一:掌握 Python 基础语法
需要学习:
变量
输入输出
条件判断
循环
函数
列表
字符串
字典
元组
集合
文件操作
异常处理
目标:
能用 Python 写简单控制台程序
阶段二:掌握 Python 常用数据结构
重点学习:
list
dict
set
tuple
str
目标:
能熟练处理数据、文本、列表、表格型内容
阶段三:掌握模块和包管理
重点学习:
import
pip
venv
requirements.txt
目标:
会安装第三方库
会管理项目依赖
会拆分多个 Python 文件
阶段四:做自动化脚本
适合练习:
批量重命名文件
统计文件夹大小
读取 Excel
整理 txt 文件
批量处理图片
批量下载网页内容
目标:
能用 Python 解决日常重复性工作
阶段五:根据方向选择进阶路线
| 方向 | 推荐学习内容 |
|---|---|
| 数据分析 | numpy、pandas、matplotlib |
| 爬虫 | requests、BeautifulSoup、selenium |
| 后端开发 | Flask、Django、FastAPI |
| 人工智能 | numpy、pytorch、scikit-learn |
| 图像处理 | OpenCV、Pillow |
| 自动化测试 | pytest、selenium |
| 嵌入式上位机 | pyserial、socket、tkinter、PyQt |
| 工具开发 | argparse、os、pathlib、logging |
二十六、适合 C 程序员练习的 Python 小项目
项目 1:成绩管理系统
功能:
添加学生
删除学生
修改成绩
查询成绩
计算平均分
按照成绩排序
保存到文件
可以练习:
列表
字典
函数
文件操作
排序
项目 2:批量文件重命名工具
功能:
读取某个文件夹
批量修改文件名
添加前缀
添加编号
修改后缀
可以练习:
os
pathlib
字符串处理
文件操作
项目 3:串口数据读取工具
功能:
打开串口
读取 MCU 上传的数据
解析数据
保存到文件
可以练习:
pyserial
字符串解析
文件保存
异常处理
项目 4:简单爬虫
功能:
请求网页
提取标题
保存内容
可以练习:
requests
BeautifulSoup
文件操作
项目 5:数据可视化
功能:
读取 CSV 文件
统计数据
绘制折线图或柱状图
可以练习:
pandas
matplotlib
数据处理
图表绘制
二十七、C 和 Python 的综合对比
| 对比项 | C 语言 | Python |
|---|---|---|
| 执行方式 | 编译执行 | 解释执行 |
| 类型系统 | 静态类型 | 动态类型 |
| 语法风格 | 大括号和分号 | 缩进 |
| 内存管理 | 手动管理 | 自动管理 |
| 运行速度 | 快 | 相对较慢 |
| 开发效率 | 较低 | 很高 |
| 底层能力 | 强 | 较弱 |
| 生态方向 | 嵌入式、系统、驱动 | 数据、AI、自动化、Web |
| 学习难点 | 指针、内存、编译 | 库生态、对象引用、项目管理 |
| 适合场景 | 性能敏感、硬件底层 | 快速开发、工具、数据处理 |
二十八、一个完整 Python 小案例:学生成绩管理
下面这个案例适合刚从 C 语言过渡到 Python 的同学练习。
students = []
def add_student():
name = input("请输入学生姓名:")
score = float(input("请输入学生成绩:"))
student = {
"name": name,
"score": score
}
students.append(student)
print("添加成功")
def show_students():
if len(students) == 0:
print("暂无学生信息")
return
for index, student in enumerate(students):
print(f"{index + 1}. 姓名:{student['name']},成绩:{student['score']}")
def average_score():
if len(students) == 0:
print("暂无学生信息")
return
total = 0
for student in students:
total += student["score"]
avg = total / len(students)
print(f"平均分:{avg}")
def main():
while True:
print("====== 学生成绩管理系统 ======")
print("1. 添加学生")
print("2. 查看学生")
print("3. 计算平均分")
print("0. 退出系统")
choice = input("请输入操作编号:")
if choice == "1":
add_student()
elif choice == "2":
show_students()
elif choice == "3":
average_score()
elif choice == "0":
print("系统退出")
break
else:
print("输入错误,请重新输入")
main()
这个案例涉及:
列表
字典
函数
循环
条件判断
输入输出
字符串格式化
如果你能看懂并自己修改这个案例,就说明你已经完成了从 C 基础到 Python 基础的第一步。
二十九、最终理解
从 C 语言过渡到 Python,最重要的是改变三个思维。
1. 从“关注内存细节”转向“关注数据处理”
C 语言更关注:
内存
地址
指针
数组边界
数据类型
编译链接
Python 更关注:
数据结构
业务逻辑
文件处理
第三方库
开发效率
2. 从“自己造轮子”转向“善用库”
C 语言中很多功能需要自己写。
Python 中很多功能可以直接使用库。
例如:
网络请求:requests
数据处理:pandas
图像处理:opencv-python
串口通信:pyserial
图表绘制:matplotlib
Python 的优势之一就是生态丰富。
3. 从“写给机器看”转向“写给人看”
Python 非常强调代码可读性。
好的 Python 代码应该:
变量名清晰
函数功能单一
缩进规范
逻辑直观
少写重复代码
多使用内置函数和标准库
三十、结语
如果你已经会 C 语言,学习 Python 并不难。
你只需要记住:
C 语言让你理解计算机底层
Python 让你快速解决实际问题
二者不是替代关系,而是互补关系。
可以这样理解:
C 语言适合打基础、做底层、追求性能
Python 适合做工具、做数据、做自动化、快速开发
当你既懂 C,又会 Python,你就可以同时具备:
底层理解能力
工程实现能力
快速开发能力
工具自动化能力
数据处理能力
这对于嵌入式开发、机器人开发、AI 应用、自动化测试、后端开发都非常有帮助。
从 C 到 Python,最推荐的路线是:
先掌握基础语法
再熟悉列表、字典、字符串
然后学习文件操作和异常处理
接着学习 pip 和虚拟环境
最后通过小项目不断练习
只要你能用 Python 独立完成几个小工具,比如文件批处理、串口数据读取、成绩管理系统、简单爬虫,就说明你已经成功从 C 语言过渡到了 Python。
AtomGit 是由开放原子开源基金会联合 CSDN 等生态伙伴共同推出的新一代开源与人工智能协作平台。平台坚持“开放、中立、公益”的理念,把代码托管、模型共享、数据集托管、智能体开发体验和算力服务整合在一起,为开发者提供从开发、训练到部署的一站式体验。
更多推荐


所有评论(0)