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慣例是不用分號。
</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的字符串操作符,%是類似的作用:
</div>>>> "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也不支持++和--.
</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…'</div>本文由用戶 jopen 自行上傳分享,僅供網友學習交流。所有權歸原作者,若您的權利被侵害,請聯系管理員。轉載本站原創文章,請注明出處,并保留原始鏈接、圖片水印。本站是一個以用戶分享為主的開源技術平臺,歡迎各類分享!