JSer 一天快速入门 Python

快速入门什么的真是一个嗖嗖的名字......因为最近工作与 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的首字母大写TrueFalse
空值(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 = '''
<here>
    <is>python</is>
</here>
'''

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)
# => <class 'dict'>

len (dict)
# => 2

数据类型转换

类型转化上,Python 提供的全是显式的方法调用进行类型转换,标准一致而明确,不像 ES5 那样隐藏了很多自动类型转换。

隐式转化自然也有很多好处,它省掉了手动调用方法转类型的麻烦,但是它们处理得非常参差不齐,这样带来很多辨识的负担。ES6 在这方面做出了改进,但仍难掩盖历史问题。

类型判断上,Python 和 JS 各有方法,比较相似。

# Py
arr = [];
type (arr)
# => <class 'list'>

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 等编译工具也不再是问题。

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

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 216,287评论 6 498
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 92,346评论 3 392
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 162,277评论 0 353
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 58,132评论 1 292
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 67,147评论 6 388
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 51,106评论 1 295
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 40,019评论 3 417
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 38,862评论 0 274
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 45,301评论 1 310
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 37,521评论 2 332
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 39,682评论 1 348
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 35,405评论 5 343
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 40,996评论 3 325
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 31,651评论 0 22
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 32,803评论 1 268
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 47,674评论 2 368
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 44,563评论 2 352

推荐阅读更多精彩内容