我是新手,我讀的代碼片段是這樣的:不能讀取這個python格式(,)[。 。 ]
...
proto = ('http', 'https')[bool(self.https)]
...
它看起來像這條線讓proto
到'http'
和'https'
之間切換。
但是(,)[ .. ]
是什麼意思?我怎樣才能使用這種風格?
我是新手,我讀的代碼片段是這樣的:不能讀取這個python格式(,)[。 。 ]
...
proto = ('http', 'https')[bool(self.https)]
...
它看起來像這條線讓proto
到'http'
和'https'
之間切換。
但是(,)[ .. ]
是什麼意思?我怎樣才能使用這種風格?
第二個元素(在括號中)是將在第一個元素上使用的索引。所以在這種情況下,你有一個元組:
('http', 'https')
然後表示self.https
是否設置一個布爾值。如果這是真的,價值會1
,使電話:
('http', 'https')[1]
這將選擇元組中的https
值。這需要的事實bool
是int
一個子類,它有可能被認爲是濫用:)
In [1]: t = ('http', 'https')
In [2]: t[0]
Out[2]: 'http'
In [3]: t[1]
Out[3]: 'https'
In [4]: https_setting = True
In [5]: int(https_setting)
Out[5]: 1
In [6]: t[bool(https_setting)]
Out[6]: 'https'
In [7]: True.__class__.__bases__
Out[7]: (int,)
對於這種技術的酷使用的優勢,在this視頻退房2:14(這也恰好成爲一部非常棒的視頻!)。它索引一個字符串('^ '
)而不是一個元組,但概念是相同的。
所以它看起來像一個enum.thanks你的解釋,我也測試這個工作是否爲好奇名單也工作,它的工作原理! –
@ user2166063沒問題,很高興幫助。既然你提到你只是在學習,你可以看看[this](http://effbot.org/zone/python-list.htm),它着重於列表,但是包含索引(使用'[]'在這種情況下,將該項目放在索引位置)。祝你好運! – RocketDonkey
生病了看看吧!再次感謝。 –
這是一個「切換器」。這是隻有很短的形式:
proto = 'https' if self.https else 'http'
或
if self.https:
proto = 'https'
else:
proto = 'http'
此外,發現可以通過True
和False
(同樣由1
和0
)採取從一個元組中的項目:
>>> print ('http', 'https')[True]
https
>>> print ('http', 'https')[False]
http
>>> print ('http', 'https')[1]
https
>>> print ('http', 'https')[0]
http
不短得多,內聯if/else比強制索引提供更多的可讀性...... –
@JoranBeasley是的,內聯風格更加pythonic我認爲。 – alecxe
事實上,沒有舊的和多餘的那麼短。 –
這是一種密集的風格(不太流行),使用布爾值只能爲0(False)或1(True)的事實,它們恰好是零索引二元素列表的索引或元組。
也許這是一個有點混亂,該指數是作爲一個bool
,但:
>>> int(bool(False))
0
>>> int(bool(True))
1
而且
...布爾是普通整數的子類型。
來源:http://docs.python.org/2/library/stdtypes.html#numeric-types-int-float-long-complex
('http','https')
是一個元組。作爲所有的元組,它的元素可以通過索引來解決(在這種情況下爲0和1)。
bool(self.https)
將self.https
轉換爲布爾值。但是,在Python中,布爾值被表示爲整數0(對於假)和1(對於真)。所以,
('http','https')[bool(self.https)]
相當於:
('http','https')[0] # ('http') when self.https is false, or
('http','https')[1] # ('https') when self.https is true
或
'https' if self.https else 'http'
大致可以理解爲
if self.https :
'https'
else:
'http'
形式'https' if self.https else 'http'
用Python 2.5的引入。以前,在Python程序員中,你展示的幾種形式非常普遍。
請注意,在風格上,我寧願看到''https'如果self.https else'http'' - 這可能是Python之前的舊代碼有三元運算符。 –