2016-03-17 47 views
0

看完這些:
Special use of args/kwargs
https://www.python.org/dev/peps/pep-3102/
What does ** (double star) and * (star) do for parameters?
https://docs.python.org/3.5/library/string.html#formatstrings爲什麼我必須使用*在str.format列表的前面(* ARGS,** kwargs)

我想可以肯定我非常理解:str.format(*args, **kwargs)

如果uniques是兩個整數,如[0, 0],我會在一個循環與COND例如使用列表銀行足球比賽遞增的第一要素,沒有條件來增加第二,用:

print('Task finished. {0!s} retrieved out of {1!s} tested'.format(*uniques)) 

我必須使用*uniques因爲代替uniques將作爲一個元組格式傳遞。但如果我確實使用

print('Task finished. {0.[0]} retrieved out of {0.[1]} tested'.format(uniques)) 

它會引起錯誤值:ValueError: Empty attribute in format string。使用圍繞uniques的括號不起作用。我真的不明白爲什麼?有人可以澄清嗎?

在第一種情況下,解壓後的列表是否轉換爲元組,然而在第二種情況下,這不是因爲列表不能立即通過格式轉換爲元組,所以與format(uniques[0], uniques[1])相同?如果我是對的,爲什麼會這樣呢,因爲有一個tuple(list)函數可以做到這一點,所以它非常簡單?

+0

'...'。格式(*(uniques,))是否有效? – Schore

+0

不,它不。感謝您的幫助。當你回答時,我詳細闡述了我的文章,並在最後進行了編輯? –

+0

對不起,我沒有正確地閱讀這個問題:) – Schore

回答

4

你混合屬性訂閱語法。 0.[0]告訴格式尋找名爲[0]屬性。然而,formal grammar只允許valid identifier跟隨點(意思是由字母,數字和下劃線組成的單詞,以字母或下劃線開頭),並且[0]與該規則不匹配,所以您會收到錯誤沒有屬性名稱。

降點:

print('Task finished. {0[0]} retrieved out of {0[1]} tested'.format(uniques)) 

現在這工作,因爲現在的格式分析器正確看到訂閱:

>>> uniques = [0, 0] 
>>> print('Task finished. {0[0]} retrieved out of {0[1]} tested'.format(uniques)) 
Task finished. 0 retrieved out of 0 tested 
>>> uniques = [42, 81] 
>>> print('Task finished. {0[0]} retrieved out of {0[1]} tested'.format(uniques)) 
Task finished. 42 retrieved out of 81 tested 

0[0]符告訴str.format解析器使用第一個位置參數(在這裏由uniques提供)然後威脅那個訂閱[0]作爲序列,所以第一個元素。

當您使用'...'.format(*uniques),任何迭代會做,無論是列表或元組或者不同類型的迭代(包括髮電機); Python遍歷它來產生單獨的參數。對於[42, 81],這意味着Python將調用該方法,就好像您使用'...'.format(42, 81)一樣調用它。在字符串格式中,您必須使用{0}{1}來解決這些單獨的參數。

+0

我想這裏沒有答案,我怎麼可以這麼笨,但你真棒!無論如何,我猜想,*列表更加pythonic和形式,但我想確保理解的機制,即使我不會使用它。只是爲了心靈的興奮和平靜。 –

+1

@AndoJurai:這取決於你想做什麼;如果模板數量可變,則使用具有屬性或訂閱的命名空間可以使這些模板更靈活,使用'template.format(** mapping)'將整個命名空間映射應用於它們。 –

1

您的格式字符串一個錯字:

print('Task finished. {0[0]} retrieved out of {0[1]} tested'.format(uniques)) 
相關問題