最近几年python语言非常受大家欢迎,所以我也想学习了解下python语言,但是学习之前总是有很多疑问。
因为我现在只会汇编和C语言,所有我想在学习它之前先了解一下python和我常用的C语言有什么不一样的地方,有什么优点,以及它可以应用在哪些领域等等。
所以我上网查了一下相关话题,在知乎上找到了一个比较被大众接受的回答,所以赶快收藏起来;作者从以下三个进行了阐述:
区别:
C 属编译型语言,Python 属解释型语言。这点其他答主提过,确实是重要的区分点。编译型和解释型,在编程时的最大区别是必不必要写一个入口函数,在C语言里是 main
,而 Python 可以不写。
编译型的优点是“静态”,代码不能一行一行编译执行,必须作为整个工程来编译,这样便于类型检查,降低运行时错误率;运行时效率更高,因为编译器可以统筹各个方面,生成更优化的机器指令;一经编译便可直接以机器语言再次执行。
解释型语言的优点是“动态”,代码的每一行可独立执行(代码块除外)。这样就可以灵活地进行实时交互,调整正在运行的程序,进行实时、异步的调试。
比如 Python 的 CLI(命令行交互界面)就可以直接输入 Python 代码执行。这是 C 语言这样的编译语言难以做到的(调试模式下可以做到 C 表达式的实时计算,但达不到解释型语言的灵活度)。解释型语言的特性还让其适合做脚本语言。
二者的缺点则互为对方占优的方面。编译型需要大量的编译时间,不够灵活。在大项目中,需求的更改可能导致巨大的重新编译时间。不过这被运行效率弥补,没有其他更大的缺点。而解释型语言被诟病得相对较多,比如因为不能事先编译,执行时都要先解释(本质上就是对单行的编译)成机器代码再执行,因此效率低很多。
不过针对这点,Python 现在会像编译型语言一样把第一次执行时产生的字节码(虚拟机器代码)输出到 .pyc 文件,下次若源文件未改变,可直接执行字节码文件,从而提升了运行效率。
另外,解释型语言难以实现静态类型检查,所以容易产生运行时错误,因此相对不适合用来做大项目。其实非要让编译型语言也能支持命令行交互也并非不可能——Haskell就是这样一个异类。它不仅能单行执行,甚至还能做静态类型检查,这个会在后面提到。
C 是弱类型、静态类型检查的,Python 是强类型、动态类型检查的。对于不了解的人来说,这种说法可能会引起质疑。来一条一条看。
C 是弱类型?各种「类型不匹配」快要把我搞疯了,这还弱吗?“静态类型检查”又是什么鬼?理解这件事情,要先知道 C 语言中类型的本质:一定长度的字节。C 中大多数基本类型都是某种长度的整数:int, short, long, long long, char,各种 unsigned,甚至指针也只是地址——机器字长度的整数而已,唯独 float 与 double 特殊。稍复杂点的,有数组和结构体,它们只是若干个整数或浮点数的组合。这种简单粗暴是因为 C 出生很早,那时冯诺依曼体系的高级语言大都与汇编很接近——汇编里没有类型,只有不同长度的字节。而 Python 中你是看不到 int, unsigned int, long 的区分的,因为它把不同长度的整数类型简化了,超出长度就自动扩展。
扯远了。知道 C 中的类型大体就是各种整数,就能想到各种整数可以互相转化:int 转化 long 很好理解,char 和 int 也经常互相转换,那你想过 int 能与任何一种指针强制转换吗?而这是源于 int 是最常用的整数类型,而地址也是最重要的机器整数。你还知道 void* 能与任何指针类型转换吗?其实所有的指针都可以任意互相转换,这意味着看似类型系统严格的 C 实际上并没有限制你去滥用它。这也不一定是滥用——库函数 malloc 的返回类型就是 void*,它表示你可以将它看作任何类型的指针。那不同指针能相互转化又怎样呢?我们知道 Python 里的对象是一系列属性和方法的集合,这在 C 中类似于结构体。对象的名字相当于指向它在内存中实体的指针——相当于结构体指针。不同结构体指针可以任意转化意味着……对,一个变量名可以代表任何对象,这不就是弱类型嘛!那什么叫静态类型检查呢?对,就是那个让你饱受编译错误苦恼的东西。我说过编译型语言是“静态”的,所以静态类型检查只可能在编译型语言实现(前述,Haskell 是个杂糅者,它是编译型语言,但又可以单行执行)。C 要求你写出每个变量、函数的类型,就是为了类型检查。但并不是静态类型检查就一定要标注类型(如 Haskell 就几乎完全可以不写)。
Python “动态类型”,我可以理解,因为写的时候完全不用声明类型嘛。但你说它「强类型」?这我可不服了,哪个「强类型」语言可以随意给变量赋任意值的?前面说过,储存对象的变量实际上只是储存对象在内存中的地址(而「值类型」,如小整数,一般直接存储值)。变量存储在「栈」中,对象被放在「堆」中。「栈」是一个个整齐叠放的,「堆」是随机开辟的。当我们执行 a = [1,2,3]
这样一条语句,Python 运行环境在「堆」中生成新的 list 对象,将对象的首地址返回,赋给新变量 a
压入栈中。之后若执行 a = { 'x': 1 }
,只不过是将 a
中的地址换成字典对象的罢了。所以变量能储存任意对象不是因为变量本身能随意改变,而是指针可以指向任何东西。
而同样是指针能指向任何东西,Python 为何是强类型?因为 Python 的对象都携带了类型信息。如果你对整数和字符串做加法,它就会报这样的错误:
这表明 Python 会对运行时的对象进行类型检查。这个其实还不够说明问题,因为加号不能用于 int 和 str 可能只是一种语义检查。那你可以想,当调用一个对象上不存在的方法会怎样,显然是会报错的。而更能说明问题的是这个:
这表明 Python 的类型检查甚至比 C 更强,连 float 都不会给你隐式转化为 int。而这肯定不会是编译器行为,因为内置函数 chr 在声明时是不会标注参数类型的。尽管 3.7 版本允许类型声明,但 Python 不会以此为依据进行报错。
另外,真正的弱类型语言 JavaScript 对上述整数加字符串、调用不存在的方法、整数参数传浮点数都不会报错。由此,你可以相信 Python 属于强类型语言了吧。(补充:更彻底的弱类型语言比如 Lisp,甚至是在机器上实现弱类型的)
Python 是原生支持面向对象范式的语言,C 不是。我没有说“Python 是面向对象语言,C 是面向过程语言”,因为面向对象和面向过程是编程模型和思想,Python 程序也能写得很“过程”,C 也有多种方法实现“面向对象”。但 Python 是原生支持面向对象范式的,它有 class 的封装,有继承、多态方法。C 要实现面向对象的特性,需要一些技巧。有一个知乎回答,我从它的第一个链接的 PDF 得到了很大启发。回答已经找不到了,但那个 PDF 还存着,书名叫《Object-Oriented ANSI-C》。
以上三点是两个语言最大的区别。
其他还有很多,不过都不涉及编程范式的核心。包括但不限于:
- C 更偏向底层,抽象和语法糖更少,使用起来不如 Python 方便。但 C 更简单,如果有计算机体系的知识,精通起来比 Python 可能更容易。
- C 的语法不如 Python 简洁。
- C 函数声明的先后顺序影响其可被调用的区域,Python 不会。
- C 需要自己维护堆内存,Python 有垃圾回收机制。
-
C 的跨平台性不如 Python(对于使用这两个语言的程序员而言),因为 C 是大多数操作系统的实现语言,各操作系统会提供标准之外的系统调用库,而不同操作系统上系统库中的函数和定义不同。Python 基于虚拟机执行字节码,只要官方提供了某操作系统的虚拟机实现,就能将 Python 代码无缝在各操作系统转移(
os.system
等涉及特定操作系统的东西除外)。 - C 除预编译指令外可以压缩到一行,Python 要用游标卡尺。。。等等
以上关于C语言和python语言的区别转载自知乎,下面是原文链接:
作者:麦克斯韦
链接:https://www.zhihu.com/question/314756498/answer/626326654
应用领域
对C语言和python语言的区别大致有了点点了解之后,又看了下它的主要应用领域:
-
Web开发
小编我是从事Python Web开发的,所以把它放在了第一位。尽管今天PHP依然是Web开发的流行语言,但Python上升势头更劲。随着Python的Web开发框架逐渐成熟,比如耳熟能详的Django和flask, 你可以快速地开发功能强大的Web应用。小编我首推Django,强烈建议所以有志于从事Python Web开发的人掌握这门框架。无论是建大型网站,开发OA或Web API,Django都可以轻松胜任。 -
网络爬虫
多亏有了Python,一个小白用几行代码就可以写个爬虫爬段子爬福利图了。然而爬虫的真正作用是从网络上获取有用的数据或信息,可以节省大量人工时间。能够编写网络爬虫的编程语言有不少,但Python绝对是其中的主流之一。Python自带的urllib库,第三方的requests库和Scrappy框架让开发爬虫变得非常容易。 -
计算与数据分析
随着NumPy,SciPy,Matplotlib等众多程序库的开发和完善,Python越来越适合于做科学计算和数据分析了。它不仅支持各种数学运算,还可以绘制高质量的2D和3D图像。和科学计算领域最流行的商业软件Matlab相比,Python比Matlab所采用的脚本语言的应用范围更广泛,可以处理更多类型的文件和数据。 -
人工智能
当前最热工资最高的IT工作就是从事人工智能领域的工程师了。Python在人工智能大范畴领域内的机器学习、神经网络、深度学习等方面都是主流的编程语言,得到广泛的支持和应用。最流行的神经网络框架如Facebook的PyTorch和Google的TensorFlow都采用了Python语言。你不学Python, 你会用那些框架吗? -
自动化运维
这几乎是Python应用的自留地,作为运维工程师首选的编程语言。在很多操作系统里,Python是标准的系统组件。大多数Linux发行版和MacOSX都集成了Python,可以在终端下直接运行Python。Python标准库包含了多个调用操作系统功能的库。通过pywin32这个第三方软件包,Python能够访问Windows的COM服务及其它WindowsAPI。使用IronPython,Python程序能够直接调用.NetFramework。一般说来,Python编写的系统管理脚本在可读性、性能、代码重用度、扩展性几方面都优于普通的shell脚本。 -
云计算
Python的最强大之处在于模块化和灵活性,而构建云计算的平台的IasS服务的OpenStack就是采用Python的,云计算的其他服务也都是在IasS服务之上的。 -
网络编程
Python提供了丰富的模块支持sockets编程,能方便快速地开发分布式应用程序。很多大规模软件开发计划例如Zope,Mnet, BitTorrent和Google都在广泛地使用它。 -
游戏开发
很多游戏使用C++编写图形显示等高性能模块,而使用Python或者Lua编写游戏的逻辑、服务器。相较于Python,Lua的功能更简单、体积更小,然而Python则支持更多的特性和数据类型。Python的PyGame库也可用于直接开发一些简单游戏。
转自知乎,原文贴链接:https://zhuanlan.zhihu.com/p/45698546