1. 程式人生 > >Python封裝及解構

Python封裝及解構

解構

python封裝及解構

Python的封裝與其他語言的封裝箱不同,python中沒有裝箱的概念,一切皆對象

將多個值使用逗號進行分割,本質上是返回元組

In [1]: a = 1,2

In [2]: type(a)

Out[2]: tuple

In [3]: a

Out[3]: (1, 2)

封裝

在進行交換的時候,已經被封裝為元組

在賦值的過程中,看似什麽都沒有做,但是在右值將其封裝為元組,因為其值不變

In [9]: a = 1,2

In [10]: a??

Type: tuple

String form: (1,2)

Length: 2

Docstring:

tuple() ->empty tuple

tuple(iterable)-> tuple initialized from iterable‘s items

If the argumentis a tuple, the return value is the same object.

為什麽使用元組進行解構?

元組在實現中比list輕巧的多,在內存占用上考慮更小的空間,所以使用元組

元組的定義

a = 1,2

a = (1,2)

封裝的過程

In [23]: a = 1

In [24]: b = 2

In [25]: a,b

Out[25]: (1, 2) #

In [26]: a,b =b,a

先將值封裝為元組,然後將新的元組將新值進行重新賦值

In [30]: c = a,b

In [31]: c

Out[31]: (1, 2)

解構:

線性結構元組解開,並按照順序方式賦值給其他變量

左右順序:左邊接納的變量和右邊解構的元素個數必須一致

In [44]: lst =[3,5]

In [45]: lst

Out[45]: [3, 5]

In [46]: f,s =lst

In [47]:print(f,s)

3 5

解構的過程

在解構之前需要先進行封裝,然後對右值進行封裝,再對左值進行解構

解構的時候則使用list進行,因為在解構的時候,其不知空間占用多少,所以在設計結構的時候優先使用列表

正與封裝的時候相反,在封裝的時候因為已知數據占用情況,所以在內存占用上考慮更小的空間

例:

*號位當前去掉占位變量其余所有數據全部進行賦值,類似貪婪模式

In [49]: a,*b =1,2,3,4,5

In [50]: a

Out[50]: 1

In [51]: b

Out[51]: [2, 3,4, 5]

例2

n [53]: [a,b] =(1,2)

In [54]: a

Out[54]: 1

In [55]: b

Out[55]: 2

In [56]: a,b

Out[56]: (1, 2)

python3的解構

使用*+變量名,但是*不能單獨使用

In [71]: a =list(range(10))

In [72]: *b = a

File"<ipython-input-72-a92a123ff659>", line 1

*b= a

^

SyntaxError: starred assignment target must be in alist or tuple

*必須跟多變量進行賦值

In [73]: n,*b =a

In [74]: n

Out[74]: 0

In [75]: b

Out[75]: [1, 2,3, 4, 5, 6, 7, 8, 9]

In [76]: n,b

Out[76]: (0, [1,2, 3, 4, 5, 6, 7, 8, 9])

本身*不能獨立去接收,原因在於*不能單獨出現

*號本身定義就是為了盡可能的多收集,但是並不能全部收集

In [77]: *b,o =a

In [78]: b,o

Out[78]: ([0, 1,2, 3, 4, 5, 6, 7, 8], 9)

*在解構的時候做盡可能重復去接收更多的元素,例:

In [88]:head,*_,tail = lst

In [89]: head

Out[89]: 0

In [90]: _

Out[90]: [1, 2,3, 4, 5, 6, 7, 8]

In [91]: tail

Out[91]: 9

_丟棄變量

_號 ,下劃線是合法的標識符,但是一般使用_只引用來測,因為根本看不明白其要做什麽事

In [92]: lst

Out[92]: [0, 1,2, 3, 4, 5, 6, 7, 8, 9]

In [93]:head,*_,tial = lst

In [94]:head,tail

Out[94]: (0, 9)

在開發習慣中,一般_表示丟棄,以上例子,我們只想取頭部和尾部,_為丟棄

例:以下_為賦值兩次,最後一次*_將前面的_值覆蓋

In [95]:_,*_,tail = lst

In [96]: tail

Out[96]: 9

In [97]: _

Out[97]: [1, 2,3, 4, 5, 6, 7, 8]

In [98]: lst

Out[98]: [0, 1,2, 3, 4, 5, 6, 7, 8, 9]

_變量本身沒有任何語義,並沒有可讀性

例:取出第二個,第四個,和倒數第二個

In [108]: lst

Out[108]: [0, 1,2, 3, 4, 5, 6, 7, 8, 9]

In [108]:_,two,_,four,*_,nine,_ = lst

從lst = [1,(2,3,4),5] 將4提取出來

In [120]: lst

Out[120]: [1,(2, 3, 4), 5]

In [121]: _,[*_,a],_= lst

In [122]: a

Out[122]: 4

In [136]:_,(*_,a),_ = lst

In [137]: a

Out[137]: 4

取出路徑

In [144]:name,_,path = a.partition(‘=‘)

In [145]: path

Out[145]:‘/usr/bin‘


本文出自 “心情依舊” 博客,請務必保留此出處http://yijiu.blog.51cto.com/433846/1968668

Python封裝及解構