编程语言
通过“语言”来控制计算机,让计算机为我们做事情,这样的语言就叫做编程语言(Programming Language)
据不完全统计,全世界大概有 600 多种编程语言,其中比较流行的语言有 20 多种,比如 C语言、C++、Java、Python、PHP、C#、JavaScript 等
编程语言 | 主要用途 |
C/C++ | C++ 是在C语言的基础上发展起来的,C++ 包含了C语言的所有内容,C语言是C++的一个部分,它们往往混合在一起使用,所以统称为 C/C++。C/C++主要用于 PC软件开发、Linux 开发、游戏开发、单片机和嵌入式系统。 |
Python | Python 主要用于自动化运维、网站开发、数据分析、人工智能、云计算等技术领域,近年来势头强劲,备受开发者青睐。 |
Java | Java 可以用于网站后台开发、Android 开发、PC软件开发,近年来又涉足了大数据领域(这主要归功于 Hadoop 框架的流行)。 |
PHP | PHP 主要用来开发网站后台程序。 |
C# | C# 的实现机制和 Java 类似,目前主要用于 Windows 平台的软件开发,以及少量的网站后台开发。 |
JavaScript | JavaScript 最初只能用于网站前端开发,是前端开发的唯一语言。近年来由于 Node.js 的流行,JavaScript 在网站后台开发中也占有了一席之地,并且在迅速增长。 |
编程语言是用来控制计算机的一系列指令(Instruction),它有固定的格式和词汇(不同编程语言的格式和词汇不一样),必须遵守,否则就会出错,达不到我们的目的。习惯上,我们将这一条条指令称为代码,这些代码共同组成一个计算机程序,而用编程语言来编写程序的过程称为编码
严格意义上来说,计算机只能理解一种非常低级的编程语言,也就是机器语言
CPU(Central Processing Unit,简称 CPU) 即中央处理器,是计算机的运算和控制核心,相当于计算机的大脑,所有的机器指令都是由 CPU 负责执行的
将高级语言翻译成计算机可以执行的机器语言。目前,有两种方法可以实现,分别是编译器和解释器
使用编译器将自身转换成机器语言的高级语言,通常称为编译型语言;而使用解释器将自身转换成机器语言的高级语言,称为解释型语言,Python 就是一种解释型编程语言
编译型语言和解释型语言的区别
通过高级语言编写的源码,我们能够轻松理解,但对于计算机来说,它只认识二进制指令,源码就是天书,根本无法识别。源码要想执行,必须先转换成二进制指令
二进制指令,也就是由 0 和 1 组成的机器码,能被计算机直接识别并执行
- 有的编程语言要求必须提前将所有源代码一次性转换成二进制指令,也就是生成一个可执行程序(比如 Windows 下的 .exe 文件),比如C语言、C++、Golang、汇编语言等,它们都属于编译型语言,使用的转换工具称为编译器
- 有的编程语言可以一边执行一边转换,需要哪些源代码就转换哪些源代码,不会生成可执行程序,比如 Python、JavaScript、PHP、Shell 等,这类编程语言称为解释型语言,使用的转换工具称为解释器
简单地理解,编译器和解释器其实就是一个“翻译工具”,对源代码进行“翻译”是一个很复杂的过程,大致包括词法分析、语法分析、语义分析、性能优化、生成可执行文件等五个步骤
对于编译型语言来说,在执行之前先要经过编译器将源码转换成 CPU 可识别的机器码文件(比如 Windows 下的 .exe 文件);解释型语言无需预先编译,而是由解释器逐行对源码进行解释,一边解释一边执行
除编译型和解释型语言外,还有一种半编译半解释型语言,比如 Java 和 C# 等,这类语言将源代码先转换成一种中间文件(字节码文件),然后再将中间文件拿到虚拟机中执行
编译型语言
对于编译型语言,开发完成以后需要将所有的源代码都转换成可执行程序,比如 Windows 下的.exe
文件就是一个可执行程序,它里面包含的就是机器码,只要拥有这个可执行程序,就可以随时运行,不需要再重新编译,也就是“一次编译,无限次运行”
在运行的时候,我们只需要编译生成的可执行程序,此时就不再需要源代码和编译器,所以编译型语言可以脱离开发环境运行
编译型语言通常是不能跨平台的,也就是不能在不同的操作系统之间随意切换
编译型语言不能跨平台表现在两个方面:
1) 可执行程序不能跨平台
可执行程序不能跨平台很容易理解,因为不同操作系统对可执行文件的内部结构有着截然不同的要求,彼此之间也不能兼容。不能跨平台是天经地义,能跨平台反而才是奇葩
注意:相同操作系统的不同版本之间也不一定兼容,比如不能将 x64 程序(Windows 64 位程序)拿到 x86 平台上(Windows 32 位平台)运行。但反之一般可行,因为 64 位 Windows 对 32 位程序做了很好的兼容性处理
2) 源代码不能跨平台
不同平台支持的函数、类型、变量等都可能不同,基于某个平台编写的源代码一般不能拿到另一个平台直接运行
解释型语言
对于解释型语言,每次执行程序都需要一边转换一边执行,用到哪些源代码就将哪些源代码转换成机器码,用不到的则不进行任何处理
由于每次执行程序都需要重新转换源代码,所以解释型语言的执行效率天生就低于编译型语言,甚至是数量级的差距。因此计算机的一些底层功能,或者关键算法,一般都使用 C/C++ 实现,只有在应用层面(比如网站开发、批处理、小工具等)才会使用解释型语言
在运行解释型语言的时候,我们始终都需要源代码和解释器,所以说它无法脱离开发环境
相比于编译型语言,解释型语言几乎都能跨平台,“一次编写,到处运行”是真实存在的,而且比比皆是
这里所说的跨平台,是指源代码跨平台,而非解释器跨平台。解释器用来将源代码转换成机器码,它本质上就是一个可执行程序,是绝对不能跨平台的
以 Python 为例,Python 官方针对不同平台(比如 Windows、macOS、Linux )开发了不同的解释器,这些解释器必须要遵守同样的语法,识别同样的函数,完成同样的功能。只有这样,同一份代码才能在不同平台上拥有相同的执行结果
解释型语言之所以能够跨平台,是因为有了解释器这个中间层。在不同的平台下,解释器会将相同的源代码转换成不同的机器码,解释器帮助我们屏蔽了不同平台之间的差异性
Python 几乎支持所有常见的平台,比如 Linux、Windows、macOS、Android、FreeBSD、Solaris、PocketPC 等,我们所写的 Python 代码无需修改就能直接在这些平台上正确运行。也就是说,Python 的可移植性是很强的
类型 | 原理 | 优点 | 缺点 |
编译型语言 | 通过专门的编译器,将所有源代码一次性转换成特定平台(Windows、Linux、macOS等)的机器码(以可执行文件的形式存在)。 | 编译一次后,脱离了编译器也能运行,并且运行效率高。 | 可移植性差,不够灵活。 |
解释型语言 | 通过专门的解释器,根据需要可以将部分或全部源代码转换成特定平台(Windos、Linux、macOS等)的机器码。 | 跨平台性好,通过不同的解释器,将相同的源代码解释成不同平台下的机器码。 | 一边执行一边转换,效率较低。 |
python简介
Python 是荷兰人 Guido van Rossum (吉多·范罗苏姆,中国程序员称其为“龟叔”)在 1990 年初开发的一种解释型编程语言
Python 语言是在 ABC 语言的基础上发展而来,其设计的初衷是成为 ABC 语言的替代品。ABC 语言虽然是一款功能强大的高级语言,遗憾的是,由于 ABC 语言不开放的原因,导致它没有得到普及应用。基于这个考虑,Guido 在开发 Python 之初就决定将其开源
Python 中不仅添加了许多 ABC 语言没有的功能,同时,还为其设计了各种丰富而强大的库,利用这些 Python 库,程序员可以把使用其它语言制作的各类模块(尤其是C语言和 C++)很轻松地“黏连”在一起,因此 Python 又常被称为“胶水”语言
注意:这里所说的库和模块,简单地理解就是一个个的源文件,每个文件中都包含可实现各种功能的方法(也可称为函数)
Python 语言最大的特点就是简单,该特点主要体现在以下两个方面:
- Python 的语法非常简洁明了,即便是非软件专业的初学者,也很容易上手
- 和其它编程语言相比,实现同一个功能,Python 语言的实现代码往往是最短的
python的特点
Python 是一种开源的解释型脚本编程语言,它之所以非常流行,主要有三点原因:
- Python 简单易用,学习成本低,看起来非常优雅干净
- Python 标准库和第三库众多,功能强大,既可以开发小工具,也可以开发企业级应用
- Python 站在了人工智能和大数据的风口上
python的优点
1) 语法简单
和传统的 C/C++、Java、C# 等语言相比,Python 对代码格式的要求没有那么严格,这种宽松使得用户在编写代码时比较舒服,不用在细枝末节上花费太多精力
- Python 不要求在每个语句的最后写上分号,当然写也没错
- 定义变量时不需要指明类型,甚至可以给同一个变量赋值不同类型的数据
伪代码(Pseudo Code)是一种算法描述语言,它介于自然语言和编程语言之间。编写伪代码的目的是为了使被描述的算法可以更容易地以任何一种编程语言实现,比如 C、C++、Java 等。因此,伪代码必须结构清晰、代码简单、可读性好,并且类似于自然语言。如果你学过数据结构,阅读过严蔚敏的书籍,那你一定知道什么是伪代码
2) Python 是开源的
开源,也即开放源代码,意思是所有用户都可以看到源代码
Python 的开源体现在两方面:
① 程序员使用 Python 编写的代码是开源的
② Python 解释器和模块是开源的
3) Python 是免费的
开源并不等于免费,开源软件和免费软件是两个概念,只不过大多数的开源软件也是免费软件;Python 就是这样一种语言,它既开源又免费
4) Python 是高级语言
这里所说的高级,是指 Python 封装较深,屏蔽了很多底层细节,比如 Python 会自动管理内存(需要时自动分配,不需要时自动释放)
高级语言的优点是使用方便,不用顾虑细枝末节;缺点是容易让人浅尝辄止,知其然不知其所以然
5) Python 是解释型语言,能跨平台
解释型语言一般都是跨平台的(可移植性好),Python 也不例外
6) Python 是面向对象的编程语言
面向对象(Object Oriented)是大多数“现代”语言(即第三代编程语言)都具备的特性
Python 虽然支持面向对象,但它并不强制你使用这种特性。Java 是典型的面向对象的编程语言,它强制必须以类和对象的形式来组织代码。除 Python 和 Java 外,C++、C#、PHP、RuBy、Perl 等,也都支持面向对象的特性
除了面向对象的编程语言外,还有一种面向过程的编程语言,其中最典型的代表就是 C 语言
7) Python 功能强大(模块众多)
Python 的模块众多,基本实现了所有的常见的功能,从简单的字符串处理,到复杂的 3D 图形绘制,借助 Python 模块都可以轻松完成
Python 社区发展良好,除了 Python 官方提供的核心模块,很多第三方机构也会参与到模块的开发中,这其中就有 Google(谷歌)、Facebook(脸书)、Microsoft(微软) 等软件巨头
8) Python 可扩展性强
Python 的可扩展性体现在它的模块,Python 具有脚本语言中最丰富、强大的库或模块,这些库或模块覆盖了文件操作、图形界面编程、网络编程、数据库访问等绝大部分应用场景
值得注意的是,这些类库的底层代码不一定都是 Python,还有很多 C/C++ 的身影
Python 依靠其良好的扩展性,在一定程度上弥补了运行效率慢的缺点
python的缺点
1) 运行速度慢
运行速度慢是解释型语言的通病,Python 也不例外
Python 速度慢不仅仅是因为一边运行一边“翻译”源代码,还因为 Python 是高级语言,屏蔽了很多底层细节。这个代价也是很大的,Python 要多做很多工作,有些工作是很消耗资源的,比如管理内存
Python 的运行速度几乎是最慢的,不但远远慢于 C/C++,还慢于 Java
2) 代码加密困难
不像编译型语言那样,源代码会被编译成可执行程序(这个编译过程就相当于对源码加密),对于 Python 来说是直接运行源代码,因此对源码加密是比较困难的
python的应用领域
Python 作为一种功能强大的编程语言,因其简单易学而受到很多开发者的青睐
Python 有着非广泛的应用,几乎所有大中型互联网公司都在使用 Python,例如国外的 Google、Youtube、Dropbox,国内的百度、新浪、搜狐、腾讯、阿里、网易、淘宝、知乎、豆瓣、汽车之家、美团等等,Python 帮助它们完成了各种各样的任务
Web应用开发
在 Web 开发领域,Python 绝对是一颗冉冉升起的新星。尽管 PHP、JS 目前依然是 Web 开发的主流语言,但 Python 上升势头非常猛劲。尤其随着 Python 的 Web 开发框架逐渐成熟(比如 Django、Flask、Tornado、Web2py 等等),程序员可以更轻松地开发、管理复杂的 Web 程序
自动化运维
所谓自动化运维,实际上就是利用一些开源的自动化工具来管理服务器,比如业界流行的 Ansible(基于Python开发),它能帮助运维工程师解决重复性的工作
Python 作为一种脚本语言,提供了诸多方便与服务器交互的软件包,比如 Python 标准库中包含了多个可用来调用操作系统功能的库
人工智能领域
人工智能的核心是机器学习,机器学习的研究可分为传统机器学习和深度学习,它们两者被广泛的应用于图像识别、智能驾驶、智能推荐、自然语言处理等应用方向
在众多编程语言中 Python 绝对是人工智能的首选语言,这是因为 Python 在机器学习和深度学习方面有着非常出众的优势。可以这么说,人工智能已经无法离开 Python 的支持,总结原因大致有以下几点:
- 目前世界上优秀的人工智能学习框架,比如 Google 的 TransorFlow(神经网络框架)、FaceBook 的 PyTorch(神经网络框架)以及开源社区的 Karas 神经网络库等,都是用 Python 实现的
- 微软的 CNTK(认知工具包)也完全支持 Python,并且该公司开发的 VS Code,也已经把 Python 作为第一级语言进行支持
- Python 擅长进行科学计算和数据分析,支持各种数学运算,可以绘制出更高质量的 2D 和 3D 图像
网络爬虫
Python 语言很早就用来编写网络爬虫。Google 等搜索引擎公司大量地使用 Python 语言编写网络爬虫
从技术层面上将,Python 提供有很多服务于编写网络爬虫的工具,例如 urllib、Selenium 和 BeautifulSoup 等,还提供了一个网络爬虫框架 Scrapy
科学计算
自 1997 年,NASA 就大量使用 Python 进行各种复杂的科学运算
并且,和其它解释型语言(如 Shell、JS、PHP)相比,Python 在数据分析、可视化方面有相当完善和优秀的库,例如 NumPy、SciPy、Matplotlib、pandas 等,这可以满足 Python 程序员编写科学计算程序的需求
游戏开发
很多游戏使用 C++ 编写图形显示等高性能模块,而使用 Python 或 Lua 编写游戏的逻辑。与 Python 相比,Lua 的功能更简单,体积更小;而 Python 则支持更多的特性和数据类型
除此之外,Python 可以直接调用 Open GL 实现 3D 绘制,这是高性能游戏引擎的技术基础。事实上,有很多 Python 语言实现的游戏引擎,例如 Pygame、Pyglet 以及 Cocos 2d 等
python版本区别
Python 版本分为两大流派,一个是 Python 2.x 版本,另外一个是 Python 3.x 版本,Python 官方同时提供了对这两个版本的支持和维护
2020 年 1 月 1 日,Python 官方终止了对 Python 2.7 版本(最后一个 Python 2.x 版本) 的支持,这意味着开发者不会在接收到任何来自 Python 2.7 的错误修复或安全更新。自此 Python 2 完全退休,Python 3 时代正式来临
Python 3.x print()函数代替了print语句
在 Python 2.x 中,输出数据使用的是 print 语句
>>> print "3,4"
3,4
或者
>>> print(3,4)
(3,4)
在 Python 3.x 中,print 语句没有了,取而代之的是 print() 函数
>>> print(3,4)
3 4
如果还像 Python 2.x 中那样使用 print 语句,Python 编译器就会报错
>>> print "3,4"
File "<stdin>", line 1
print "3,4"
^
SyntaxError: Missing parentheses in call to 'print'
Python 3.x 默认使用 UTF-8 编码
Python 2.x 默认采用的 ASCII 编码,而 Python 3.x 默认使用 UTF-8 编码,相比来说,UTF-8 编码可以很好地支持中文或其它非英文字符
#Python 2.x
>>>str ="C语言中文网"
>>>str
'C\xe8\xaf\xad\xe8\xa8\x80\xe4\xb8\xad\xe6\x96\x87\xe7\xbd\x91'
#Python 3.x
>>>str ="C语言中文网"
>>>str
'C语言中文网'
在 Python 3.x 中,下面的代码也是合法的
>>>中国="China"
>>>print(中国)
China
Python 3.x 除法运算
和其他语言相比,Python 的除法运算要高端很多,它的除法运算包含 2 个运算符,分别是 / 和 //
/ 运算符
在 Python 2.x 中,使用运算符 / 进行除法运算的方式和 Java、C 语言类似,整数相除的结果仍是一个整数,浮点数除法会保留小数点部分
>>>1/2
0
>>>1.0/2
0.5
在 Python 3.x 中使用 / 运算符,整数之间做除法运算,结果也会是浮点数
>>>1/2
0.5
//运算符
使用运算符 // 进行的除法运算叫做 floor 除法(“地板除”),也就是输出不大于结果值的一个最大的整数(向下取整)。此运算符的用法在 Python 2.x 和Python 3.x 中是一样的
#Python 2.x
>>> -1//2
-1
#Python 3.x
>>> -1//2
-1
Python 3.x 异常
在 Python 3.x 版本中,异常处理改变的地方主要在以下几个方面:
- 在 Python 2.x 版本中,所有类型的对象都是直接被抛出的,但是在 Python 3.x 版本中,只有继承 BaseException 的对象才可以被抛出
- 在 Python 2.x 版本中,捕获异常的语法是“except Exception,var:”;但在 Python 3.x 版本中,引入了 as 关键字,捕获异常的语法变更为 “except Exception as var:”
- 在 Python 3.x 版本中,处理异常用 “raise Exception(args)”代替了“raise Exception,args”
- Python 3.x 版本中,取消了异常类的序列行为和 .message 属性
#Python 2.x
>>> try:
... raise TypeError,"类型错误"
... except TypeError,err:
... print err.message
...
类型错误
#Python 3.x
>>> try:
... raise TypeError("类型错误")
... except TypeError as err:
... print(err)
...
类型错误
Python 3.x 八进制字面量表示
在 Python 3.x 中,表示八进制字面量的方式只有一种,并且必须写成“0o1000”这样的方式,原来“01000”的方式不能使用了
#Python 2.x
>>> 0o1000
512
>>> 01000
512
#Python 3.x
>>> 01000
File "<stdin>", line 1
01000
^
SyntaxError: invalid token
>>> 0o1000
512
Python 3.x 不等于运算符
Python 2.x 中的不等于运算符有 2 种写法,分别为 != 和 <>,但在 Python 3.x 中去掉了 <>,只有 != 这一种写法
#Python 2.x
>>> 1!=2
True
>>> 1<>2
True
#Python 3.x
>>> 1!=2
True
>>> 1<>2
File "<stdin>", line 1
1<>2
^
SyntaxError: invalid syntax
Python 3.x 输入差异
Python 2.x 中提供两种类型输入函数,分别是 input() 和 raw_input(),前者默认返回的 int(整数类型) 类型,而后者总是返回 str(字符串类型)
Python 3.x 中只提供了一个输入函数 input(),该函数的使用方法与 raw_input() 相似,总是返回 str 类型
Python 2.x
a=input("请输出:")
请输出:123
>>> type(a)
<type 'int'>
b=input("请输入")
请输出:"C语言中文网"
>>> type(b)
<type 'str'>
c=raw_input("请输入:")
请输入:123
>>>type(c)
<type 'str'>
# Python3.x
>>> d=input("请输入:")
请输入:123
>>> d
'123'
>>> type(d)
<class 'str'>
Python 3.x 数据类型
Python 3.x 中对数据类型也做了改动
- Python 3.x 去除了 long 类型,现在只有一种整形 int,但它的行为就像是 Python 2.x 版本中的 long
- Python 3.x 新增了 bytes 类型,对应 Python 2.x 版本的八位串
>>>b=b'China'
>>>type(b)
<type 'bytes'>
字符串对象和 bytes 对象可以使用 .encode() 或者 .decode()方法相互转化
>>>s=b.decode()
>>>s
'China'
>>>b1=s.encode()
>>>b1
b'China'
- Python 3.x 中,字典的 keys()、items() 和 values() 方法用返回迭代器,且之前的 iterkeys() 等函数都被废弃,同时去掉的还有 dict.has_key(),改为用 in 替代