2012-09-13 17 views
7

Soy bastante nuevo en la programación y no entiendo muchos conceptos. ¿Puede alguien explicarme la sintaxis de la línea 2 y cómo funciona? ¿No se requiere indentación? Y también, ¿de dónde puedo aprender todo esto?Sintaxis compleja: Python

string = #extremely large number 

num = [int(c) for c in string if not c.isspace()] 
+2

Eso es una lista de comprensión. Sí, puedes leer sobre ellos en python.org. –

+3

Esto se llama una lista de comprensión. Una introducción: http://carlgroner.me/Python/2011/11/09/An-Introduction-to-List-Comprehensions-in-Python.html –

+0

Básicamente, muchos programadores de Python se encontraron utilizando un conjunto similar de declaraciones una y otra vez, y decidió que, como programadores, pueden simplificar esta tarea rutinaria. – Hannele

Respuesta

14

Eso es un list comprehension, una especie de taquigrafía para la creación de una nueva lista. Es funcionalmente equivalente a:

num = [] 
for c in string: 
    if not c.isspace(): 
     num.append(int(c)) 
4

Significa exactamente lo que dice.

num =  [   int(      c) 

"num" shall be a list of: the int created from each c 

for c       in string 

where c takes on each value found in string 

if  not      c .isspace() ] 

such that it is not the case that c is a space (end of list description) 
1

Sólo para ampliar la respuesta de mgilson como si usted es bastante nuevo a la programación, que también puede ser un poco obtuso. Desde que comencé a aprender Python hace unos meses, aquí están mis anotaciones.

string = 'aVeryLargeNumber' 
num = [int(c) for c in string if not c.isspace()] #list comprehension 

"""Breakdown of a list comprehension into it's parts.""" 
num = [] #creates an empty list 
for c in string: #This threw me for a loop when I first started learning 
    #as everytime I ran into the 'for something in somethingelse': 
    #the c was always something else. The c is just a place holder 
    #for a smaller unit in the string (in this example). 
    #For instance we could also write it as: 
    #for number in '1234567890':, which is also equivalent to 
    #for x in '1234567890': or 
    #for whatever in '1234567890' 
      #Typically you want to use something descriptive. 
    #Also, string, does not have to be just a string. It can be anything 
    #so long as you can iterate (go through it) one item at a time 
    #such as a list, tuple, dictionary. 

if not c.isspace(): #in this example it means if c is not a whitespace character 
     #which is a space, line feed, carriage return, form feed, 
       #horizontal tab, vertical tab. 

num.append(int(c)) #This converts the string representation of a number to an actual 
     #number(technically an integer), and appends it to a list. 

'1234567890' # our string in this example 
num = [] 
    for c in '1234567890': 
     if not c.isspace(): 
      num.append(int(c)) 

La primera iteración a través del bucle se vería así:

num = [] #our list, empty for now 
    for '1' in '1234567890': 
     if not '1'.isspace(): 
      num.append(int('1')) 

Nota del '' alrededor de la 1. Cualquier cosa entre '' o "" significa que este artículo es una cadena. Aunque parece un número, en lo que respecta a Python, no lo es. Una forma fácil de hacerlo es para verificar que se debe escribir 1 + 2 en el intérprete y comparar el resultado con '1' + '2'. ¿Ves una diferencia? Con números, los suma juntos como era de esperar. Con cuerdas, los une.

¡En la segunda pasada!

num = [1] #our list, now with a one appended! 
    for '2' in '1234567890': 
     if not '2'.isspace(): 
      num.append(int('2')) 

Y así continuará hasta que se agote de caracteres en la cadena, o se produce un error. ¿Qué pasaría si la cadena fuera '1234567890.12345'? Podemos decir con seguridad que '.' no es un personaje en blanco Así que cuando nos ponemos manos a int ('') Python va a lanzado un error:

Traceback (most recent call last): 
    File "<string>", line 1, in <fragment> 
builtins.ValueError: invalid literal for int() with base 10: '.' 

En cuanto a los recursos para el aprendizaje de Python, hay una gran cantidad de tutoriales gratuitos, tales como:

http://www.learnpython.org

http://learnpythonthehardway.org/book

http://openbookproject.net/thinkcs/python/english3e

http://getpython3.com/diveintopython3

Si quiere comprar un libro para aprender, entonces: http://www.amazon.com/Learning-Python-Powerful-Object-Oriented-Programming/dp/0596158068 es mi favorito. No estoy seguro de por qué las calificaciones son bajas, pero creo que el autor hace un excelente trabajo.

¡Buena suerte!

0

Estos ejemplos del PEP son un buen lugar para comenzar. Si no está familiarizado con range y %, necesita dar un paso atrás y aprender más sobre las bases.

>>> print [i for i in range(10)] 
[0, 1, 2, 3, 4, 5, 6, 7, 8, 9] 

>>> print [i for i in range(20) if i%2 == 0] 
[0, 2, 4, 6, 8, 10, 12, 14, 16, 18] 

>>> nums = [1,2,3,4] 
>>> fruit = ["Apples", "Peaches", "Pears", "Bananas"] 
>>> print [(i,f) for i in nums for f in fruit] 
[(1, 'Apples'), (1, 'Peaches'), (1, 'Pears'), (1, 'Bananas'), 
(2, 'Apples'), (2, 'Peaches'), (2, 'Pears'), (2, 'Bananas'), 
(3, 'Apples'), (3, 'Peaches'), (3, 'Pears'), (3, 'Bananas'), 
(4, 'Apples'), (4, 'Peaches'), (4, 'Pears'), (4, 'Bananas')] 
>>> print [(i,f) for i in nums for f in fruit if f[0] == "P"] 
[(1, 'Peaches'), (1, 'Pears'), 
(2, 'Peaches'), (2, 'Pears'), 
(3, 'Peaches'), (3, 'Pears'), 
(4, 'Peaches'), (4, 'Pears')] 
>>> print [(i,f) for i in nums for f in fruit if f[0] == "P" if i%2 == 1] 
[(1, 'Peaches'), (1, 'Pears'), (3, 'Peaches'), (3, 'Pears')] 
>>> print [i for i in zip(nums,fruit) if i[0]%2==0]