快速入门什么的真是一个嗖嗖的名字......因为最近工作与 Python 有关,于是决定快速入门下 Python,并试着将 Python 和 JavaScript 的一些区别进行总结。从昨天晚上开始,加上今天大半天,学习 API 文档,百度相关文章,码字总结(这个太耗时),可以算作刚好一整天。当然本文只涉及Python 初级部分,高级部分岂是一天能搞定的!
因个人水平有限,不免错误或不专业的地方,望读者指正,以便我及时更正本文。另外,本文将持续补全和丰富缺失的内容。
一、总览
语言总体都是相似的,但都有各的专攻领域。总体上讲,从涵盖的领域来看:
Python ≈ ECMAScript6 + NodeJS
这里 和 这里 分别写了它们的诞生记。虽然一个 Python (以下说的 Python 如未加版本号,均指 3.x 版本) 约等于两个庞大 JS 体系,但并不代表孰优孰劣,这里强调的是大体涵盖领域。只要知道 ECMAScript6 + NodeJS 它们俩共同完成的事,Python 可以一个人就办到。
解释器的概念
Python 和 JS 都是解释性语言,这和 JAVA 的 “不解释” 截然不同。
安装了 Python 后会自带一个 CPython 的解释器。命令行(CLI)中执行 Python 语句就会调用这个解释器来解释 Python 代码,解释完就执行。所以 Python 编程起步就得用命令行,或者另行配置 IDE (推荐 JSer 用 Sublime 作为入门工具足矣。这里是 配置教程)。
不过解释器的概念和 JS 是相似的。只不过 JS 几乎是隐藏了解释器的(它的解释器就配置在浏览器中,可以简单的理解,浏览器就是它的解释器,因为没人会追究这一司空见惯的事物)。所以 JS 编程起步,不用做这一步工作,只要一个浏览器(chrome,以下说浏览器,均指 chrome 浏览器)即可,可谓门槛会更低。
TODO: 尚缺一个表格将它们做个区别对比
交互式编程环境
Python 借助 CLI 就可以做到, 这点和 NodeJS 是非常相似的。
// 命令行输入 node, 开启 node 编程环境
E:\>node
>
// 命令行输入 node, 开启 node 编程环境
E:\>python
Python 3.6.0 (v3.6.0:41df79263a11)...
Type "help", "copyright", "credits" ...
>>>
JS 交互式编程环境就是浏览器,更简单方便,只要打开浏览器,并按快捷键 F12 就行。
书写风格差异
1、代码块的区别
Python 的代码块是通过缩进来实现的,不使用大括号 {} —— 这是 Python 和其他语言最大的区别。
Python 是 “行式” 语言,一行一行的写,像搬砖砌围墙一样一层一层的码。
# Python 风格
if True:
print "True"
else:
print "False"
一行一行的写,没了 {} 好像看起来真的简洁了许多。
2、以行为主
Python 写代码,如果本来是 2 行的语句,硬是要书写在同一行,请用;号隔开。
如果本是一行的语句,硬是要书写在 2行,请在行末加,号。
# 结果被打印在 2 行
x = 1
y = 2
print (x); print (y)
# 1
# 2
# 结果被打印在 1 行
x = 1
y = 2
print (x, y)
# 1 2
3、分号的区别
分号是可选的。Python 一行末尾总是可以忽略分号的,当然加上去也没问题。但是,如果多行语句想写在一行中,每条语句末尾加必须用 ; 号隔开,行末仍然可以不加 ; 号。
# 多行书写
if True :
name = 'a string'
print (name)
# 一行写完
if True : name = 'a string'; print (name)
4、注释的区别
Python 使用# 号单行注释,或者 ''' xxxx'''、"""xxxx""" 单、双三引号做多行注释。
name = 'jeremy' # 名称
'''
我是多行注释
我是多行注释
'''
二、语法差异
运算符
运算符的差异主要汇总于下,总体相似。但相比 Python 提供的更为丰富、易用,接近自然英语。
Python 运算符
JS 运算符
说明
**
ES6 加入
幂运算
//
Math.floor(/)
对商向下取整
and
&&
py 更接近自然语言
or
||
同上
not
!
同上
in
in
js仅用于数组、对象的成员判断 py除此还包括对字符串的测试
not in
-
js不提供该运算符 py同上
is
-
py 比较两个对象的存储单元是否相同
is not
-
同上
标准数据类型 VS 基本数据类型
Python 和 JS 都是弱类型语言,也称动态类型语言,即其类型可以通过再次赋值而改变,并不是一开始声明时就定死的。关于数据类型,Python 称为标准数据类型,对标 JS 的基本数据类型。
Python
JS
说明
数值 (Numbers)
数值 (Number)
如若改变py的数值类型的值,则需重新分配内存空间
字符串 (String)
字符串 (String)
-
列表 (List)
数组 (Array)
-
元组 (Tuple)
-
py的元组是不可变的,相当于是 readOnly
字典 (Dictionary)
对象 (Object)
相似程度最高
布尔值
布尔值
py的首字母大写True、False
空值(None)
undefined/ null
py创建了一个变量未赋值就给个 None 占位
字符串、数组、元组有一些基础简版的操作方法,如下标截取,加号拼接等。
数值
Python 所有的类型都是对象,变量一旦被声明,那么它将指向所赋的值的内存地址。 Python 数值是不可变类型,只要值改变,那么它将被分配一个新的内存地址。
数值类型被挂载了非常多常用数学函数,正如 ES6 给 Number 命名空间下添加了常用数学函数一样。
字符串
Python 3 版本中,字符串是以 Unicode 编码的。jS 字符串本身也是 Unicode 编码的。关于编码 这里 和 这里 讲的非常详细。
Python 和 JS 的字符串非常相似,它们都和各自的列表(即数组)有着相似的方法行为。它们都能用反斜杠 \ 对特殊字符进行转义。
Python 字符串不同的点主要列举 2 个。
""" 三引号:前面说到的注释,三引号用来做多行注释,但用在字符串身上时,它会原封不动的保留字符串中内部格式,这个和 JS 的反单引号是一个意思。
# python 多行注释
'''
here is example
我是多行注释
'''
# python 字符串变量
msg = '''
python
'''
in 成员判断符: JS 字符串则无此成员判断符。
isExit = 'p' in 'python'
# => True
除此之外,更多方法不同但是并不难掌握,故不在此一一列举。
列表(数组)
Python 对标准类型的操作有着非常丰富的方法。比较让人觉得有意思的,大概列举一些。
列表乘:
[1, 3, 5] * 3
# py 列表 * 运算,像细胞分裂一样复制
('hi', 'py') * 2
# => ('hi', 'py', 'hi', 'py')
// JS 数组没有这个功能,但 ES6 字符串有类似的功能
'hi JS'.repeat(2)
// => 'hi JShi JS'
列表加: [1, 2] + [3, 4]
# py 列表 + 运算
[1, 2] + [3, 4]
# => [1, 2, 3, 4]
// JS 有类似实现,但没有这么简洁
[1, 2].concat([3, 4])
[..[1, 2], ...[3, 4]]
列表项删除: del arr[1]
Python 删除列表项,列表的 length 自然变短。JS 删除数组项,数组的 length 不变。
# py
arr = [1, 2, 3, 4]
# 删除列表第 1 项
del arr[0]
print (len(arr))
# => 3
// JS
let arr = [1, 2, 3, 4];
delete arr[0];
console.log(arr.length);
// => 4
元组(readOnly 列表)
元组项不可更改、删除。因为它就是一个只读的列表。类似这样的不可变的数据类型,是很多语言的都具有的一大特征。
tup = (1, 2, 3)
del tup[0]
# TypeError: 'tuple' object doesn't support item deletion
tup[0] = 0
# TypeError: 'tuple' object does not support item assignment
JS 也可以设定数据为不可变数据。除此外,还有专门的库(immutable.js)来做这件事。
// 定义属性时设置为不可写
let obj = {};
Object.defineProperty(obj, "prop", {
value: "test",
writable: false});
// 冰冻对象
Object.freeze(obj);
字典 vs 对象
Python 字典和 JS 对象比较,高度相似,是同一类事物不同叫法而已。
dict = {'Name': 'python', 'age': 28}
type (dict)
# =>
len (dict)
# => 2
数据类型转换
类型转化上,Python 提供的全是显式的方法调用进行类型转换,标准一致而明确,不像 ES5 那样隐藏了很多自动类型转换。
隐式转化自然也有很多好处,它省掉了手动调用方法转类型的麻烦,但是它们处理得非常参差不齐,这样带来很多辨识的负担。ES6 在这方面做出了改进,但仍难掩盖历史问题。
类型判断上,Python 和 JS 各有方法,比较相似。
# Py
arr = [];
type (arr)
# =>
isinstance (arr, list)
# => True
// JS
typeof (arr)
// => object
arr instanceof Array
// => true
函数
函数书写格式上很大不同。关键字、函数名、括号及参数、函数体、return语句,这些基本结构高级语言都是一样的,只是 Python 的函数书写格式迥异——如上文总结的那样,没有{}大括号,靠缩进一行一行的。试想,如果给它在()号后边加上一个{} 不也就是和 JavaScript 写法差不多了?!
def printme( str ):
"函数专属说明"
print (str)
return
基本语句差异
基本语句就是:if 条件语句,for 循环语句,while 循环语句。
它们和 JavaScript 唯一需要关注的差异,仍然是写法,写法,写法——重要的事说三遍~
// 条件语句写法
if n >= 0:
return n
else:
return -n
// for 循环写法
for val in [10, 11, 12]:
print(val)
它们的写法差异有章可循!显然,Python 的语句没有{} 大括号(除了字典,整块代码你是看不到 {} 的,不知道为啥 Python 这么讨厌{}),而是用一个 : 号,代替了 JavaScript 的 {}。
这几乎就是基本语句的全部差异。ES6 中用 {} 圈定范围,给作用域定界;Python 则是靠一个 : 号指示,配以解释器对缩进的解释,从而界定语句范围。
——Python 没有 ES6 所谓的 {} 作用域,全靠使用者的书写格式来解析语句范围,因为它知道,写代码总是要讲求格式的,为什么不要这一事实用到极致呢!
三、高级内容
模块
Python 模块化更合理,ES6 一方面已经实现了模块化,另一方面正在致力于推进相关 API 放置在合理的命名空间下的行动。在模块化上,Python 更胜一筹。
一些主要模块
时间模块:time 模块、calendar 模块
正则模块:re 模块
json 模块
xml 模块
Python 中,它们都是通过 import 关键字引入的,而 JS 则是很早就内置在全局对象下了,这就容易造成管理混乱。
文件系统
数据库
JavaScript 也有数据库,indexDB.相当于是浏览器内部实现,并提供一套 JS API 给 JS 使用。
NodeJS 使用数据库就和 Python 的比较接近。
多线程
Python 支持多线程。JavaScript 是单线程的。
CGI 编程
NodeJS 不在话下。
网络编程
NodeJS + Socket.io 模块
GUI 编程
JavaScript 可以借助 Electron 进行 GUI 编程。
SMTP
这个 NodeJS 可以干。JavaScript 干不了。
升级策略
最后不得不说,升级策略上,Python 和 JS 也有这很大的不同。Python 3 不考虑向下兼容,目的是不想在新版本编写时有太多的累赘,但这造成的麻烦非常多。ES6 则向下兼容,考虑广大群众及项目的感受,不过很多解释器(浏览器)没有跟上支持步伐,但这个有 babel 等编译工具也不再是问题。
总之,两种策略显然各有利弊,可谓编写者希望甩开膀子干事,众人觉得应文明、体面一点。