写在最前 ✍️
相信不少科班的同学最先学习的编程语言是 C语言。
之后因为各种各样的需求,就去学习了更多的语言,比如 Python,Java 等。
如今 Python 的热度可以说是越来越高,依靠其强大的计算生态,Python 牢牢占据 TIOBE 热门编程语言排行榜 TOP3 的位置(写稿日:2023 年 4 月 14 日,Python 是 TOP1)。
相比 C语言,Python 在人工智能、数据科学、自动化、网页开发等领域有更加广泛的应用。
但是从 基本语法 的角度来看,Python 和 C语言 有不少共通之处。
所以本文将从这个角度切入,列举 Python 和 C语言 在基础语法上的异同点,帮助已经掌握 C语言的同学更快上手 Python。
本篇博客也是摊主的 CS50 课程学习笔记。
CS50 是哈佛大学的计算机导论公开课,也是摊主截止目前认为最棒的计算机导论课程。
授课的 David J. Malan 教授是摊主见过的对计算机教学最热情的老师,也是在计算机基础教学领域对摊主影响最大的一位老师。摊主也希望通过自己的努力,不断向 Malan 教授这样的大牛看齐。
有兴趣的小伙伴可以点击下面的链接,查看 CS50 课程的相关信息。
CS50 官方课程网站:https://cs50.harvard.edu/x/2023/
正文(上篇)
程序运行过程
C语言
在 C语言 中,源代码 test.c
通过 编译器 编译为可执行文件 test
gcc -o test test.c
执行该文件
./test
Python
Python 是 解释型语言,不需要编译成可执行文件,源代码 test.py
可以直接被 解释器 读取和执行,解释器会逐行解释代码并执行相应的操作。
python test.py
库/模块的导入
C语言
基本语法
#include <...> // 基本语法
实例
#include <stdio.h> // 实例
#include <string.h>
#include <math.h>
Python
基本语法
import <...> # 导入整个模块
import <...> as <...> # 导入整个模块并且给模块取别名
from <...> import <...> # 导入模块中的某个方法或属性
from <...> import * # 导入模块中的所有方法和属性
实例
import csv
import numpy as np
from math import sqrt, sin, cos
from datetime import *
主函数
C语言
在C语言中,主函数 main
是程序执行的起点,它的函数原型如下:
int main(int argc, char *argv[]);
其中,argc
表示命令行参数的数量,argv
是一个指向每个参数的指针数组。主函数可以通过命令行参数来接收外部传递进来的数据。
一些特点
main
函数必须存在于程序中,否则编译器会报错。main
函数中的代码将按照从上到下的顺序依次执行。程序执行结束后,
main
函数可以返回一个整数值,表示程序的执行结果。一般来说,返回值为 0 表示程序执行成功,非零值表示程序执行失败或出错。
C语言 main
函数实例:
#include <stdio.h>
int main(int argc, char *argv[]) {
printf("Hello, World!\n");
return 0;
}
Python
Python 中没有像 C 语言中的 main
函数那样的入口函数,整个 Python 脚本都是可执行的。
但是,为了方便编写测试代码和模块化编程,Python 提供了一种 判断当前脚本是否作为主程序执行 的方式,即通过判断 __name__
变量的值是否为 "__main__"
。
- 当 Python 脚本作为主程序执行时,
__name__
的值会被设置为"__main__"
- 当 Python 脚本作为模块被导入时,
__name__
的值会被设置为模块的名称。
这个特性可以让我们在 Python 脚本中编写一些测试代码,但不会影响到被导入的代码。
通常,在 Python 脚本的末尾会使用以下代码来判断当前脚本是否作为主程序执行:
if __name__ == "__main__":
# 在这里编写主程序
在这个代码块中,我们可以编写 Python 脚本的主要逻辑。当我们在命令行中执行这个脚本时,就会执行这个代码块中的代码。例如,下面是一个简单的 Python 脚本示例:
def say_hello():
print("Hello, World!")
if __name__ == "__main__":
say_hello()
当我们在命令行中执行这个脚本时,将会输出 "Hello, World!"
;而如果我们将这个脚本作为模块导入到其他脚本中时,say_hello
函数不会被执行。
基本数据类型
C/C++
数据类型 | 实例 | 备注 |
---|---|---|
bool | bool is_prime = true 、bool is_odd = false |
早期 C语言 并不支持 bool 类型,通常用0和1表示而 C++ 支持 bool 类型 |
char | char c = 'b' |
表示单个字符 |
int | int n = 10 |
整数 |
float | float a = 1.101 |
单精度浮点数 |
double | double b = 1.10001 |
双精度浮点数 |
long | long long n = 10000 |
长整形 |
string | string s = "hello" |
C语言 并没有 string 类型,通常用字符数组或字符指针表示而 C++ 支持 string 类型 |
🍉 PS:更多语法细节由于篇幅所限,且本文重点是两个语言的语法对比,故暂不列出,有需要同学可以自行查阅相关细节。
Python
数据类型 | 实例 | 备注 |
---|---|---|
bool | is_prime = True 、is_odd = False |
首字母需大写 |
int | num = 10 |
整数 |
float | avg = 33.333 |
浮点数 |
complex | c = 1 + 2j |
复数 |
str | s = 'hello' 、t = "world" |
单引号和双引号均可表示字符串 |
NoneType | n = None |
空类型,表示没有值,用于占位或表示不存在的情况。 |
🍉 PS:C 语言中的整数类型有固定的位数,例如 int 类型通常是 32 位或 64 位。而 Python 中的整数类型是动态的,可以表示任意大小的整数。
Python中的列表(list)、集合(set)、字典(dictionary)等将在 Python VS C(下篇)中对比。
变量
C语言
int counter = 0; // 需要指定变量的数据类型
counter++; // 支持++等自增运算符
C 语言是一种 静态类型语言,需要 在使用变量之前明确定义变量的数据类型。
Python
counter = 0 # 无需指定变量的数据类型
counter += 1 # 不支持++等自增运算符
Python 是一种 动态类型语言,因此它的数据类型是动态推断的,不需要事先定义变量的数据类型。
🍉PS:Python 中的数据类型通常是对象,具有更加丰富和灵活的操作和属性,例如字符串类型的方法和属性可以方便地进行字符串的处理和操作。而 C 语言中的数据类型则通常是基本数据类型,需要使用函数来进行操作和处理。
逻辑运算符
Python 和 C 语言都支持「与」、「或」、「非」等逻辑运算符,但是具体的语法略有不同。
C语言
&&
运算符:当两个操作数都为真(非零)时,结果为真,否则为假。||
运算符:当两个操作数中至少有一个为真(非零)时,结果为真,否则为假。!
运算符:对操作数取反,即真变为假,假变为真。
Python
and
运算符:当两个操作数都为 True 时,结果为 True,否则为 False。or
运算符:当两个操作数中有至少一个为 True 时,结果为 True,否则为 False。not
运算符:对操作数取反,即 True 变为 False,False 变为 True。
🍉 PS:C 语言 中的逻辑运算符 不具有短路运算 的特性,总是会计算左右两侧的操作数;而 Python 中的逻辑运算符具有 短路运算 的特性,当左侧操作数已经可以确定结果时,右侧操作数不再进行计算。
算术运算符
运算符 | 描述 | C 示例 | Python 示例 |
---|---|---|---|
+ | 加法 | a + b |
a + b |
- | 减法 | a - b |
a - b |
* | 乘法 | a * b |
a * b |
/ | 浮点除法 | a / b |
a / b |
% | 取模 | a % b |
a % b |
/ | 整除 | a / b |
a // b |
$a^b$ | 幂运算 | pow() |
a ** b |
🍉 PS1:在 C 语言中,没有幂运算符,需要使用库函数 pow()
来进行幂运算,且 pow()
函数返回的是一个浮点数值,需要进行类型转换才能得到整数类型的结果。
例如:
#include <stdio.h>
#include <math.h>
int main() {
int a = 2;
int b = 3;
int c = pow(a, b); // c 的值为 8,
printf("%d\n", c);
return 0;
}
🍉 PS2:需要注意的是,在 C 语言中进行整数除法时,如果两个操作数都是整数,则除法运算符 /
返回的是一个整数值,会向下取整;而在 Python 中,除法运算符 /
返回的是一个浮点数值。
位运算
Python 和 C 语言中的位运算符均包括按位与(&)、按位或(|)、按位异或(^)、按位取反(~)、左移位(<<)和右移位(>>)等运算。
运算符 | 描述 | C 示例 | Python 示例 |
---|---|---|---|
& | 按位与 | a & b |
a & b |
| | 按位或 | a | b |
a | b |
^ | 按位异或 | a ^ b |
a ^ b |
~ | 按位取反 | ~a |
~a |
<< | 左移位 | a << b |
a << b |
>> | 右移位 | a >> b |
a >> b |
🍉 PS1:C 语言中的位运算符只能用于整数类型,包括有符号整数和无符号整数,而 Python 中的位运算符可以用于整数类型和布尔类型,布尔类型会被转换为整数类型(True 转换为 1,False 转换为 0)。
🍉 PS2:Python 和 C 语言的右移运算符(>>)在处理有符号整数时表现不同。Python 对负数的右移是向零舍入(也称为算术右移),而 C 语言的行为是依赖于编译器实现的(可能是算术右移或逻辑右移)。
条件语句
C语言
int x = 3, y = 5;
if (x > y) {
printf("x > y\n");
} else if (x == y) {
printf("x = y\n");
} else {
printf("x < y\n");
}
Python
x = 3
y = 5
if x > y:
print("x > y")
elif x == y:
print("x = y")
else:
print("x < y")
不同点:
- C语言的条件表达式需要由括号
()
括起来,而 Python 的条件表达式无需添加()
(但是加了也没错) - C语言使用 花括号
{}
来表示代码块,而 Python 使用 缩进 来表示代码块,且需要在条件表达式后添加:
- C语言使用
else if
,而 Python 使用elif
写在最后 ✍️
由于篇幅有限,且为了读者更好的阅读体验,摊主把内容拆成了上篇和下篇,更多对比内容见 Python VS C(下篇)☘️
参考资料 📚
Python官方教程:https://docs.python.org/3/tutorial/
CS50:https://cs50.harvard.edu/x/2023/
ChatGPT:https://openai.com/blog/chatgpt