không có hàm next () nào trong trình tạo năng suất trong python 3


84

Trong câu hỏi này , tôi có một chuỗi vô tận bằng cách sử dụng trình tạo Python. Nhưng mã tương tự không hoạt động trong Python 3 vì có vẻ như không có next()chức năng nào . Tương đương với nextchức năng là gì?

def updown(n):
    while True:
        for i in range(n):
            yield i
        for i in range(n - 2, 0, -1):
            yield i

uptofive = updown(6)
for i in range(20):
    print(uptofive.next())


Mã này hoạt động như thế nào? Tôi hiểu rằng nó KHÔNG hoạt động, nhưng từ những gì tôi đọc, "Việc thực thi mã dừng lại khi đạt được câu lệnh lợi nhuận". ( python-course.eu/python3_generators.php ). Vì vậy, trong đầu tiên for i in range(n), tại sao không yieldchỉ đơn giản là trả về "1"? Thay vào đó, sau giá trị đầu tiên trong phạm vi, mã tiếp tục và mang lại toàn bộ phạm vi, đối với tôi dường như lợi nhuận được gọi nhiều lần cùng một lúc. Tôi đang gặp một chút khó khăn khi hiểu sắc thái.
Mike S

Lần đầu tiên forgọi đối tượng trình tạo được tạo từ hàm của bạn, nó sẽ chạy mã trong hàm của bạn ngay từ đầu cho đến khi chạm vào yield, sau đó nó sẽ trả về giá trị đầu tiên của vòng lặp. Sau đó, các lệnh gọi khác sẽ chạy vòng lặp bạn đã viết trong hàm một lần nữa và trả về giá trị tiếp theo, cho đến khi không có giá trị nào để trả về. (lấy từ hướng dẫn này )
Mattia Paterna

Câu trả lời:


123

Trong Python 3, sử dụng next(uptofive)thay vì uptofive.next().

Hàm tích hợp sẵn next()cũng hoạt động trong Python 2.6 hoặc cao hơn.


36
Whyyyyyyyyyyyyy
Kenny Worden

44

Trong Python 3, để làm cho cú pháp nhất quán hơn, next()phương thức đã được đổi tên thành __next__(). Bạn có thể sử dụng cái đó. Điều này được giải thích trong PEP 3114 .

Thực hiện theo giải pháp của Greg và gọi hàm nội trangnext() (sau đó cố gắng tìm __next__()phương thức của đối tượng ) được khuyến khích.


1
Đặc biệt là vì hàm có thể di động giữa các phiên bản 2 và 3, trong khi các phương thức (vì sự thay đổi tên) thì không.
holdenweb
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.