面向 JavaScript 程序员的 Python 教程

本文翻译自:Python for JavaScript Developers,作者:Mario Pabon

最近我加入了一家小创业公司 Underdog.io,在纽约。我发现这里的后端项目使用了 python,一个我之前没有怎么接触过的语言。

虽然在这里我的主要职责在 JavaScript 和 React 方面的工作。但是我们是个小团队,为了能实现一个功能,我必须经常深入研究多个项目。所以我必须很快熟悉 Python。

可是我没有找到适合那些已经写过代码的人看的 Python 教程。我已经懂得怎么使用另一门语言进行编程,我只需要知道 Python 的语法和编程模式就可以了。

这是我写这篇博客的原因。给那些想快速学习 Python 的 JavaScript 程序员提供简单的说明,我们不再需要再学习申明变量是什么意思,也不需要知道一个函数是做什么的。

这篇文章中的 Python 是 3.0.1 版本,其中的一些例子在旧版本的 Python 上可能会失效。

语法

申明变量

在 Python 中申明变量非常简单,像 JavaScript 一样,不需要在申明的时候指定变量类型。同时,你也不需要指定变量的作用域,就像使用 let 一样。

x = 5

你可以通过重新赋值改变变量的类型。

x = 5       # x 是 Integer 类型的
x = 'Hewwo' # x 现在变成了 String 类型

不像 JavaScript,Python 中的变量永远是块级作用域。

代码块

在语法上,Python 比 JavaScript 更严格一点。在 Python 中,缩进差一个空格会让你的代码无法运行。这是因为 Python 用缩进来表示代码块,而不是使用大括号来表示代码块。比如,在 JavaScript 中申明代码块和在 Python 中声明代码块分别是这样的:

JavaScript 中的代码块

function exampleFunction () {
  // 这是一个代码块
  var a = 5;
}

{
  // 这也是一个代码块
}

Python 中的代码块

# 这是个有独立作用域的代码块

def example_function():
  # 这也是个有独立作用域的代码块
  x = 5
  print(x)

如果 print(x) 这行多了一个或者多个空格,Python 的解释器会抛出一个缩进错误(IndentationError),因为所遇的缩进建立了一个无效的代码块。

def example_function():
  x = 5

  # 缩进错误(IndentationError)
    print(x)

如果这行少了一个或者多个空格,如下:

def example_function():
  x = 5
 print(x)

Python 解释器会抛出下面的错误:

NameError: name 'x' is not defined

因为 print(x) 不在申明 x 的那个作用域中。

逻辑控制语句

if...elsewhile,和 for 在 Python 中和在 JavaScript 中基本是一样的:

if...else

if x > 2:
  print('hai!')
elif x > 3:
  print('bye!')
else:
  print('hey now')

if not x:
  print('x is falsy!')

while 循环

while x > 0:
  print('hey now')

for 循环

for 循环像 JavaScript 中的 foreach 循环:

ex_list = [1, 2, 3]

for x in ex_list:
  print(x)

变量类型

Python 的变量类型很像 JavaScript,不像其他语言,比如 Java 和 C# 那样严格。

也就是说,变量有类型的区别,但是不需要像 Java 那样静态申明一个变量的类型。

下面简单说下 Python 自带的几种变量类型。

Numbers

和 JavaScript 不同,Python 有多种数字类型。

  • 整型(Integers):1, 2, 3
  • 浮点(Floats):4.20, 4e420
  • 复数(Complex numbers):4 + 20j
  • 布尔(Booleans):True, False

你可以在 Python 中使用 JavaScript 中的那些运算符。除此之外,Python 还有指数运算符 **:

# a = 4
a = 2 ** 2

Lists

Python 的列表像 JavaScript 的数组。列表中可以包含多种类型的数据。

[4, "2", [0, "zero"]]

从列表中取元素有下面几种特殊的操作方法:

a_list = [1, 2, 3, 4, 5]

# 1, 2, 3
a_list[0:2]

# 4, 5
a_list[3:]

# 3, 4
a_list[2, -2]

还有内置的几种好用的操作列表的方法:

# 3
len([1, 2, 3])

# 3, 2, 1
[1, 2, 3].reverse()

# 1, 2, 3
[1, 2].append(3)

你还可以用 + 运算符拼接两个列表:

# 1, 2, 3, 4
[1, 2] + [3, 4]

Strings

Python 中的字符串很像 JavaScript 中的字符串。它们都是不可变化的数据。都可以用访问数组元素的方式来访问字符串中的一个字符。

name = 'Mario'

# M
print(name[0])

# 不行,名字还是 'Mario'
name[0] = 'W'

Dictionaries

字典是有键值对关系的数据,像 JavaScript 中的对象一样。事实上,字典可以用 JSON 语法来申明:

# python 的字典
person = {
  'name': 'Mario',
  'age': 24
}

# Mario
print(person['name'])

有个很方便的方法可以取字典中的某个键对应的值,并且在这个键不存在的情况返回一个默认值:

# 因为 `gender` 不存在,所以会得到 'non-binary'
person.get('gender', 'non-binary')

None

None 就是 JavaScript 中的 null。表示没有值,并且在 if 判断中结果是 非真

x = None

if not x:
  print('x is falsy!')

Functions

像 JavaScript 一样,函数在 Python 中也是对象。所以你可以在函数参数中传递函数,也可以给函数添加一个属性:

def func(a, fn):
  print(a)
  fn()

func.x = 'meep'

# 'meep'
print(func.x)

def another_func():
  print('hey')

# 5
# 'hey'
func(5, another_func)

Modules

Python 中的模块和 ES6 的模块类似。

定义一个模块

Python 中的一个模块就是一个文件,文件中包含一些 Python 代码。

# my_module.py
hey = 'heyyy'

def say_hey():
  print(hey)

跟 JavaScript 不一样的是,你不需要指定输出什么,默认地,会输出所有变量。

导入一个模块

你可以导入一个模块的所有内容:

# 从 another_module.py 文件导入 my_module.py
# 两个文件在同一个目录下
import my_module

# 进行操作
my_module.say_hey()
print(my_module.hey)

或者导入一个模块的一些内容:

# another_module.py
from my_module import hey, say_hey

# 进行操作
say_hey()
print(hey)

你还可以用 pip 安装别人写的模块。pip 是 Python 的包管理工具。

pip install simplejson

面向对象编程

Python 支持使用对象申明类和类继承进行面向对象编程。而 JavaScript 只支持用原型链和原型链式的继承。

Classes

# 定义类
class Animal:
  # Animal 实例中都会共享的变量
  default_age = 1

  # 构造函数
  def __init__(self, name):
    # 定义一个对外可以访问的变量
    self.name = name

    # 可以在变量名前加两个下划线(__)来定义内部私有变量
    self.__age = default_age

  # 公有方法
  def get_age(self):
    return self.__age

  # 私有方法
  def __meow():
    print('meowwww')

  # 用 `staticmethod` 装饰器来申明一个静态方法
  @staticmethod
  def moo():
    print('moooo')

# 实例化一个 Animal 对象
animal = Animal()

# 访问公有属性和方法
print(animal.name)
print(animal.default_age)
print(animal.get_age())

# 访问静态方法
Animal.moo()

# 错误!!!! .__age 是私有的
print(animal.__age)

Inheritance

一个类可以继承别的类。

# 继承 Animal 类
class Human(Animal):
  def __init__(self, name, address):
    # 必须调用基础类的 __init__ 方法
    super().__init__(name)
    self.__address = address

  def get_address(self):
    return self.address

# 使用 Human 类
human = Human('Mario', '123 Jane Street, Brooklyn, NY 11211')

# Human 对象可以访问定义在 Animal 类中的方法
human.get_age()
human.get_address()

参考资料

除了本文中介绍的这些知识,Python 还有很多其他的知识点。我特别推荐你去看看 Python 官方文档 Python docs

记住,学习一门语言的最好的方式是去写,去多写。所以开始写吧。

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

推荐阅读更多精彩内容