python input输入多个变量_「Python 秘籍」1.2 解压可迭代对象赋值给多个变量
問題
需要從某個(gè)可迭代對(duì)象中分解出 N 個(gè)元素,但是這個(gè)可迭代對(duì)象的長(zhǎng)度可能超過 N,這會(huì)導(dǎo)致出現(xiàn)“需要解包的值過多(too many values to unpack)”的異常。
解決方案
“星號(hào)表達(dá)式”可以用來解決這個(gè)問題。例如,假設(shè)開設(shè)了一門課程,并決定在期末的作業(yè)成績(jī)中去掉第一個(gè)和最后一個(gè),只對(duì)中間剩下的成績(jī)做平均分統(tǒng)計(jì)。如果只有 4 個(gè)成績(jī),也許可以簡(jiǎn)單地將 4 個(gè)都分解出來,但是如果有 24 個(gè)呢?星號(hào)表達(dá)式使這一切都變得簡(jiǎn)單:
def drop_first_last(grades): first, *middle, last = gradesreturn sum(middle) / len(middle)另一個(gè)用例是假設(shè)有一些用戶記錄,記錄由姓名和電子郵件地址組成,后面跟著任意數(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)都是列表類型,不管解壓的電話號(hào)碼數(shù)量是多少(包括 0 個(gè))。所以,任何使用到 phone_numbers 變量的代碼就不需要做多余的類型檢查去確認(rèn)它是否是列表類型了。
由星號(hào)修飾的變量也可以位于列表的第一個(gè)位置。例如,用一系列的值來代表公司過去 8 個(gè)季度的銷售額。如果想對(duì)最近一個(gè)季度的銷售額同前 7 個(gè)季度的平均值做比較,可以這么做:
*trailing_qtrs, current_qtr = sales_recordtrailing_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]>>> current3討論
擴(kuò)展的迭代解壓語法是專門為解壓不確定個(gè)數(shù)或任意個(gè)數(shù)元素的可迭代對(duì)象而設(shè)計(jì)的。通常,這些可迭代對(duì)象的元素結(jié)構(gòu)有確定的規(guī)則(比如第 1 個(gè)元素后面都是電話號(hào)碼),星號(hào)表達(dá)式讓開發(fā)人員可以很容易的利用這些規(guī)則來解壓出元素來。而不是通過一些比較復(fù)雜的手段去獲取這些關(guān)聯(lián)的元素值。
值得注意的是,星號(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)解壓語法在字符串操作的時(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è)普通的廢棄名稱,比如 _ 或者 ign (ignore)。
代碼示例:
>>> record = ('ACME', 50, 123.45, (12, 18, 2012))>>> name, *_, (*_, year) = record>>> name'ACME'>>> year2012>>>在很多函數(shù)式語言中,星號(hào)解壓語法跟列表處理有許多相似之處。比如,如果你有一個(gè)列表,你可以很容易的將它分割成前后兩部分:
>>> items = [1, 10, 7, 4, 5, 9]>>> head, *tail = items>>> head1>>> tail[10, 7, 4, 5, 9]>>>如果你夠聰明的話,還能用這種分割語法去巧妙的實(shí)現(xiàn)遞歸算法。比如:
def sum(items): head, *tail = itemsreturn head + sum(tail) if tail else headprint(sum([1, 10, 7, 4, 5, 9]))然后,由于語言層面的限制,遞歸并不是 Python 擅長(zhǎng)的。因此,最后那個(gè)遞歸演示僅僅是個(gè)好奇的探索罷了,對(duì)這個(gè)不要太認(rèn)真了。
總結(jié)
以上是生活随笔為你收集整理的python input输入多个变量_「Python 秘籍」1.2 解压可迭代对象赋值给多个变量的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: c++ vector拷贝构造_JDK源码
- 下一篇: 社保卡可以在自动取款机取钱吗?