Javascript程序员Python快速入门
现在js程序员非常多,但是Python程序员不是那么多。 本文教一个js程序员快速掌握脚本级的Python开发。 (所谓脚本级开发,就是无需掌握类的概念的开发)
1 了解2种语言
python和js是非常相近的脚本语言,很多最新的js特性就是从python借鉴的。
js是历史很悠久的脚本语言,主要用在浏览器内运行(当然目前也可在服务端运行)。
python是最简单高效的脚本(动态)语言,用途广泛。
易开发现在使用Python做服务端逻辑、以及前端界面开发。易开发未来有计划支持直接使用js进行开发。
2 空格和缩进对齐
虽然不是语法强制,任何语言大都推荐代码空格缩进,来表示代码块。比如:
if (someVar == 1) doSomething();
doSomething();这行比 if 语句进行了缩进处理,用来表示仅当if语句满足才会执行. 由此,想想下面折行代码的含义:
if (someVar == 1) doSomething(); doSomethingElse();
很清楚,doSomethingElse();使用相同的空格缩进,也应该仅当 if 语句满足, 但事实上js语言并不是这样. 程序员必须加上额外的大括号:
if (someVar == 1) { doSomething(); doSomethingElse(); }
既然空格已经可以表达清楚,为什么程序员必须额外加上大括号?
Python语言的哲学是极简,他认为这有些罗嗦,所以去掉了大括号,改为空格对齐。
如果一个语句以冒号结尾,下一个语句必须缩进开始,直至缩进结束才完结:
if someVar == 1: doSomething() doSomethingElse() else: doOtherThing()
Python和JavaScript的一个类似点是,分号是可选的, Python惯例是不用分号。
3 字符串
Python的字符串和 JavaScript 的字符串很类似, 但更NB.
字符串,或者python中任何 序列类 的数据类型, 可以象在 JavaScript 中那样用序号找到。如果序号是负数,表示从字符串末尾查找:
>>> "Hello"[-1] 'o'
序列类 的数据可以被切分,类似js中的 String.slice , 但是是内置的语言特性:
>>> "hello"[2:4] # 等同js: "hello".slice(2,4) 'll' >>> "hello"[2:] # 等同js: "hello".slice(2) 'llo' >>> "hello"[:4] # 等同js: "hello".slice(0,4) 'hell'
在Python中很容易格式化字符串. 如果你熟悉 C 语言的 sprintf() 函数, Python的字符串操作符,%是类似的作用:
>>> "Hello %s, I need %d dollars." % ("bob", 5) 'Hello bob, I need 5 dollars.'
4 表达式
Python的表达式语法,和JavaScript类似:
>>> 9 & 1 # Bitwise operations 1 >>> 2 << 2 # Shifting 8 >>> 5 >= 3 # Comparisons True >>> 8 + 2 * (3 + 5) # Arithmetic 24 >>> 1 == 1 # Equivalence True
出于可读性考虑,有些操作符有变化:
>>> not True # 'not' 而不是 '!' False >>> True and True # 'and' 而不是 '&&' True >>> True or False # 'or' 而不是 '||' True
有几种表达式不支持,因为很容易出问题:
>>> a = 5 # Assignment works in statements. >>> a += 1 # Add-assignment does too. >>> if a = 1: # But you can't assign in an expression. ... pass Traceback (most recent call last): ... SyntaxError: invalid syntax
python也不支持++和--.
5 undefined
和 JavaScript不同, Python 没有 undefined的概念. JavaScript返回undefined,会导致Python抛出异常:
>>> "a string".foo Traceback (most recent call last): ... AttributeError: 'str' object has no attribute 'foo'
大多数情况啊,这个是很好的, 因为这样让排错变得更简单。
Python也有一个类似JavaScript的 null 变量,叫做None.
6 等于
Python 和 JavaScript和判断相等的时候是有区别的; 对于==符号, Python 计算对象的值是否相等,而不是他们在内存中分配的位置:
>>> a = [1, 2, 3] >>> b = [1, 2, 3] >>> a == b True
上面的表达式是合法的 JavaScript 代码, 但返回结果是 false.
Python用来判断对象是否相同的方法是:
>>> a is b False
7 函数
函数的定义方法是这样的:
>>> def foo(x): ... print "foo called with parameter: %s" % x
调用方法是:
>>> foo(5)
foo 调用的时候传递了一个参数: 5
和 JavaScript不同, 不能调用的时候传递更少或者更多的参数:
>>> foo() Traceback (most recent call last): ... TypeError: foo() takes exactly 1 argument (0 given)
但是,可以提供默认参数的:
>>> def bar(x, y=1, z=5): ... return x + y + z
而且可以通过关键字来指定参数传递:
>>> bar(1, z=6) 8
也可以给python 函数传递任意参数, 和JavaScript的参数数组类似.
8 变量
但是, Python在设置未定义变量时,其范围规则和Javascript相反:默认不是全局的,而是局部的,而没有类似var和let的东东。
global关键字,用来指明变量绑定到全局,而不是局部范围:
>>> a = 1 # 定义我们的全局变量 >>> def foo(x): ... a = x + 1 # 'a' 是一个新的局部变量 >>> def bar(x): ... global a # 把 'a' 绑定到全局范围 ... a = x + 1 >>> foo(5) >>> a 1 >>> bar(5) >>> a 6
作为语言解释器,除非明确声明,会假定所有新赋值的变量都是局部变量。
9 序列
列表(list)非常类似 JavaScript 数组:
>>> mylist = ["hello", "there"]
遍历他们非常容易:
>>> for i in mylist: ... print i hello there
字符串(string),可以认为是单个字母的序列, 所以可以类似使用:
>>> for c in "boof": ... print c b o o f
元组(tuple)和列表(list)非常类似, 但是他们不能更改。和列表(list)的差异,是用圆括号,而不是方括号:
>>> mytuple = ("hello", "there") >>> mytuple[0] = "bye" Traceback (most recent call last): ... TypeError: 'tuple' object does not support item assignment
这样,只有一个元素的元组(tuple)看起来有点怪:
>>> mytuple = ("hello",) # 如果没有那个逗号, 这就是一个字符串,而不是元组
Python的列表(list)也不可能象Javascript数组那样有 "holes":
>>> a = [1, 2, 3] >>> del a[1] # Deletes '2' >>> a [1, 3]
和操作字符串应用,对列表(list)和元组(tuple)都可以索引(index)和切分(slice):
>>> ["hello", "there", "dude"][-1] 'dude' >>> [1, 2, 3][1:2] [2]
事实上, 如果数据类型是列表(list)那样可以修改的, 你甚至可以直接对切分进行赋值:
>>> a = [1, 2, 3, 4] >>> a[1:3] = [5] >>> a [1, 5, 4]
10 控制流程
你已经看到for,if, 和if...else. Python 也支持if...elif:
>>> if 1 == 2: ... pass ... elif 1 == 1: ... print "Hooray!" ... else: ... print "Boo." Hooray!
同样支持while:
>>> while False: ... print "This should never display."
但是, Python没有do...while循环.
如果需要循环一组数字, 你可以使用内置的 range() 方法,返回指定范围的数字列表(list):
>>> for i in range(3): ... print i 0 1 2
Python同样支持break和continue语句, 工作起来没有特别.
11 字典类型(dict)
字典类型,和JavaScript的 Object 类似:
>>> d = {"foo" : 1, "bar" : 2} >>> d["foo"] 1
不过他们的属性,并不能直接通过点号来引用:
>>> d.foo Traceback (most recent call last): ... AttributeError: 'dict' object has no attribute 'foo'
既然 Python 不支持undefined, 最简单的方法是检查字典是否有某个关键字:
>>> "a" in {"a" : 1, "b" : 2} True
字典也可以被用于字符串格式化操作的操作对象:
>>> d = {"name" : "bob", "money" : 5} >>> "Hello %(name)s, I need %(money)d dollars." % d 'Hello bob, I need 5 dollars.'
字典中的关键字(key)必须是不可修改的数据类型; 这表示,比如元组(tuple)可以作为关键字:
>>> a = {(1,2) : 1}
但是list不能:
>>> b = {[1,2] : 1} Traceback (most recent call last): ... TypeError: list objects are unhashable
Python字典通常不能象javascript那样创建任意对象; 他们没有prototypes, 也没有meta-methods. 取而代之的, class用来做这些事情(这节被我删除了).
12 异常处理
这个没有什么特别的,只是Python提供一组内置异常。
Python只是在单词选择上,使用了raise而不是 JavaScript 的throw, 以及except而不是JavaScript的catch.
讲了这点,下面的代码完全可以直解释:
>>> try: ... raise Exception("Oof") ... except Exception, e: ... print "Caught an exception: %s" % e Caught an exception: Oof
13 借鉴的东东
JavaScript的最新特性中,很多是直接从 Python 借鉴而来。
尤其是, generators, iterators, generator 表达式, 和 list comprehensions work almost identically to their JavaScript 1.7 counterparts.
14 Unicode坑
有时候,字符串是Python编程的祸害。
和 JavaScript所有字符串都是unicode不同, Python的字符串更类似一组不可修改的字节数组. 而Unicode字符串完全是另外一种数据类型, unicode 文本必须在前面加上u, 就这样:
>>> u"I am a unicode string." u'I am a unicode string.' >>> "I am a non-unicode string." 'I am a non-unicode string.'
这些不直观,是因为历史原因: Python是一个比Javascript更老的语言。他1991就出现了, 这样这个语言没有在最开始的时候支持 unicode. 支持之后, 他采用的方法和之前的代码不会破坏兼容性. 这个在Python3中已经解决了, 当然这个版本也之前也不兼容,使用并不广泛.
有字符编码的字符串可以用decode()转换为 unicode 对象:
>>> "Here is an ellipsis: \xe2\x80\xa6".decode("utf-8") u'Here is an ellipsis: \u2026' Conversely, you can convert a unicode object into a string via the encode() method: >>> u"Here is an ellipsis: \u2026".encode("utf-8") 'Here is an ellipsis: \xe2\x80\xa6'
不过,如果有字符不符合编码规范,就会抛出异常:
>>> u"hello\u2026".encode("ascii") Traceback (most recent call last): ... UnicodeEncodeError: 'ascii' codec can't encode character u'\u2026' in position 5: ordinal not in range(128)
这样,可以可选的设置一个针对异常字符的处理策略:
>>> u"hello\u2026".encode("ascii", "ignore") 'hello' >>> u"hello\u2026".encode("ascii", "xmlcharrefreplace") 'hello…'
15 更多资源
当然是 廖老师的python教程了