加载中...

Python VS C(上篇)


写在最前 ✍️

相信不少科班的同学最先学习的编程语言是 C语言

之后因为各种各样的需求,就去学习了更多的语言,比如 PythonJava 等。

如今 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 = truebool 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 = Trueis_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


文章作者: Rickyの水果摊
版权声明: 本博客所有文章除特別声明外,均采用 CC BY 4.0 许可协议。转载请注明来源 Rickyの水果摊 !
  目录