Python 語法糖
\,換行連線
1 2 3 4 5 6 7 |
s = '' s += 'a' + 'b' + 'c' n = 1 + 2 + 3 # 6 |
while,for 迴圈外的 else
如果 while 迴圈正常結束(沒有break退出)就會執行else。
1 2 3 4 5 6 7 8 9 |
num = [1,2,3,4] mark = 0 while mark < len(num): n = num[mark] if n % 2 == 0: print(n) # break mark += 1 else: print("done") |
zip() 並行迭代
1 2 3 4 |
a = [1,2,3] b = ['one','two','three'] list(zip(a,b)) # [(1, 'one'), (2, 'two'), (3, 'three')] |
列表推導式
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 |
x = [num for num in range(6)] # [0, 1, 2, 3, 4, 5] y = [num for num in range(6) if num % 2 == 0] # [0, 2, 4] # 多層巢狀 rows = range(1,4) cols = range(1,3) for i in rows: for j in cols: print(i,j) # 同 rows = range(1,4) cols = range(1,3) x = [(i,j) for i in rows for j in cols] |
字典推導式
{ key_exp : value_exp fro expression in iterable }
1 2 3 |
#查詢每個字母出現的次數。 strs = 'Hello World' s = { k : strs.count(k) for k in set(strs) } |
集合推導式
{expression for expression in iterable }
元組沒有推導式
本以為元組推導式是列表推導式改成括號,後來發現那個 生成器推導式。
生成器推導式
1 2 3 |
>>> num = ( x for x in range(5) ) >>> num ...:<generator object <genexpr> at 0x7f50926758e0> |
函式
函式關鍵字引數,預設引數值
1 2 3 4 |
def do(a=0,b,c) return (a,b,c) do(a=1,b=3,c=2) |
函式預設引數值在函式定義時已經計算出來,而不是在程式執行時。
列表字典等可變資料型別不可以作為預設引數值。
1 2 3 |
def buygy(arg, result=[]): result.append(arg) print(result) |
changed:
1 2 3 4 5 6 7 8 9 10 |
def nobuygy(arg, result=None): if result == None: result = [] result.append(arg) print(result) # or def nobuygy2(arg): result = [] result.append(arg) print(result) |
*args 收集位置引數
1 2 3 4 |
def do(*args): print(args) do(1,2,3) (1,2,3,'d') |
**kwargs 收集關鍵字引數
1 2 3 4 |
def do(**kwargs): print(kwargs) do(a=1,b=2,c='la') # {'c': 'la', 'a': 1, 'b': 2} |
lamba 匿名函式
1 2 3 |
a = lambda x: x*x a(4) # 16 |
生成器
生成器是用來建立Python序列的一個物件。可以用它迭代序列而不需要在記憶體中建立和儲存整個序列。
通常,生成器是為迭代器產生資料的。
生成器函式函式和普通函式類似,返回值使用 yield 而不是 return 。
1 2 3 4 5 6 7 8 |
def my_range(first=0,last=10,step=1): number = first while number < last: yield number number += step >>> my_range() ... <generator object my_range at 0x7f02ea0a2bf8> |
裝飾器
有時需要在不改變原始碼的情況下修改已經存在的函式。
裝飾器實質上是一個函式,它把函式作為引數輸入到另一個函式。
舉個例子:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 |
# 一個裝飾器 def document_it(func): def new_function(*args, **kwargs): print("Runing function: ", func.__name__) print("Positional arguments: ", args) print("Keyword arguments: ", kwargs) result = func(*args, **kwargs) print("Result: " ,result) return result return new_function # 人工賦值 def add_ints(a, b): return a + b cooler_add_ints = document_it(add_ints) #人工對裝飾器賦值 cooler_add_ints(3,5) # 函式器前加裝飾器名字 @document_it def add_ints(a, b): return a + b |
可以使用多個裝飾器,多個裝飾由內向外向外順序執行。
名稱空間和作用域
1 2 3 4 5 6 7 8 |
a = 1234 def test(): print("a = ",a) # True #### a = 1234 def test(): a = a -1 #False print("a = ",a) |
可以使用全域性變數 global a
。
1 2 3 4 5 |
a = 1234 def test(): global a a = a -1 #True print("a = ",a) |
Python 提供了兩個獲取名稱空間內容的函式
local()
global()
_ 和 __
Python 保留用法。
舉個例子:
1 2 3 4 5 6 |
def amazing(): '''This is the amazing. Hello world''' print("The function named: ", amazing.__name__) print("The function docstring is: n", amazing.__doc__) |
異常處理,try…except
只有錯誤發生時才執行的程式碼。
舉個例子:
1 2 3 4 5 6 |
>>> l = [1,2,3] >>> index = 5 >>> l[index] Traceback (most recent call last): File "", line 1, in IndexError: list index out of range |
再試下:
1 2 3 4 5 6 7 8 |
>>> l = [1,2,3] >>> index = 5 >>> try: ... l[index] ... except: ... print("Error: need a position between 0 and", len(l)-1, ", But got", index) ... Error: need a position between 0 and 2 , But got 5 |
沒有自定異常型別使用任何錯誤。
獲取異常物件,except exceptiontype as name
1 2 3 4 5 6 7 8 9 10 11 12 |
short_list = [1,2,3] while 1: value = input("Position [q to quit]? ") if value == 'q': break try: position = int(value) print(short_list[position]) except IndexError as err: print("Bad index: ", position) except Exception as other: print("Something else broke: ", other) |
自定義異常
異常是一個類。類 Exception
的子類。
1 2 3 4 5 6 7 8 9 10 11 |
class UppercaseException(Exception): pass words = ['a','b','c','AA'] for i in words: if i.isupper(): raise UppercaseException(i) # error Traceback (most recent call last): File "", line 3, in __main__.UppercaseException: AA |
命令列引數
命令列引數
python檔案:
1 2 |
import sys print(sys.argv) |
PPrint()友好輸出
與print()用法相同,輸出結果像是列表字典時會不同。
類
子類super()呼叫父類方法
舉個例子:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 |
class Person(): def __init__(self, name): self.name = name class email(Person): def __init__(self, name, email): super().__init__(name) self.email = email a = email('me', 'me@me.me') >>> a.name ... 'me' >>> a.email ... 'me@me.me' |
self.__name 保護私有特性
1 2 3 4 5 6 7 8 9 |
class Person(): def __init__(self, name): self.__name = name a = Person('me') >>> a.name ... AttributeError: 'Person' object has no attribute '__name' # 小技巧 a._Person__name |
例項方法( instance method )
例項方法,以self作為第一個引數,當它被呼叫時,Python會把呼叫該方法的的物件作為self引數傳入。
1 2 3 4 |
class A(): count = 2 def __init__(self): # 這就是一個例項方法 A.count += 1 |
類方法 @classmethod
1 2 3 4 5 6 7 |
class A(): count = 2 def __init__(self): A.count += 1 @classmethod def hello(h): print("hello",h.count) |
注意,使用h.count
(類特徵),而不是self.count
(物件特徵)。
靜態方法 @staticmethod
1 2 3 4 5 |
class A(): @staticmethod def hello(): print("hello, staticmethod") >>> A.hello() |
建立即用,優雅不失風格。
特殊方法(sqecial method)
一個普通方法:
1 2 3 4 5 6 7 8 9 10 |
class word(): def __init__(self, text): self.text = text def equals(self, word2): #注意 return self.text.lower() == word2.text.lower() a1 = word('aa') a2 = word('AA') a3 = word('33') a1.equals(a2) # True |
使用特殊方法:
1 2 3 4 5 6 7 8 9 10 |
class word(): def __init__(self, text): self.text = text def __eq__(self, word2): #注意,使用__eq__ return self.text.lower() == word2.text.lower() a1 = word('aa') a2 = word('AA') a3 = word('33') a1 == a2 # True |
其他還有:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 |
*方法名* *使用* __eq__(self, other) self == other __ne__(self, other) self != other __lt__(self, other) self other __le__(self, other) self = other __add__(self, other) self + other __sub__(self, other) self - other __mul__(self, other) self * other __floordiv__(self, other) self // other __truediv__(self, other) self / other __mod__(self, other) self % other __pow__(self, other) self ** other __str__(self) str(self) __repr__(self) repr(self) __len__(self) len(self) |
文字字串
1 2 3 |
'%-10d | %-10f | %10s | %10x' % ( 1, 1.2, 'ccc', 0xf ) # '1 | 1.200000 | ccc | 33' |
{} 和 .format
1 2 3 4 5 6 7 |
'{} {} {}'.format(11,22,33) # 11 22 33 '{2:2d} {0:-10d} {1:10d}'.format(11,22,33) # :後面是格式識別符號 # 33 11 22 '{a} {b} {c}'.format(a=11,b=22,c=33) |