2012-05-02 16 views
23

Python 2.6 giới thiệu chức năng next.Python: Tại sao tôi nên sử dụng next() và không obj.next()?

Tại sao điều này lại cần thiết? Người ta luôn có thể nhập obj.next() thay vì next(obj).

Trường hợp sau có nhiều hơn pythonic không?

+5

Tôi luôn tự hỏi tại sao ngôn ngữ Python lấy cảm hứng từ Python Monty cảm thấy cần phải đồng xu thuật ngữ "pythonic" thay vì tự nhiên "Pythonesque" ..... –

+0

Cũng được hỏi trước: http: // stackoverflow. com/questions/656155/why-did-python-2-6-add-a-global-next-function –

Trả lời

35

PEP 3114 mô tả thay đổi này. Một đoạn trích về động lực:

PEP này đề xuất rằng phương pháp next được đổi tên thành __next__, phù hợp với tất cả các giao thức khác bằng Python trong đó một phương pháp là mặc nhiên được gọi như là một phần của một giao thức ngôn ngữ cấp, và hàm được cài sẵn có tên next được giới thiệu để gọi phương thức __next__, phù hợp với cách thức giao thức khác rõ ràng là được gọi.

Hãy nhớ đọc PEP này để biết thêm chi tiết thú vị.

Đối với lý do tại sao bạn muốn sử dụng next built-in: một lý do chính đáng là phương pháp next biến mất trong Python 3, vì vậy cho tính di động nó tốt hơn để bắt đầu sử dụng next built-in càng sớm càng tốt.

+0

+1: Đó là những gì tôi đã nói trong phần bình luận. – rubik

+1

Tôi thích câu trả lời này nhất. Đặc biệt là vì các lưu ý, rằng Py3000 sẽ không có phương pháp tiếp theo trên các đối tượng nữa. –

25

next(iterator[, default])

Lấy mục kế tiếp từ iterator bằng cách gọi next()(__next__() trong python 3) phương pháp của nó. Nếu mặc định được cung cấp, nó được trả về nếu trình vòng lặp bị cạn, nếu không thì StopIteration sẽ được nâng lên.

Bạn nhận được tùy chọn default.

+1

+1, nhưng không thể chỉ đơn giản là đã thêm một tham số 'default' tùy chọn vào phương thức:' obj .next (mặc định) '? –

+9

@Tim: Sau đó, mỗi lần thực hiện lặp sẽ phải lặp lại logic. –

+5

Ngoài ra, trong Python 3 phương thức 'next()' không tồn tại nữa. Nó được thay thế bằng '__next __()'. Hàm 'next()' cho phép một hành vi thống nhất. – rubik

11

Ngoài chức năng bổ sung rõ ràng, nó cũng có vẻ tốt hơn khi được sử dụng cùng với biểu thức trình tạo. Hãy so sánh

(x for x in lst if x > 2).next() 

để

next(x for x in lst if x > 2) 

Sau đó là rất nhiều phù hợp hơn với phần còn lại của phong cách của Python, IMHO.

+0

Biểu thức trình phát không bắt đầu lại từ đầu mỗi khi câu lệnh được thực hiện?Có vẻ như điều này sẽ chỉ bao giờ trả lại yếu tố đầu tiên. –

+1

@Mark: Vâng, đó là mục đích của thành ngữ này: Trả về phần tử đầu tiên từ một iterable đáp ứng một tiêu chí nhất định (hoặc tăng 'StopIteration' nếu không). –

+0

Nó giống như 'Tìm kiếm số Enumerable 'trong Ruby, ví dụ. –

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