汕頭各地 2018-08-14 19:15:30 python中的解包你可以這個樣子來理解:一個list是一個整體,想把list中的每一個元素都當成一個個個體剝離出來,這樣的一個過程就是解包,讓我們先來看下面的這一些例子(總共分為12個部分)。 1.將list的每一個元素都賦值給一個變量 >>> name 'Bob' >>> age 20 >>> date >>> name, age, date = ['Bob', 20, '2018-1-1'] 2.可迭代的對象都可以這個樣子來做 >>> a,b,c = ['a', 'b', 'c'] >>> a 'a' >>> a,b,c = enumerate(['a', 'b', 'c']) >>> a (0, 'a') # 元組 >>> a,b,c = ('a', 'b', 'c') >>> a 'a' # 字典 >>> a,b,c = {'a':1, 'b':2, 'c':3} >>> a 'a' >>> a,b,c = {'a':1, 'b':2, 'c':3}.items() >>> a ('a', 1) # 字符串 >>> a,b,c = 'abc' >>> a 'a' # 生成器 >>> a,b,c = (x + 1 for x in range(3)) >>> a # 列表 如果可迭代對象包含的元素和前面待賦值變量數(shù)量不一致,則會報錯。但是可以通過*來表示多個元素 3.星號的使用方法 比如我們想要計算一個平均分,先去除最高分和最低分,我們除了可以用切片以外,還可以使用解包的方式獲得中間的數(shù)值 >>> new >>> first, *new, last = [94, 85, 73, 46] 用*來表示多個數(shù)值 4.壓包過程 壓包就是解包的逆過程,使用zip函數(shù)來實現(xiàn),下面的例子可以讓你對壓包有比較一個直觀的感受 >>> b = [1, 2, 3] >>> for i in zip(a, b): ... print(i) ... ('a', 1) ('b', 2) >>> a = ['a', 'b', 'c'] 5.壓包與解包混合的例子 下面的這個例子實現(xiàn):兩個列表對應數(shù)值相加 >>> b = [1, 2, 3] >>> for i, j in zip(a, b): ... print(i+j) ... 1 3 >>> a = [0, 1, 2] 細細拆解上面過程,可以看出步驟是這樣的
下面我們加入星號 ... ('Mary', '1996-1-4', 50), ... ('Nancy', '1993-3-1', 55),] >>> for name, *args in l: ... print(name, args) ... Bob ['1990-1-1', 60] Mary ['1996-1-4', 50] >>> l = [('Bob', '1990-1-1', 60), 6._的使用方法 當有一些元素你不想用時,使用_表示是更好的寫法了,這樣就可以讓讀代碼的人知道這個元素是不person = ('Bob', 20, 50, (11, 20, 2000))要的 >>> name, *_, (*_, year) = person >>> name 'Bob' >>> year >>> person = ('Bob', 2, 50, (11, 20, 2000)) 7.多變量同時賦值 之前的賦值符號右側都是可迭代對象,其實>>> a, b = 側也可以多個變量 >>> a 1 >>> b 2 >>> a = 1, 2 >>> a >>> a, b = 1, 2 下面的使用方法都會報錯 *a = 1, 2 可以這樣 ![]() 8.*之可變參數(shù) 在定義函數(shù)時,我們使用*的可變參數(shù),其實也是壓包解包過程 ... print(num) ... >>> myfun(1,2,5,6) ![]() >>> def myfun(*num): 參數(shù)用*num表示,num變量就可以當成元組調用了。 其實這個過程相當于*num, = 1,2,5,6 9.*之關鍵字參數(shù) ... print(kw) ... >>> myfun(name = "Bob", age = 20, weight = 50) {'weight': 50, 'name': 'Bob', 'age': 20} 鍵值對傳入**kw,kw就可以表示相應字典。 **的用法只在函數(shù)定義中使用,不能這樣使用 ![]() >>> def myfun(**kw): 10.可變參數(shù)與關鍵字參數(shù)的細節(jié)問題 1.函數(shù)傳入實參時,可變參數(shù)(*)之前的參數(shù)不能指定參數(shù)名 ... print(a) ... print(b) ... >>> myfun(a=1, 2,3,4) File "<stdin>", line 1 SyntaxError: positional argument follows keyword argument >>> myfun(1, 2,3,4) 1 ![]() >>> def myfun(a, *b): 2.當函數(shù)傳入實參時,可變參數(shù)(*)之后的參數(shù)必須指定參數(shù)名,否則就會被歸入到可變參數(shù)之中 ... print(a) ... print(b) ... print(c) ... >>> myfun(1, 2,3,4) 1 (2, 3, 4) None >>> myfun(1, 2,3,c=4) 1 (2, 3) ![]() ![]() >>> def myfun(a, *b, c=None): 如果一個函數(shù)想要使用的時候必須明確指定參數(shù)名,可以將所有參數(shù)都放在可變參數(shù)之后,而可變參數(shù)不用管它就可以,也不用命名,如下 ... print(a) ... print(b) ... >>> myfun(a = 1,b = 2) 1 ![]() >>> def myfun(*, a, b): 可變參數(shù)的這兩條特性,可以用于將 只需要按照位置賦值的參數(shù) 和 需要明確指定參數(shù)名的參數(shù)區(qū)分開來 3.關鍵字參數(shù)都只能作為最后一個參數(shù),前面的參數(shù)按照位置賦值還是名稱賦值都可以 下面展示一個既用可變參數(shù)有用關鍵字參數(shù)的例子 ... print(a) ... print(b) ... print(c) ... print(d) ... >>> myfun(1, 2, 3, c= 4, m = 5, n = 6) 1 (2, 3) 4 ![]() >>> def myfun(a, *b, c, **d): 4.可變參數(shù)與關鍵詞參數(shù)共同使用以表示任意參數(shù)4下面是這一點在裝飾器當中的使用 ... def wrapper(*args, **kw): ... print('I am using a decorator.') ... return func(*args, **kw) ... return wrapper ... >>> @mydecorator ... def myfun(a, b): ... print(a) ... print(b) ... >>> myfun(1, b = 2) I am using a decorator. 1 ![]() ![]() >>> def mydecorator(func): (如果有的讀者不熟悉裝飾器,只需要知道,使用@定義myfun相當于myfun = mydecorator(myfun),定義出來的myfun其實是返回結果wrapper函數(shù)) wrapper函數(shù)使用*args, **kw作為參數(shù),則被修飾的myfun函數(shù)需要的參數(shù)無論是什么樣的,傳入wrapper都不會報錯,這保證了裝飾器可以修飾各種各樣函數(shù)的靈活性。畢竟我們一般在函數(shù)中傳入?yún)?shù)時,要么所有參數(shù)名都寫,要么前面幾個不寫,后面的會寫,這樣使用*args, **kw完全沒有問題。 11.解包作為參數(shù)傳入函數(shù)中 首先定義一個函數(shù) ![]() def myfun(a, b): 列表元組的解包 >>> myfun(*n) 3 >>> m = (1, 2) >>> myfun(*m) ![]() >>> n = [1, 2] 字典的解包 >>> myfun(**mydict) 3 >>> myfun(*mydict) ![]() >>> mydict = {'a':1, 'b': 2} 一個應用 >>> "{name}'s age is {age}".format(**bob) ![]() >>> bob = {'name': 'Bob', 'age': 30} 12.多返回值函數(shù) 下面過程也涉及到了解包 return a + 1, b + 2 >>> m, n = myfun(1, 2) >>> m 2 >>> n ![]() def myfun(a, b): 其實本身是一個元組 ![]() Python學習交流群:834+179+111,群里有很多的學習資料。歡迎歡迎各位前來交流學習。 |
|