Пока вы находитесь внутри функции (, а не на верхнем уровне модуля), присваивание промежуточных результатов локальным голым именам обходится по существу незначительно (на верхнем уровне модуля, присваивая «локальному»). Голые имена подразумевают отток на dict - модуль __dict__
- и измеримо дороже, чем это было бы внутри функции: средство никогда не должно иметь "существенный" код на верхнем уровне модуля ... всегда прятать существенный код в пределах функция -!)
.
Общая философия Python включает в себя «квартира лучше вложенной» - и это включает в себя «вложенные» выражения. Глядя на ваш оригинальный пример ...:
junk_block = "".join(open("foo.txt","rb").read().split())
представляет еще одну важную проблему: когда этот файл закрывается? В CPython сегодня вам не нужно беспокоиться - на практике подсчет ссылок гарантирует своевременное закрытие. Но большинство других реализаций Python (Jython на JVM, IronPython на .NET, PyPy на всех видах бэкэндов, pynie на Parrot, Unladen Swallow на LLVM, если и когда оно созревает согласно опубликованному плану, ...), не не гарантирует использование подсчета ссылок - может быть задействовано много стратегий сбора мусора со всеми другими преимуществами.
Без какой-либо гарантии подсчета ссылок (и даже в CPython это всегда считалось артефактом реализации, не частью семантики языка!), Вы могли бы исчерпать ресурсы, выполняя такие "открытые, но нет" код close в узком цикле - сборка мусора запускается из-за нехватки памяти и не учитывает другие ограниченные ресурсы, такие как файловые дескрипторы. Начиная с версии 2.6 (и 2.5, с «импортом из будущего»), Python предлагает отличное решение с помощью подхода RAII («получение ресурсов - инициализация»), поддерживаемого оператором with
:
with open("foo.txt","rb") as f:
junk_block = "".join(f.read().split())
- это наименее «неопубликованный» способ, который обеспечит своевременное закрытие файла во всех совместимых версиях Python. Более сильная семантика делает это предпочтительным.
Помимо обеспечения правильной и разумной семантики ;-) не так уж много выбора между вложенными и плоскими версиями выражения, подобного этому. Учитывая задачу «удалить все пробелы из содержимого файла», я хотел бы попробовать альтернативные подходы, основанные на re
и методе строк .translate
(последний, особенно в Python 2. *, является часто это самый быстрый способ удалить все символы из определенного набора!), прежде чем остановиться на подходе «разделяй и возвращайся», если он окажется быстрее - но это действительно совсем другая проблема; -).