2016-08-21 22 views
7

Tôi tìm thấy câu hỏi này về hành vi lặp bằng Python:Tại sao không QtConsole echo next()?

Python list iterator behavior and next(iterator)

Khi tôi gõ vào đoạn code:

a = iter(list(range(10))) 
for i in a: 
    print a 
    next(a) 

vào jupyter-qtconsole nó trả về:

0 
2 
4 
6 
8 

chính xác như Martijn Pieters nói điều đó nên khi người thông dịch không lặp lại lời kêu gọi tới next(a).

Tuy nhiên, khi tôi chạy cùng mã một lần nữa trong phiên dịch Bash tôi và IDLE, mã in:

0 
1 
2 
3 
4 
5 
6 
7 
8 
9 

ra cửa sổ Console.

Tôi chạy mã:

import platform 
platform.python_implementation() 

trong cả ba môi trường và tất cả họ đều nói rằng tôi chạy 'CPython'.

Vậy tại sao QtConsole chặn cuộc gọi next(a) khi IDLE và Bash không?

Nếu trợ giúp, tôi đang chạy Python 2.7.9 trên Mac OSX và sử dụng phân phối Anaconda.

Trả lời

3

Đây chỉ là sự lựa chọn của các nhà phát triển của IPython (trên đó QtConsole được dựa) được thực hiện liên quan đến những gì cần được lặp lại cho người dùng.

Cụ thể, trong lớp InteractiveShell được sử dụng, chức năng run_ast_nodes theo mặc định, được xác định bằng interactivity='last_expr'. Các tài liệu về thuộc tính này khẳng định:

interactivity : str 
    'all', 'last', 'last_expr' or 'none', specifying which nodes should be 
    run interactively (displaying output from expressions). 'last_expr' 
    will run the last node interactively only if it is an expression (i.e. 
    expressions in loops or other blocks are not displayed. Other values 
    for this parameter will raise a ValueError. 

Như bạn có thể thấy: biểu thức trong vòng hoặc các khối khác không được hiển thị.

Bạn có thể thay đổi điều này trong các tệp cấu hình cho IPython và làm cho nó hoạt động như repl nếu bạn thực sự cần. Điểm là, nó chỉ là một ưu tiên các nhà thiết kế thực hiện.

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