Python3.8對可迭代解包的改進及用法詳解
阿新 • • 發佈:2020-01-09
Python 3 的可迭代解包
在 PEP 3132 - Extended Iterable Unpacking 裡面描述了一種對可迭代物件的解包用法,Python 3 可用:
In : a,*b,c = range(5) In : a,c Out: (0,4) In : b Out: [1,2,3] In : *a,= range(5) In : a Out: [0,1,3,4] In : for a,*b in [(1,3),(4,5,6,7)]: ...: print(b) ...: [2,3] [5,7]
挺方便的,ES6 也有對應的destructuring assignment語法實現解包陣列,不過人家實現的更徹底,還可以解包物件。
不過在 Python 3.2 時引入了一個 BUG。看一個例子:
In : def a(): ...: rest = (4,6) ...: t = 1,*rest ...: return t ...: In : for i in a(): ...: print(i) ...:
其實這是一個非常簡化的寫法,要不然需要把 1,2,3 放在一個元組中,再 + rest:
In : (1,3) + (3,4,6) Out: (1,6)
但是上面這個例子稍微改一下:
In : def b(): ...: rest = (4,6) ...: return 1,*rest File "<ipython-input-38-b5a7115853e2>",line 3 return 1,*rest ^ SyntaxError: invalid syntax
不用變數 t,直接返回就會拋 SyntaxError,另外就是 yield (當然要注意 return 和 yield 本身的意見不同啊):
In : def c(): ...: rest = (4,6) ...: yield 1,*rest File "<ipython-input-39-cf6991fcff64>",line 3 yield 1,*rest ^ SyntaxError: invalid syntax Python 3.8
在 Python 3.8,修復了這個問題:
>>> def b(): ... rest = (4,6) ... return 1,*rest ... >>> for i in b(): ... print(i) ... >>> def c(): ... rest = (4,6) ... yield 1,*rest ... >>> for i in c(): ... print(i) ... (1,6)
你學到了麼?
延伸閱讀
總結
以上所述是小編給大家介紹的Python3.8對可迭代解包的改進及用法詳解,希望對大家有所幫助,如果大家有任何疑問請給我留言,小編會及時回覆大家的。在此也非常感謝大家對我們網站的支援!
如果你覺得本文對你有幫助,歡迎轉載,煩請註明出處,謝謝!