Javascript程序员Python快速入门

jopen 9年前

现在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&#8230;'

15   更多资源

当然是 廖老师的python教程了

来自:http://cloud.easydo.cn/