Khi tôi sử dụng máy phát điện trong vòng lặp for, có vẻ như "biết", khi không có thêm phần tử nào được tạo ra. Bây giờ, tôi phải sử dụng một máy phát điện KHÔNG có vòng lặp for, và sử dụng tiếp theo() bằng tay, để lấy phần tử tiếp theo. Vấn đề của tôi là, làm thế nào để tôi biết, nếu không có nhiều yếu tố hơn?Python 3.x: Kiểm tra xem máy phát có các thành phần còn lại
Tôi chỉ biết: tiếp theo() đặt ra một ngoại lệ (StopIteration), nếu không có gì còn lại, NHƯNG không phải là ngoại lệ một chút quá "nặng" cho một vấn đề đơn giản như vậy? Không có phương thức nào như has_next() hay như vậy?
Những dòng này nên làm cho rõ ràng, những gì tôi có nghĩa là:
#!/usr/bin/python3
# define a list of some objects
bar = ['abc', 123, None, True, 456.789]
# our primitive generator
def foo(bar):
for b in bar:
yield b
# iterate, using the generator above
print('--- TEST A (for loop) ---')
for baz in foo(bar):
print(baz)
print()
# assign a new iterator to a variable
foobar = foo(bar)
print('--- TEST B (try-except) ---')
while True:
try:
print(foobar.__next__())
except StopIteration:
break
print()
# assign a new iterator to a variable
foobar = foo(bar)
# display generator members
print('--- GENERATOR MEMBERS ---')
print(', '.join(dir(foobar)))
Đầu ra là như sau:
--- TEST A (for loop) ---
abc
123
None
True
456.789
--- TEST B (try-except) ---
abc
123
None
True
456.789
--- GENERATOR MEMBERS ---
__class__, __delattr__, __doc__, __eq__, __format__, __ge__, __getattribute__, __gt__, __hash__, __init__, __iter__, __le__, __lt__, __name__, __ne__, __new__, __next__, __reduce__, __reduce_ex__, __repr__, __setattr__, __sizeof__, __str__, __subclasshook__, close, gi_code, gi_frame, gi_running, send, throw
Nhờ tất cả mọi người, và có một ngày tốt đẹp! :)
Tôi vừa mới nhận ra mình muốn làm 'dis' vì học 'numpy'. ;) – n611x007