Python 與 JavaScript 語法差異點

entronad發表於2019-03-02

隨著人工智慧技術的普及,越來越多的前端程式設計師開始關注相關技術。Python 作為人工智慧領域最常用的語言,與前端程式設計師日常使用的語言 JavaScript 同屬指令碼語言,且在兩者發展過程中,社群也多有相互借鑑之處,因此有很多相似。一個熟悉 JavaScript 語言的前端程式設計師,通過掌握了他們之間的不同之處,可以快速上手 Python 。

以下是我學習過程中記錄的 Python 不同於 JavaScript 的語法點,方便隨手查閱。

型別與運算

  • 布林型別兩種關鍵字為 True False
  • 邏輯運算與、或、非關鍵字為 and or not
  • 空值為 None
  • 精確除法 / ; 取整除法 //
  • 格式化字串(類似模板字串)的佔位符 `%d %f %s %x` % (1, 1.2, `aaa`, `0x16`)
  • 各型別與布林型別的轉換:只要x是非零數值、非空字串、非空list等,就判斷為True,否則為False
  • 強型別,不同型別無法比較,需使用顯式的轉換函式

程式碼結構

  • 冒號與縮排表示程式碼塊,縮排多少不做規定
  • 條件判斷:
if a > b:
	a++
elif:
	b++
else:
	c++
複製程式碼
  • 迴圈遍歷陣列採用 for in
  • 暫時空缺的語句塊可以用關鍵字pass佔位
  • try語句塊:
try:
    print(`try...`)
    r = 10 / 0
    print(`result:`, r)
except ZeroDivisionError as e:
    print(`except:`, e)
finally:
    print(`finally...`)
print(`END`)
複製程式碼
  • 拋異常:raise FooError(`invalid value: %s` % s)

list 和 tuple

  • 列表分為list和tuple

  • 獲取list長度 len()

  • 獲取list最後一個引數 datas[-1],倒數第二個 datas[-2]

  • list操作方法:

    末尾增加 datas.append(data)

    指定位置插入:datas.insert(index, data)

    刪除末尾:datas.pop()

    刪除指定位置:datas.pop(index)

  • list中資料型別可不同,這一點與JavaScript相同

  • tuple是不可變的list

  • tuple定義:(1, 2, 3)

  • 僅一個元素的tuple:(1.2, )

dict 與 set

  • 類似Map的型別稱為為dict
  • 通過d[`key`]查詢若key不存在會報錯
  • 可用`key` in d 運算判斷是否包含
  • d.get(`key`)查詢若不存在返回None
  • dict可用d.pop(`key`)刪除元素
  • dict的key須採用字串、整數等不可變資料型別
  • set只包含不重複的key
  • 要建立一個set,需要提供一個list作為輸入集合:s = set(list),會自動過濾重複元素
  • set增加 add(key)
  • set刪除 remove(key)
  • set的交集、並集操作 s1 & s2 ; s1 | s2

集合操作

  • 切片:L[a: b: c]從a到b(左閉右開,支援倒數)每c個取一個

  • tuple和str也可切片,結果還是原型別

  • for in迭代dict預設是迭代key

  • 迭代dict的value:for value in d.values()

  • 迭代dic的key、value:for k, v in d.items()

  • 下標迴圈:for i, value in enumerate([`A`, `B`, `C`]):

  • 引用多個變數的迴圈:for x, y in [(1, 1), (2, 4), (3, 9)]:

  • 列表生成式:[x * x for x in range(1, 11) if x % 2 == 0],[m + n for m in `ABC` for n in `XYZ`]

  • 列表生成器:可動態的生成列表中的元素,節省記憶體空間

  • 列表生成器(generator)建立方式

    將列表生成式外面的[]改為()

    定義generator函式

  • 變數互換:a, b = b, a

  • Iterable包括list、tuple、dict、set、str

  • Iterator包括generator

  • Iterator是惰性求值的

  • 可使用iter()函式將Iterable轉換為Iterator

  • Iterable和Iterator都可使用for,只有Iterator可使用next()

  • map()的返回值型別是Iterator

  • reduce()的回撥函式接受兩個引數,類似斐波那契數列,返回值型別是list元素的型別

  • sorted()函式第二個命名關鍵字引數,將原來的元素對映為可排序的

函式

  • 函式引數數量和型別必須與定義一致,否則會報錯
  • 資料型別轉換函式 int() float() str() bool()
  • 函式定義
def abc(x):
	return 0
複製程式碼
  • 函式可以返回多個值,本質上是構成了一個tuple

  • 可用power(x, n=2)的形式定義預設引數

  • 如呼叫函式時不是按順序省略引數,可用如下形式:enroll(`Adam`, `M`, city=`Tianjin`)

  • 預設引數必須指向不變物件,否則多次呼叫函式且修改引數時可能存在問題

  • 引數型別:

    一般的引數叫做位置引數,通過在參數列中的位置表明關係;

    可變引數定義函式calc(*numbers)會將傳入的多個引數組成tuple,在呼叫時calc(*[1,2,3])表示將該list作為可變引數傳入;

    關鍵字引數定義函式def person(name, age, **kw):會將傳入的鍵值對作為dict傳入,呼叫如person(`Adam`, 45, gender=`M`, job=`Engineer`);

    命名關鍵字引數為分隔符*之後的引數def person(name, age, *, city, job),必須這樣呼叫person(`Jack`, 24, city=`Beijing`, job=`Engineer`),如果函式定義中已經有了一個可變引數,後面跟著的命名關鍵字引數就不再需要一個特殊分隔符了:def person(name, age, *args, city, job):,命名關鍵字引數傳入時必須帶有引數名,命名關鍵字引數也可設定預設值def person(name, age, *, city=`Beijing`, job):

  • 各型別順序必須是:必選引數、預設引數、可變引數、命名關鍵字引數和關鍵字引數

  • 匿名函式 lambda x: x * x 僅可有一個不需要寫return的表示式

  • 裝飾器@可呼叫高階函式修改函式定義

  • 偏函式functools.partial的作用就是,把一個函式的某些引數給固定住(也就是設定預設值),返回一個新的函式,呼叫這個新函式會更簡單。

物件導向

  • 類的定義:class Student(object):
  • 建構函式:def __init__(self):
  • 例項的變數名如果以__開頭,就變成了一個私有變數(private),只有內部可以訪問,外部不能訪問
  • 檢視型別:type()
  • 檢視繼承關係:isinstance()
  • 例項屬性通過建構函式中定義self.name = name,類的屬性直接寫,類屬性通過例項直接呼叫,為共享的,先看例項有沒有,沒有 就呼叫類屬性
  • 給物件繫結方法後所有例項都可使用
  • 可通過__slots__ = (`name`, `age`)限定類的例項可繫結的屬性
  • 可通過裝飾器@property、@xxx.setter定義訪問器
  • 可多重繼承class Dog(Mammal, RunnableMixIn, CarnivorousMixIn):

包與模組

  • 目錄下必須有__init__.py才是包,__init__.py即是該包的模組
  • 任何模組程式碼的第一個字串都被視為模組的文件註釋;

相關文章