2012-09-13 44 views
7

Tôi khá mới lập trình và không hiểu nhiều khái niệm. Ai đó có thể giải thích cho tôi cú pháp của dòng 2 và cách nó hoạt động? Không có yêu cầu thụt đầu dòng? Và ngoài ra, tôi có thể học tất cả những điều này từ đâu?Cú pháp phức tạp- Python

string = #extremely large number 

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

Đó là danh sách hiểu. Có, bạn có thể đọc về chúng tại python.org. –

+3

Điều này được gọi là danh sách hiểu. Một giới thiệu: http://carlgroner.me/Python/2011/11/09/An-Introduction-to-List-Comprehensions-in-Python.html –

+0

Về cơ bản, rất nhiều lập trình viên Python đã tìm thấy chính mình bằng cách sử dụng một bộ câu lệnh tương tự hơn và hơn nữa, và quyết định rằng, như các lập trình viên, họ có thể đơn giản hóa nhiệm vụ thường xuyên này. – Hannele

Trả lời

14

Đó là một list comprehension, một cách viết tắt để tạo danh sách mới. Nó có chức năng tương đương với:

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

Nó có nghĩa là chính xác những gì nó nói.

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

Chỉ cần mở rộng về câu trả lời mgilson như nếu bạn đang khá mới để lập trình, mà cũng có thể là một chút chậm hiểu. Kể từ khi tôi bắt đầu học python một vài tháng trở lại, đây là chú thích của tôi.

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

Phiên đầu tiên thông qua các vòng lặp sẽ trông như thế:

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

Lưu ý '' xung quanh 1. Bất cứ điều gì giữa '' hoặc "" có nghĩa là mặt hàng này là một chuỗi. Mặc dù nó trông giống như một con số, như xa như Python là có liên quan nó không phải là. Một cách dễ dàng để xác minh đó là nhập 1 + 2 vào thông dịch viên và so sánh kết quả với '1' + '2'. Xem sự khác biệt? Với các con số, nó sẽ thêm chúng lại với nhau như bạn mong đợi. Với chuỗi nó nối chúng lại với nhau.

Đến lượt thứ hai!

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

Và vì vậy nó sẽ tiếp tục cho đến khi hết các ký tự trong chuỗi hoặc tạo lỗi. Điều gì sẽ xảy ra nếu chuỗi là '1234567890.12345'? Chúng ta có thể nói rằng '.' không phải là ký tự khoảng trống. Vì vậy, khi chúng tôi nhận được xuống để int ('') Python sẽ ném một lỗi:

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

Theo như nguồn lực cho việc học Python, có rất nhiều hướng dẫn miễn phí như:

http://www.learnpython.org

http://learnpythonthehardway.org/book

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

http://getpython3.com/diveintopython3

Nếu bạn muốn mua sách để học sau đó: http://www.amazon.com/Learning-Python-Powerful-Object-Oriented-Programming/dp/0596158068 là yêu thích của tôi. Không chắc tại sao xếp hạng thấp nhưng tôi nghĩ tác giả thực hiện một công việc tuyệt vời.

Chúc may mắn!

0

Những ví dụ này từ PEP là một nơi tốt để bắt đầu. Nếu bạn không quen thuộc với range%, bạn cần phải lùi lại một bước và tìm hiểu thêm về cơ sở.

>>> 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] 
Các vấn đề liên quan