2012-09-13 17 views
7

Jestem całkiem nowy w programowaniu i nie rozumiem wielu koncepcji. Czy ktoś może mi wyjaśnić składnię linii 2 i jak to działa? Czy nie jest wymagane żadne wcięcie? A także, skąd mogę się tego wszystkiego nauczyć?Skomplikowana składnia - Python

string = #extremely large number 

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

To jest zrozumienie listy. Tak, możesz przeczytać o nich na python.org. –

+3

Nazywa się to rozumieniem listy. Jedno wprowadzenie: http://carlgroner.me/Python/2011/11/09/An-Introduction-to-List-Comprehensions-in-Python.html –

+0

Zasadniczo wielu programistów Pythona znalazło się w podobnym zestawie instrukcji w kółko i postanowił, że jako programiści mogą uprościć to rutynowe zadanie. – Hannele

Odpowiedz

14

To list comprehension, rodzaj skrót do tworzenia nowej listy. Jest funkcjonalnie równoważne:

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

Oznacza to dokładnie to co mówi.

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

Wystarczy rozwinąć na odpowiedź mgilson jako jeśli jesteś dość nowy w programowaniu, które mogą być również nieco rozwarty. Odkąd zacząłem uczyć się Pythona kilka miesięcy temu, oto moje adnotacje.

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)) 

Pierwsza iteracja przez pętlę wyglądałby następująco:

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

Zanotować „” wokół 1. coś między „” lub „” oznacza ten element jest ciągiem. Chociaż wygląda na liczbę, jeśli chodzi o Python, nie jest. Łatwy sposób: w celu sprawdzenia, czy należy wpisać 1 + 2 w tłumaczu i porównać wynik z "1" + "2". Widzisz różnicę? Z liczbami dodaje je razem, jak można się spodziewać. Ze sznurkami łączy je ze sobą.

Do drugiego przejścia!

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

I tak będzie nadal, dopóki nie skończy się w ciągu znaków, lub produkuje błąd. Co by się stało, gdyby ciąg brzmiał "1234567890.12345"? Możemy śmiało powiedzieć, że "." nie jest białą spacją. Kiedy więc zabrać się do int („”) Python będzie rzucony błędu:

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

ile zasobów do nauki Pythona, istnieje wiele bezpłatnych tutoriali, takich jak:

http://www.learnpython.org

http://learnpythonthehardway.org/book

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

http://getpython3.com/diveintopython3

Jeśli chcesz kupić książkę do nauki, wtedy: http://www.amazon.com/Learning-Python-Powerful-Object-Oriented-Programming/dp/0596158068 jest moim ulubionym. Nie wiem, dlaczego oceny są niskie, ale myślę, że autor robi świetną robotę.

Powodzenia!

0

Te przykłady z PEP są dobrym miejscem do rozpoczęcia. Jeśli nie znasz range i %, musisz zrobić krok wstecz i dowiedzieć się więcej o fundamentach.

>>> 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]