日韩黑丝制服一区视频播放|日韩欧美人妻丝袜视频在线观看|九九影院一级蜜桃|亚洲中文在线导航|青草草视频在线观看|婷婷五月色伊人网站|日本一区二区在线|国产AV一二三四区毛片|正在播放久草视频|亚洲色图精品一区

分享

趣味的Python解包方法

 靜幻堂 2018-08-15
汕頭各地 2018-08-14 19:15:30

python中的解包你可以這個樣子來理解:一個list是一個整體,想把list中的每一個元素都當成一個個個體剝離出來,這樣的一個過程就是解包,讓我們先來看下面的這一些例子(總共分為12個部分)。

1.將list的每一個元素都賦值給一個變量

>>> name

'Bob'

>>> age

20

>>> date

趣味的Python解包方法

>>> 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

趣味的Python解包方法

趣味的Python解包方法

# 列表

如果可迭代對象包含的元素和前面待賦值變量數(shù)量不一致,則會報錯。但是可以通過*來表示多個元素

3.星號的使用方法

比如我們想要計算一個平均分,先去除最高分和最低分,我們除了可以用切片以外,還可以使用解包的方式獲得中間的數(shù)值

>>> new

趣味的Python解包方法

>>> 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)

趣味的Python解包方法

>>> a = ['a', 'b', 'c']

5.壓包與解包混合的例子

下面的這個例子實現(xiàn):兩個列表對應數(shù)值相加

>>> b = [1, 2, 3]

>>> for i, j in zip(a, b):

... print(i+j)

...

1

3

趣味的Python解包方法

>>> a = [0, 1, 2]

細細拆解上面過程,可以看出步驟是這樣的

  • 先是zip函數(shù)將a b壓包成為一個可迭代對象對可迭代對象的每一個元素(('a', 1))進行解包(i, j = ('a', 1))此時就可以分別調用i j變量進行計算

下面我們加入星號

... ('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]

趣味的Python解包方法

>>> l = [('Bob', '1990-1-1', 60),

6._的使用方法

當有一些元素你不想用時,使用_表示是更好的寫法了,這樣就可以讓讀代碼的人知道這個元素是不person = ('Bob', 20, 50, (11, 20, 2000))要的

>>> name, *_, (*_, year) = person

>>> name

'Bob'

>>> year

趣味的Python解包方法

>>> person = ('Bob', 2, 50, (11, 20, 2000))

7.多變量同時賦值

之前的賦值符號右側都是可迭代對象,其實>>> a, b = 側也可以多個變量

>>> a

1

>>> b

2

>>> a = 1, 2

>>> a

趣味的Python解包方法

>>> a, b = 1, 2

下面的使用方法都會報錯

趣味的Python解包方法

*a = 1, 2

可以這樣

趣味的Python解包方法

8.*之可變參數(shù)

在定義函數(shù)時,我們使用*的可變參數(shù),其實也是壓包解包過程

... print(num)

...

>>> myfun(1,2,5,6)

趣味的Python解包方法

>>> 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ù)定義中使用,不能這樣使用

趣味的Python解包方法

>>> 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

趣味的Python解包方法

>>> 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)

趣味的Python解包方法

趣味的Python解包方法

>>> def myfun(a, *b, c=None):

如果一個函數(shù)想要使用的時候必須明確指定參數(shù)名,可以將所有參數(shù)都放在可變參數(shù)之后,而可變參數(shù)不用管它就可以,也不用命名,如下

... print(a)

... print(b)

...

>>> myfun(a = 1,b = 2)

1

趣味的Python解包方法

>>> 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

趣味的Python解包方法

>>> 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

趣味的Python解包方法

趣味的Python解包方法

>>> 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ù)

趣味的Python解包方法

def myfun(a, b):

列表元組的解包

>>> myfun(*n)

3

>>> m = (1, 2)

>>> myfun(*m)

趣味的Python解包方法

>>> n = [1, 2]

字典的解包

>>> myfun(**mydict)

3

>>> myfun(*mydict)

趣味的Python解包方法

>>> mydict = {'a':1, 'b': 2}

一個應用

>>> "{name}'s age is {age}".format(**bob)

趣味的Python解包方法

>>> bob = {'name': 'Bob', 'age': 30}

12.多返回值函數(shù)

下面過程也涉及到了解包

return a + 1, b + 2

>>> m, n = myfun(1, 2)

>>> m

2

>>> n

趣味的Python解包方法

def myfun(a, b):

其實本身是一個元組

趣味的Python解包方法

Python學習交流群:834+179+111,群里有很多的學習資料。歡迎歡迎各位前來交流學習。

    本站是提供個人知識管理的網(wǎng)絡存儲空間,所有內容均由用戶發(fā)布,不代表本站觀點。請注意甄別內容中的聯(lián)系方式、誘導購買等信息,謹防詐騙。如發(fā)現(xiàn)有害或侵權內容,請點擊一鍵舉報。
    轉藏 分享 獻花(0

    0條評論

    發(fā)表

    請遵守用戶 評論公約

    類似文章 更多