對於str.split(line)我調用了一個str類的方法,並將一個線對象,恰好是一個充滿字符串的列表傳遞給字符串對象?爲什麼在line.split()上寫str.split(line)會有意義?
我似乎更清楚我應該在我的線對象上調用split()方法。
我無法理解兩種方式的工作原理。
對於str.split(line)我調用了一個str類的方法,並將一個線對象,恰好是一個充滿字符串的列表傳遞給字符串對象?爲什麼在line.split()上寫str.split(line)會有意義?
我似乎更清楚我應該在我的線對象上調用split()方法。
我無法理解兩種方式的工作原理。
首先,你說得對,在這種情況下,它的可讀性更強(以及更多的Pythonic等),只需撥打line.split()
即可,而不是str.split(line)
。
但是有沒有任何情況下str.split
是有用的嗎?當然。想象一下你有一個行列表,並且你想分割所有行。哪一個是更具可讀性:
split_lines = map(str.split, lines)
split_lines = map(lambda line: line.split(), lines)
因爲str.split
已經是任何str
工作的功能,你沒有創建任何str
工程繞過了新的功能。
更一般地,你要問的是,爲什麼Python有「非綁定方法」。*這部分地是因爲他們天生就掉出設計的方法Python中是如何工作的。**不過爲主,這是因爲他們可以方便地傳遞給更高階的函數(並且因爲除非有充分的理由不允許它,絕對所有東西都應該用作值)。
至於最後一部分,理解它們是如何工作的,這可能有點涉及到一個SO答案。你可以瞭解他們如何工作的基礎知識in the tutorial;有關更多詳細信息,請參閱How methods work,該鏈接指向其他有用信息。但作爲一個快速摘要:
line.split
是綁定的方法,一個可調用的是知道什麼值傳遞爲self
參數,當你以後調用它的對象。因此,line.split()
只是調用該綁定方法而沒有附加參數,並且line
自動作爲self
傳遞。str.split
是一個未綁定的方法 - 基本上只是一個函數。所以,str.split(line)
明確地通過line
作爲self
。*由於3.x中,術語「未綁定方法」已被淡化,因爲說真的,一個不受約束的方法是一樣的東西的功能。
** Guido已經解釋了幾次;從他2009年的博客文章First-Class Everything開始。
@AlexThornton:不,當作爲一個未綁定的方法調用時,它的第一個參數是要自行分割的字符串('self')。 – abarnert 2014-11-04 20:03:43
問題中的第一句話似乎是錯誤的。如果'line'是一個充滿字符串的列表,'str.split(line)'和'line.split()'會引發異常(TypeError,因爲列表不是str,而且'AttributeError',因爲列表分別沒有'split'方法)。我假設你的意思是'line'是一個單獨的字符串_within_滿是字符串的列表? – abarnert 2014-11-04 20:06:48