2008-08-26 22 views

Trả lời

4

Câu trả lời ngắn: không có cách nào để làm variabl inline e chuyển nhượng trong một vòng lặp while trong Python. Nghĩa là tôi không thể nói:

while x=next(): 
    // do something here! 

Kể từ đó là không thể, có một số cách "idiomatically đúng" để làm điều này:

while 1: 
    x = next() 
    if x != END: 
     // Blah 
    else: 
     break 

Rõ ràng, đây là loại xấu xí. Bạn cũng có thể sử dụng một trong các cách tiếp cận "trình lặp" được liệt kê ở trên, nhưng, một lần nữa, điều đó có thể không lý tưởng. Cuối cùng, bạn có thể sử dụng cách tiếp cận "pita túi" mà tôi thực sự chỉ tìm thấy trong khi googling:

class Pita(object): 
    __slots__ = ('pocket',) 
    marker = object() 
    def __init__(self, v=marker): 
     if v is not self.marker: 
      self.pocket = v 
    def __call__(self, v=marker): 
     if v is not self.marker: 
      self.pocket = v 
     return self.pocket 

Bây giờ bạn có thể làm:

p = Pita() 
while p(next()) != END: 
    // do stuff with p.pocket! 

Cảm ơn cho câu hỏi này; tìm hiểu về thành ngữ __call__ thực sự tuyệt vời! :)

EDIT: Tôi muốn cung cấp tín dụng khi tín dụng đến hạn. Thành ngữ 'pita pocket' đã được tìm thấy here

+0

Sử dụng '__slots__' ở đây là hoàn toàn không cần thiết. – PaulMcG

+1

Sử dụng một máy phát điện sẽ là một giải pháp nhiều hơn, nếu mối quan tâm ở đây chỉ đơn giản là để lặp qua một danh sách sau đó một vòng lặp for suffices như nó tự ràng buộc kiểm tra – synthesizerpatel

2

Có lẽ nó không phải là khủng khiếp thành ngữ, nhưng tôi muốn được xu hướng đi với

x = next() 
while x != END: 
    do_something_with_x 
    x = next() 

... nhưng đó là bởi vì tôi tìm thấy loại điều dễ đọc

1

Bạn đang cố gắng làm gì ở đây? Nếu bạn đang lặp qua danh sách, bạn có thể sử dụng for e in L trong đó e là phần tử và L là danh sách. Nếu bạn lọc danh sách, bạn có thể sử dụng tính năng hiểu danh sách (ví dụ: [ e for e in L if e % 2 == 0 ] để nhận tất cả số chẵn trong danh sách).

5

Nó phụ thuộc một chút vào những gì bạn muốn làm. Để phù hợp với ví dụ của bạn càng nhiều càng tốt, tôi sẽ làm tiếp theo một máy phát điện và lặp trên nó:

def next(): 
    for num in range(10): 
     yield num 

for x in next(): 
    print x 
1

Nếu bạn cần phải làm nhiều hơn nữa này hơn một lần, cách pythonic sẽ sử dụng một iterator

for x in iternext(): 
    do_something_with_x 

nơi iternext sẽ được xác định bằng một cái gì đó giống như (explicit is better than implicit!):

def iternext(): 
    x = next() 
    while x != END: 
     yield x 
     x = next()   
1

Bạn có thể cung cấp thêm thông tin về những gì bạn đang cố gắng hoàn thành không? Điều đó không rõ ràng với tôi tại sao bạn không thể chỉ nói

for x in everything(): 
    ... 

và có chức năng tất cả trở lại mọi thứ, thay vì viết hàm tiếp theo để trả lại một thứ tại một thời điểm.Máy phát điện thậm chí có thể làm điều này khá hiệu quả.

14

@ Mark Harrison của câu trả lời:

for x in iter(next_, END): 
    .... 

Dưới đây là một đoạn trích từ Python's documentation:

iter(o[, sentinel]) 

Return một đối tượng iterator. ... (snip) ... Nếu đối số thứ hai, sentinel, được cung cấp, thì o phải là một đối tượng có thể gọi. Trình tạo lặp lại được tạo trong trường hợp này sẽ gọi o mà không có đối số cho mỗi cuộc gọi đến phương thức next() của chúng tôi; nếu giá trị trả lại bằng sentinel, StopIteration sẽ được nâng lên, nếu không giá trị sẽ được trả lại.

Các vấn đề liên quan