2014-12-16 2 views
1

Я читаю книгу на Python3 (Представляя Python Биллом Лубановичем), и наткнулся на то, что я не был уверен в предпочтении Python или просто «упрощении» из-за того, что я был книги и пытается описать что-то еще.while True vs while {condition}

Это о том, как писать в файл, используя куски вместо одного снимка.

poem = '''There was a young lady named Bright, 
Whose speed was far faster than light; 
She started one day 
In a relative way, 
And returned on the previous night.''' 

fout = open('relativity', 'wt') 
size = len(poem) 
offset = 0 
chunk = 100 
while True: 
    if offset > size: 
     break 
    fout.write(poem[offset:offset+chunk]) 
    offset += chunk 
fout.close() 

Я собирался спросить, почему она имеет while True вместо while (offset > size), но решил попробовать это для себя, и увидел, что while (offset > size) не делает ничего в моей консоли Python.

Это просто ошибка в консоли или Python действительно требует, чтобы вы перемещали условие внутри цикла while? Со всеми изменениями, чтобы сделать его как можно более минимальным, это кажется очень многословным.

(я происхожу из фона в Java, C# и JavaScript, где условие как определение для цикла является стандартным.)

EDIT

Благодаря комментарий хпх, я понял, что у меня была неправильная логика в том, что у меня было бы условия.

Это возвращает меня к более ясному вопросу, который я изначально хотел, чтобы сосредоточиться на:

ли Python предпочитают делать while True и есть условие использовать break внутри цикла, или это просто оплошность автора как он пытался объяснить другую концепцию?

+11

Логическим эквивалентом будет 'while offset <= size' wouldn'y it? – xnx

+0

Touche, спасибо. Я написал, что, понимая, что это должно быть здесь, а не в Code Review, где я изначально собирался опубликовать это. Затем я обнаружил, что то, что, как я думал, должно работать, не помогло, что не подходит для этого сайта. Под редакцией! – krillgar

+0

И, конечно же, поэтому моя попытка в консоли ничего не сделала. Это половина проблемы, но не отвечает ** ПОЧЕМУ **. – krillgar

ответ

1

Я собирался спросить, почему у него в то время как Правда вместо некоторого времени (смещение < = размера), но решил попробовать это для себя,

Это на самом деле, как я написал бы. Он должен быть логически эквивалентен.

и увидел, что в то время как (смещение> размер) фактически ничего не делает на моей консоли Python.

Необходимо было использовать (offset <= size), а не (offset > size). Текущая логика останавливается, как только offset больше size, поэтому отмените условие, если вы хотите поместить его в оператор while.

Действительно ли Python требует, чтобы вы перемещали условие внутри цикла while?

Нет, Python позволяет писать запись в цикле while напрямую. Оба варианта в порядке, и на самом деле это больше зависит от личных предпочтений в том, как вы пишете свою логику. Я предпочитаю более простую форму, как вы предполагали, по оригинальной версии автора.

Это должно работать нормально:

while offset <= size: 
    fout.write(poem[offset:offset+chunk]) 
    offset += chunk 

Для получения дополнительной информации обратитесь к документации по while, что конкретно говорится, что любое выражение может быть использовано до :.


Edit:

ли Python предпочитают делать в то время как Истинные и есть условие использовать разрыв внутри цикла, или это просто упущение со стороны автора, как он пытался объяснить различные концепция?

Python не предпочитает while True:. Любая версия в порядке, и это полностью зависит от кодера. Я лично предпочитаю держать выражение в выражении while, поскольку я нахожу код более понятным, кратким и поддерживаемым, используя while offset <= size:.

1

Это законный код на языке Python для установки условного выражения в цикле. Лично я считаю:

while offset <= size: 

яснее, чем:

while True: 
    if offset < size: 
     break 

Я предпочитаю первую форму, потому что есть один меньше ветвь, чтобы следовать, но логика не какой-либо более сложным. При прочих равных условиях более низкие уровни отступов легче читать. Если было несколько разных условий, которые вырвались бы из цикла, тогда было бы предпочтительнее использовать синтаксис while True.

Что касается наблюдаемого поведения с неправильной логикой петли, рассмотрит этот фрагмент кода:

size = len(poem) 
offset = 0 

while offset > size: 
    #loop code 

никогда не будет введен в offset > size цикле в то время как начинается ложь.

+0

Спасибо. Это была синтаксическая ошибка с моей стороны. Пожалуйста, просмотрите повторно заданный вопрос, когда обнаружена незначительная ошибка. Мое первоначальное намерение было стилистическим, а не «почему моя ошибочная логика не работает». – krillgar

+0

@krillgar, отредактированный, чтобы отразить это. – shuttle87

1
while True: 
    if offset > size: 
     break 
    func(x) 

в точности эквивалентен

while offset <= size: 
    func(x) 

Они оба работают до смещения> размера. Это просто другой способ его формулировки - оба приемлемы, и я не знаю никаких различий в производительности. Они будут работать только по-другому, если вы имели условие разрыва в нижней части петли while (т.е. после func(x))

редактировать:

Согласно the Python wiki в Python 2. * «это замедляет много» чтобы поставить условие внутри цикла while: «это связано с первым тестированием условия« Истинное состояние »на время, а затем повторным тестированием« условия перерыва ». Я не знаю, какую меру они используют для «много», но кажется, что это достаточно мало.

+2

Введенная здесь вики-запись Python неверна. Вы не можете переназначить 'True', чем вы можете переназначить' 1', а 'dis' показывает, что для« True »нет никакого значения. –

+0

@AdamSmith ах! Я пропустил критическую деталь: «хотя в Python 2. *», возможно, это касается вашей точки? –

+2

Священный crud, вы можете переназначить 'True' в Python2. Чья идея была ** THAT?! ** –

1

ли Python предпочитают делать в то время как Истинные и есть условие использовать разрыв внутри цикла, или это просто упущение со стороны автора, как он пытался объяснить различные концепции?

Нет, это не причуда или ошибка автора.

Бывают ситуации, когда типичный стиль Python (и Guido van Rossum) активно советует использовать while True, но это не один из них. Тем не менее, они не минус это либо. Я предполагаю, что есть случаи, когда тест будет легче читать и понимать как «сказать, когда сломать», чем «сказать, когда продолжать». Несмотря на то, что они просто логические отрицаний друг с другом, один или другой может сделать экспресс вещи немного более просто:

while not god_unwilling() and not creek_risen(): 
while not (god_unwilling() or creek_risen()): 

vs.

while True: 
    if god_unwilling() or creek_risen(): 
     break 

я еще вроде предпочитаю первый, но YMMV , Еще лучше ввести функции, соответствующие английскому идиому: god_willing() и creek_dont_rise()

«Необходимое» использование - это когда вы хотите выполнить тест разрыва в конце или в середине цикла (то есть, когда вы хотите выполнить часть или весь цикл безоговорочно в первый раз). Там, где другие языки имеют большее разнообразие более сложных конструкций цикла, а другие примеры играют в игры с переменной, чтобы решить, сломаться или нет, Гвидо говорит «просто используйте while True». Вот пример из FAQ, для loop that starts with an assignment:

код C:

while (line = readline(f)) { 
    // do something with line 
} 

Python код:

while True: 
    line = f.readline() 
    if not line: 
     break 
    # do something with line 

Справки замечание (и это относится к типичному стилю Python):

Интересным явлением является то, что большинство опытных программистов Python распознают while True Идиома и, похоже, не хватает назначения в выражении; только новички выражают сильное желание добавить это на этот язык.

Он также указывает, что в данном конкретном примере вы можете вообще избежать всей проблемы с помощью for line in f.

-2

На мой взгляд, в то время как True лучше других способов, в больших программах; который имеет длинные коды. Потому что вы не можете видеть, что переменная может измениться из-за некоторых функций или т. Д. while True означает начало, если его истинное значение, что означает , начать этот цикл независимо от того, что произошло, кроме закрытой программы. Так что, возможно, писатель книги хочет, чтобы вы использовали , а True, немного менее рискованно, чем другие.

Лучше всего использовать , а True и определить переменную, которая может остановить этот цикл.

1

Когда чтение из файла, вы обычно делаете

output = [] 
while True: 
    chunk = f.read(chunksize) 
    if len(chunk) == 0: 
     break 
    output.append(chunk) 

Мне кажется, как автор больше привык делать чтение, чем писать, и в этом случае чтение идиома использования while True протекла до написания кода.

Как и большинство людей, отвечая на вопрос, может подтвердить, используя просто while offset <= size, вероятно, более Pythonic и проще, хотя еще проще может быть просто сделать

f.write(poem) 

с лежащей в основе библиотеки ввода/вывода может обрабатывать вампир пишет.

+0

В маленьком напишите вот так, я бы согласился просто называть 'f.write (poem)'. Но если есть огромный файл, который вы пишете, он все еще внутренне его обрывает? – krillgar