Автоматизируйте скучный материал: почему эти Python функции не делают одно и то же? - PullRequest
2 голосов
/ 02 февраля 2020

Я работаю через Automate the Boring Stuff, и я заметил, что он учит открытый модуль как:

baconFile = open('bacon.txt', 'w')
baconFile.write('Bacon is not a vegetable.')
baconFile.close()

Зачем нам вообще нужна переменная baconFile? Я понимаю простоту чтения / отладки, однако, когда я пробую следующий код, текст не вводится в файл .txt:

open('bacon.txt', 'w').write('Bacon is not a vegetable.')
open('bacon.txt', 'w').close()

Почему? В чем разница между этими двумя?

Редактировать: Люди говорят, что я снова открываю его в коде внизу. Разве это не то, что я делаю в верхнем коде? Я думал, что переменная была просто заменой любого кода, который я не хотел вводить снова.

Ответы [ 3 ]

2 голосов
/ 02 февраля 2020
step 1. open the file to write.
step 2. write something in the file.
step 3. close the file.

вы пытаетесь открыть открытый файл.

2 голосов
/ 02 февраля 2020

В вашей версии вы создаете два обработчика файлов (например, baconFile в исходном примере), по одному для каждого вызова open, и они обрабатывают один и тот же файл. baconFile это не файл, это объект для обработки файлов .

Первый, который вы используете для написания текста. Вы никогда не закроетесь, и он будет уничтожен, когда ваша программа закончится.

Когда вы открываете второй в режиме w, он сбрасывает текстовое содержимое, а затем закрывает его.

1 голос
/ 02 февраля 2020

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

Это описание ссылочная прозрачность в терминах непрофессионала.

Работает, только если вы имеете дело с чистыми функциями , то есть функциями, которые не имеют побочных эффектов. Например,

def double(x):
    return 2 * x

a = double(5)
b = a + a

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

b = double(5) + double(5)

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

Так что если вместо этого,

def double(x):
    print('doubling', x)
    return 2 * x

, тогда

a = double(5)
b = a + a

больше не эквивалентно

b = double(5) + double(5)

b - все равно 20 в обоих случаях, но первый случай печатает doubling 5 один раз, второй случай печатает его дважды.


open('bacon.txt', 'w') имеет побочный эффект открытия файла и его усечения, и оценивается в значение , которое дескриптор файла.

В вашем примере

open('bacon.txt', 'w').write('Bacon is not a vegetable.')
open('bacon.txt', 'w').close()

эквивалентен:

f = open('bacon.txt', 'w')
f.write('Bacon is not a vegetable.')

g = open('bacon.txt', 'w')
g.close()

Это означает, что файл открывается и усекается один раз, тогда что-то написано к нему. Затем он снова открывается и усекается, теряя то, что вы написали раньше.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...