Javascript程序員Python快速入門

jopen 9年前發布 | 35K 次閱讀 Python 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慣例是不用分號。

</div>

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.'
</div>

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也不支持++和--.

</div>

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.

</div>

6   等于

Python 和 JavaScript和判斷相等的時候是有區別的; 對于==符號, Python 計算對象的值是否相等,而不是他們在內存中分配的位置:

>>> a = [1, 2, 3]
>>> b = [1, 2, 3]
>>> a == b
True

上面的表達式是合法的 JavaScript 代碼, 但返回結果是 false.

Python用來判斷對象是否相同的方法是:

>>> a is b
False
</div>

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的參數數組類似.

</div>

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

作為語言解釋器,除非明確聲明,會假定所有新賦值的變量都是局部變量。

</div>

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]
</div>

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語句, 工作起來沒有特別.

</div>

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用來做這些事情(這節被我刪除了).

</div>

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
</div>

13   借鑒的東東

JavaScript的最新特性中,很多是直接從 Python 借鑒而來。

尤其是, generators, iterators, generator 表達式, 和 list comprehensions work almost identically to their JavaScript 1.7 counterparts.

</div>

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'</pre>

不過,如果有字符不符合編碼規范,就會拋出異常:

>>> 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;'
</div>

15   更多資源

當然是 廖老師的python教程了

</div> 來自:http://cloud.easydo.cn/

 本文由用戶 jopen 自行上傳分享,僅供網友學習交流。所有權歸原作者,若您的權利被侵害,請聯系管理員。
 轉載本站原創文章,請注明出處,并保留原始鏈接、圖片水印。
 本站是一個以用戶分享為主的開源技術平臺,歡迎各類分享!