隨著人工智慧技術的普及,越來越多的前端程式設計師開始關注相關技術。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即是該包的模組
- 任何模組程式碼的第一個字串都被視為模組的文件註釋;