2012-06-07 2 views
5

다음 예제는 함수 호출에서 문자열 함수를 사용하려고 할 때 나타나는 오류를 보여줍니다. 왜 이런 일이 일어나는지에 대한 도움이 필요합니다. 감사. split()하지만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 

는 내장 기능이지만, 여전히이 오류가 발생합니다?

답변

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을 인터프리터가 인식하지 않도록 splitsplitbuilt-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 x]'로 가라. –

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

@ 제프 나는 당신을 위해 그것을 바 꾸었습니다. – jamylak

관련 문제