До тех пор, пока вы находитесь внутри функции (не на верхнем уровне модуля), присвоение промежуточных результатов локальным баренам имеет существенно-незначительную стоимость (на верхнем уровне модуля, при присвоении «локальным» баренам подразумевается взбивание на dict- -модуля- и является значительно более дорогим, чем в функции; средство никогда не должно иметь «существенный» код на верхнем уровне модуля ... всегда фиксируйте существенный код внутри функции! -).
Общая философия Python включает в себя «квартира лучше, чем вложенная», и которая включает в себя сильно «вложенные» выражения. Глядя на ваш оригинальный пример ...
junk_block = "".join(open("foo.txt","rb").read().split())
Есть еще одна важная проблема: когда этот файл закрывается? В CPython сегодня вам не нужно беспокоиться - подсчет ссылок на практике гарантирует своевременное закрытие.Но большинство других реализаций Python (Jython на JVM, IronPython на .NET, PyPy на всех видах поддержки, pynie на Parrot, Unladen Swallow на LLVM, если и когда он созревает по опубликованной дорожной карте, ...) do не гарантия использование подсчета ссылок - многие стратегии сбора мусора могут быть задействованы со всеми другими преимуществами.
без каких-либо гарантий подсчета ссылок (и даже в CPython это всегда считается артефактом реализации, не части семантики языка!), То можно было бы исчерпать ресурсы, путем выполнения таких «открытым, но не близко» кода в жесткой петле - сбор мусора вызван нехваткой памяти и не рассматривает другие ограниченные ресурсы, такие как дескрипторы файлов. С 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. *, часто является самым быстрым способом чтобы удалить все символы из определенного набора!), прежде чем перейти к подходу «раскол и воссоединение», если он окажется более быстрым - но это действительно совсем другая проблема ;-).
Я единственный, кто думает, что первый пример более читабельен? – Kimvais
Нет, нет. – Smashery
Я бы сказал, что это то, что происходит от работы с большим количеством Python. Знакомые идиомы программирования всегда легко читаются. –