2012-06-07 114 views
5

以下示例顯示了我在嘗試使用函數調用中的字符串函數進行映射時遇到的錯誤。我需要幫助,爲什麼發生這種情況。謝謝。爲什麼我不能在map()中使用字符串函數?

>>> s=["this is a string","python python python","split split split"] 
>>> map(split,s) 
Traceback (most recent call last): 
    File "<pyshell#16>", line 1, in <module> 
    map(split,s) 
NameError: name 'split' is not defined 

雖然split()是一個內置函數,但它仍然會拋出這個錯誤?

回答

14

它會工作,如果你使用str.split()

即細,

s = ["this is a string","python python python","split split split"] 
map(str.split, s) 

給出:

[['this', 'is', 'a', 'string'], 
['python', 'python', 'python'], 
['split', 'split', 'split']] 

該錯誤消息指出:NameError: name 'split' is not defined,這樣解釋不承認split因爲split不是built-in function 。爲了實現此目的,您必須將split與內置的str對象關聯起來。

更新:措辭改進的基於@ IVC的有幫助的意見/建議。

+0

啊!我明白了,'split()'是一種與對象類型相關的方法(不同於'string','re'等),並且不是一個內置函數,所以我需要指定對象類型來消除歧義。 –

+2

這不是爲了消除歧義,而是因爲它的字符串方法 -​​ ''blah'.split('a')'等價於'str.split('blah','a')',與'instanceofmyclass .mymethod(arg)'相當於'MyClass.mymethod(instanceofmyclass,arg)' - 該字符串是'str.split'的'self'參數。 – lvc

+11

這是一種醜陋。我寧願像方法一樣調用方法,例如'map(lambda x:x.split(),s)',或者更好一些,就去''[x.split()for s]' –

2

split不是內置函數,但str.split是一個內置對象的方法。一般來說,你可以調用split作爲str對象的一種方法,所以這就是它直接綁定的原因。

檢查從解釋輸出:

>>> str 
<type 'str'> 
>>> str.split 
<method 'split' of 'str' objects> 
+0

我不相信這是正確的(str.stplit是一個內置函數)。這裏沒有列出:http://docs.python.org/library/functions.html,以及與str有關的cleary,所以是一個方法。 – Levon

+0

你是對的。我應該寫一個內置的方法。 –

+0

@Jeff我改變它爲你。 – jamylak

相關問題