2011-10-15 28 views
19

Trong C, người ta có thể làmChuyển nhượng Điều kiện trong Python khi Loop

while((i=a) != b) { } 

nhưng trong Python, nó xuất hiện, người ta không thể.

while (i = sys.stdin.read(1)) != "\n": 

tạo

while (i = sys.stdin.read(1)) != "\n": 
     ^
SyntaxError: invalid syntax 

(các ^ nên trên =)

Có một cách giải quyết?

+3

'sys.stdin.readline() ' –

+0

oh đó là vụng về .. 'readline()' so sánh với 'raw_input()' như thế nào? – tekknolagi

+1

@tekknolagi Có lẽ anh ấy không nhận được bình luận của bạn. Bạn nên ping một người bằng cách thêm '@ name' vào văn bản nhận xét. – ovgolovin

Trả lời

17

Sử dụng break:

while True: 
    i = sys.stdin.read(1) 
    if i == "\n": 
     break 
    # etc... 
+0

cảm ơn bạn!hoạt động :) – tekknolagi

+18

Vòng lặp vô hạn trong khi ngắt? Có thật không? Nó cháy ... –

+2

@FalconMomot Điều này có vẻ giống như một mô hình hoàn toàn hợp lý với tôi. Điều gì xảy ra khi vòng lặp bị hỏng? Hoặc điều kiện chấm dứt sẽ xảy ra, hoặc nó sẽ không xảy ra. Nếu 'i ==" \ n "' không xảy ra bên trong vòng lặp (gây ra ngắt), nó sẽ không xảy ra trong đối số điều kiện của vòng lặp while. – vastlysuperiorman

3

Cá nhân tôi thích imm và Marks câu trả lời bằng break, nhưng bạn cũng có thể làm:

a = None 
def set_a(x): 
    global a 
    a = x 
    return a 

while set_a(sys.stdin.read(1)) != '\n': 
    print('yo') 

mặc dù tôi không muốn giới thiệu nó.

7

Bạn có thể thực hiện điều này bằng cách sử dụng built-in chức năng iter() sử dụng hai đối số phương pháp gọi:

import functools 
for i in iter(fuctools.partial(sys.stdin.read, 1), '\n'): 
    ... 

Tài liệu cho việc này:

iter(o[, sentinel])
...
Nếu đối số thứ hai, sentinel, được cung cấp, sau đó o phải là một ob có thể gọi ject. Trình lặp được tạo trong trường hợp này sẽ gọi o mà không có đối số cho mỗi cuộc gọi đến phương thức next() của nó; nếu giá trị trả lại bằng sentinel, StopIteration sẽ được tăng lên, nếu không giá trị sẽ được trả lại.

Một ứng dụng hữu ích ở dạng thứ hai là iter() là đọc các dòng của một tệp cho đến khi đạt được một dòng nhất định. Ví dụ dưới đây đọc một tập tin cho đến khi phương pháp readline() trả về một chuỗi rỗng:

with open('mydata.txt') as fp: 
    for line in iter(fp.readline, ''): 
     process_line(line) 
4

Một phiên bản mà không functools:

for i in iter(lambda: sys.stdin.read(1), '\n'): 
Các vấn đề liên quan