Cách lặp qua máy phát điện


81

Làm thế nào một vòng lặp qua một máy phát điện? Tôi đã nghĩ về cách này:

gen = function_that_returns_a_generator(param1, param2)
if gen: # in case the generator is null
    while True:
        try:
            print gen.next()
        except StopIteration:
            break

Có cách nào khác hay hơn không?


Tôi sẽ đề nghị sử dụng break; khôngcontinue
Jon Clements

Tôi thực sự sẽ làm theo cách này trong trường hợp trình tạo có thể ném một ngoại lệ vào một phần tử, nhưng bạn không muốn dừng quá trình lặp lại.
robbrit

Câu trả lời:


145

Đơn giản

for x in gen:
    # whatever

sẽ thực hiện thủ thuật. Lưu ý rằng if genluôn trả về True.


6
Không, if genkhông phải lúc nào cũng quay lại True. Nếu op function_that_returns_a_generator()trả về None, gengiá trị Falsetrong ifcâu lệnh.
drevicko

44
@drevicko: Tôi đã giả định rằng function_that_returns_a_generator()trả về một trình tạo (giả định táo bạo, phải không?). Nonekhông phải là máy phát điện.
Sven Marnach

Vì, OP yêu cầu một "cách trăn trở", câu trả lời này có vẻ khá hợp pháp, vì Python ủng hộ EAFP ;-)
DerMike

17
for item in function_that_returns_a_generator(param1, param2):
    print item

Bạn không cần phải lo lắng về việc kiểm tra xem có bất kỳ điều gì được trả về bởi hàm của bạn hay không vì nếu không có gì trả về bạn sẽ không vào vòng lặp.


9

Trong trường hợp bạn không cần đầu ra của máy phát điện vì bạn chỉ quan tâm đến các tác dụng phụ của nó, bạn có thể sử dụng một lớp lót sau:

for _ in gen: pass

3
hoặc chỉlist(gen)
sóng

7

Bạn chỉ có thể lặp lại nó:

>>> gen = (i for i in range(1, 4))
>>> for i in gen: print i
1
2
3

Nhưng lưu ý rằng bạn chỉ có thể lặp lại một lần. Trình tạo thời gian tiếp theo sẽ trống:

>>> for i in gen: print i
>>> 

4

Chỉ cần đối xử với nó như bất kỳ loại có thể lặp lại nào khác:

for val in function_that_returns_a_generator(p1, p2):
    print val

Lưu ý rằng if gen:sẽ luôn là Đúng, vì vậy đó là một thử nghiệm sai


2

Nếu bạn muốn di chuyển theo cách thủ công qua trình tạo (tức là làm việc với từng vòng lặp theo cách thủ công) thì bạn có thể làm như sau:

    from pdb import set_trace

    for x in gen:
        set_trace()
        #do whatever you want with x at the command prompt
        #use pdb commands to step through each loop of the generator e.g., >>c #continue   

1
từ pdb import set_trace # no () :)
Vlad K.

1

Các câu trả lời khác là tốt cho các tình huống phức tạp. Nếu bạn chỉ muốn truyền các mục vào một danh sách:

x = list(generator)

(hoặc, nếu bạn chỉ muốn kích hoạt trình tạo để thực hiện công việc, đơn giản list(generator).

Để xử lý trước đơn giản, hãy sử dụng cách hiểu danh sách:

x = [tup[0] for tup in generator]

Hoặc khi bạn muốn thực thi các chức năng đơn giản:

# didn't assign to variable b/c we don't care about what the print() function returns
[print(x) for x in gen]
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.