python3?cookbook解壓可迭代對(duì)象賦值給多個(gè)變量的問(wèn)題及解決方案
第一章:數(shù)據(jù)結(jié)構(gòu)和算法
Python 提供了大量的內(nèi)置數(shù)據(jù)結(jié)構(gòu),包括列表,集合以及字典。大多數(shù)情況下使用這些數(shù)據(jù)結(jié)構(gòu)是很簡(jiǎn)單的。但是,我們也會(huì)經(jīng)常碰到到諸如查詢(xún),排序和過(guò)濾等等這些普遍存在的問(wèn)題。 因此,這一章的目的就是討論這些比較常見(jiàn)的問(wèn)題和算法。 另外,我們也會(huì)給出在集合模塊
collections
當(dāng)中操作這些數(shù)據(jù)結(jié)構(gòu)的方法。
參考:
https://python3-cookbook.readthedocs.io/zh-cn/latest/index.html
https://github.com/dabeaz/python-cookbook/tree/master
問(wèn)題
如果一個(gè)可迭代對(duì)象的元素個(gè)數(shù)超過(guò)變量個(gè)數(shù)時(shí),會(huì)拋出一個(gè) ValueError 。那么怎樣才能從這個(gè)可迭代對(duì)象中解壓出 N 個(gè)元素出來(lái)?
解決方案
Python 的星號(hào)表達(dá)式可以用來(lái)解決這個(gè)問(wèn)題。
比如,你在學(xué)習(xí)一門(mén)課程,在學(xué)期末的時(shí)候,你想統(tǒng)計(jì)下家庭作業(yè)的平均成績(jī),但是排除掉第一個(gè)和最后一個(gè)分?jǐn)?shù)。如
果只有四個(gè)分?jǐn)?shù),你可能就直接去簡(jiǎn)單的手動(dòng)賦值,但如果有 24 個(gè)呢?這時(shí)候星號(hào)表達(dá)式就派上用場(chǎng)了:
def drop_first_last(grades): first, *middle, last = grades return avg(middle)
另外一種情況,假設(shè)你現(xiàn)在有一些用戶(hù)的記錄列表,每條記錄包含一個(gè)名字、郵件,接著就是不確定數(shù)量的電話號(hào)碼。
你可以像下面這樣分解這些記錄:
record = ('Dave', 'dave@example.com', '773-555-1212', '847-555-1212') name, email, *phone_numbers = record ========================================== name='Dave' email='dave@example.com' phone_numbers=['773-555-1212', '847-555-1212']
值得注意的是上面解壓出的 phone numbers 變量永遠(yuǎn)都是列表類(lèi)型,不管解壓的電話號(hào)碼數(shù)量是多少 (包括 0 個(gè))。
所以,任何使用到 phone numbers 變量的代碼就不需要做多余的類(lèi)型檢查去確認(rèn)它是否是列表類(lèi)型了。
星號(hào)表達(dá)式也能用在列表的開(kāi)始部分。
比如,你有一個(gè)公司前 8 個(gè)月銷(xiāo)售數(shù)據(jù)的序列,但是你想看下最近一個(gè)月數(shù)據(jù)和前面 7 個(gè)月的平均值的對(duì)比。你可以這樣做:
*trailing_qtrs, current_qtr = sales_record trailing_avg = sum(trailing_qtrs) / len(trailing_qtrs) return avg_comparison(trailing_avg, current_qtr) #下面是在 Python 解釋器中執(zhí)行的結(jié)果: *trailing, current = [10, 8, 7, 1, 9, 5, 10, 3] trailing=[10, 8, 7, 1, 9, 5, 10] current=3
討論
擴(kuò)展的迭代解壓語(yǔ)法是專(zhuān)門(mén)為解壓不確定個(gè)數(shù)或任意個(gè)數(shù)元素的可迭代對(duì)象而設(shè)計(jì)的。
值得注意的是,星號(hào)表達(dá)式在迭代元素為可變長(zhǎng)元組的序列時(shí)是很有用的。
比如,下面是一個(gè)帶有標(biāo)簽的元組序列:
records = [ ('foo', 1, 2), ('bar', 'hello'), ('foo', 3, 4), ] def do_foo(x, y): print('foo', x, y) def do_bar(s): print('bar', s) for tag, *args in records: if tag == 'foo': do_foo(*args) elif tag == 'bar': do_bar(*args)
星號(hào)解壓語(yǔ)法在字符串操作的時(shí)候也會(huì)很有用,比如字符串的分割。
代碼示例:
line = 'nobody:*:-2:-2:Unprivileged User:/var/empty:/usr/bin/false' uname, *fields, homedir, sh = line.split(':') ====================================================== uname='nobody' homedir='/var/empty' sh='/usr/bin/false'
有時(shí)候,你想解壓一些元素后丟棄它們,你不能簡(jiǎn)單就使用 * ,但是你可以使用一個(gè)普通的廢棄名稱(chēng),比如 或者 ign 。
代碼示例:
record = ('ACME', 50, 123.45, (12, 18, 2012)) name, *_, (*_, year) = record ========================================== name='ACME' year=2012
在很多函數(shù)式語(yǔ)言中,星號(hào)解壓語(yǔ)法跟列表處理有許多相似之處。
比如,如果你有一個(gè)列表,你可以很容易的將它分割成前后兩部分:
items = [1, 10, 7, 4, 5, 9] head, *tail = items ========================== head=1 tail=[10, 7, 4, 5, 9]
還能用這種分割語(yǔ)法去巧妙的實(shí)現(xiàn)遞歸算法。
比如:
def sum(items): head, *tail = items return head + sum(tail) if tail else head sum(items) ================================== 36
到此這篇關(guān)于python3 cookbook-解壓可迭代對(duì)象賦值給多個(gè)變量的文章就介紹到這了,更多相關(guān)python3可迭代對(duì)象內(nèi)容請(qǐng)搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
相關(guān)文章
win7下 python3.6 安裝opencv 和 opencv-contrib-python解決 cv2.xfeat
這篇文章主要介紹了win7下 python3.6 安裝opencv 和 opencv-contrib-python解決 cv2.xfeatures2d.SIFT_create() 的問(wèn)題,需要的朋友可以參考下2019-10-10Python django框架開(kāi)發(fā)發(fā)布會(huì)簽到系統(tǒng)(web開(kāi)發(fā))
這篇文章主要介紹了Python django框架開(kāi)發(fā)發(fā)布會(huì)簽到系統(tǒng)(web開(kāi)發(fā)),本文通過(guò)實(shí)例代碼效果展示截圖的形式給大家介紹的非常詳細(xì),具有一定的參考借鑒價(jià)值,需要的朋友可以參考下2020-02-02基于PyQt5制作Excel數(shù)據(jù)分組匯總器
這篇文章主要介紹了基于PyQt5制作的一個(gè)小工具:Excel數(shù)據(jù)分組匯總器。文中的示例代碼講解詳細(xì),感興趣的小伙伴可以跟隨小編一起試一試2022-01-01Python?第三方庫(kù)?Pandas?數(shù)據(jù)分析教程
這篇文章主要介紹了Python?第三方庫(kù)?Pandas?數(shù)據(jù)分析教程的相關(guān)資料,需要的朋友可以參考下2022-09-09python使用selenium登錄QQ郵箱(附帶滑動(dòng)解鎖)
這篇文章主要為大家詳細(xì)介紹了python使用selenium登錄QQ郵箱,帶滑動(dòng)解鎖登錄功能,具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下2019-01-01一步一步教你用Python?pyglet仿制鴻蒙系統(tǒng)里的時(shí)鐘
pyglet是一個(gè)面向Python的跨平臺(tái)窗口、多媒體庫(kù),它可以用于創(chuàng)建游戲和多媒體應(yīng)用程序,下面這篇文章主要給大家介紹了關(guān)于如何一步一步教你用Python?pyglet仿制鴻蒙系統(tǒng)里的時(shí)鐘,需要的朋友可以參考下2024-03-03Python編程求解二叉樹(shù)中和為某一值的路徑代碼示例
這篇文章主要介紹了Python編程求解二叉樹(shù)中和為某一值的路徑代碼示例,具有一定借鑒價(jià)值,需要的朋友可以參考下2018-01-01Python中type的構(gòu)造函數(shù)參數(shù)含義說(shuō)明
這篇文章主要介紹了Python中type的構(gòu)造函數(shù)參數(shù)含義說(shuō)明,本文用一個(gè)編碼實(shí)例解釋Python type的參數(shù)的作用和含義,需要的朋友可以參考下2015-06-06