2012-06-07 6 views
5

El siguiente ejemplo muestra el error que obtengo cuando trato de usar una función de cadena dentro de una llamada a función para mapear. Necesito ayuda con por qué esto sucede. Gracias.¿Por qué no puedo usar funciones de cadena dentro de 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 

aunque split() es una función incorporada, pero todavía lanza este error?

Respuesta

14

no tendrán ningún problema si utiliza str.split()

Es decir,

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

da:

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

El mensaje de error indica: NameError: name 'split' is not defined, por lo que el intérprete no reconoce split porque split no es un built-in function . Para que esto funcione, debe asociar split con el objeto str incorporado.

actualización: Redacción mejorado basado en @votos comentarios/sugerencias de IVC.

+0

Ah! Lo tengo, 'split()' es un método relacionado con el tipo de objeto (diferente para 'string',' re', etc.) y no es una función incorporada, así que necesito especificar el tipo de objeto para eliminar la ambigüedad. –

+2

No es para desambiguar, sino más bien porque es un método de cadena - '' blah'.split ('a') 'es equivalente a' str.split ('blah', 'a') ', lo mismo que' instanceofmyclass .mymethod (arg) 'es equivalente a' MyClass.mymethod (instanceofmyclass, arg) '- la cadena es el argumento' self' de 'str.split'. – lvc

+11

Esto es feo. Prefiero llamar al método como un método, p. 'map (lambda x: x.split(), s)', o mejor, simplemente vaya '[x.split() para x en s]' –

2

split no es una función incorporada, aunque str.split es un método de un objeto incorporado. Generalmente, llamaría a split como un método de un objeto str, por eso es que está enlazado directamente.

Comprobar la salida del intérprete:

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

No creo que sea correcto (str.stplit es una función incorporada). No aparece en la lista aquí: http://docs.python.org/library/functions.html y cleary asociado con str, por lo que es un método. – Levon

+0

tienes razón. Debería haber escrito el método en un built-in. –

+0

@Jeff Lo cambié a eso por ti. – jamylak

Cuestiones relacionadas