快速入门什么的真是一个嗖嗖的名字......因为最近工作与 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 等编译工具也不再是问题。

总之,两种策略显然各有利弊,可谓编写者希望甩开膀子干事,众人觉得应文明、体面一点。