Python 與 JavaScript 語法差異點
以下是我學習過程中記錄的 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即是該包的模組
任何模組程式碼的第一個字串都被視為模組的文件註釋;