Ответ 1
Ваш код в порядке. Вы можете сделать это менее разборчивым, вводя ненужные сложные конструкции.
У меня есть 2 для циклов, и я хочу сделать это лучше, как понимание списка или лямбда или другое. как я могу достичь того же?
например:
filename = ['a.txt', 'b.txt', 'c.txt']
for files in filename:
for f in glob.glob(os.path.join(source_path, files)):
print f
... some processing...
Ваш код в порядке. Вы можете сделать это менее разборчивым, вводя ненужные сложные конструкции.
Вы можете сжать две петли for
в одно выражение , с новым циклом for
, чтобы извлечь имена файлов от него.
for f in (f_ for files in filename
for f_ in glob.glob(os.path.join(source_path, files))):
print f
# ...
Как сказал другой ответ, это не, это хуже, и вы не должны использовать его (я не уверенный, что достаточно внимания!). Намного сложнее понять, что происходит, и, вероятно, имеет небольшое преимущество в производительности (на самом деле, дополнительные слои косвенности означают, что он, вероятно, будет медленнее).
(* в основном эквивалентно пониманию списка, но лучше в таких ситуациях.)
Я бы сделал это, как показано ниже. Причина в том, что теперь вы можете отделить формирование шаблона поиска, поиск и профайл файла. Его легче расширить, если они не связаны друг с другом.
Если ваша система немного экзотична (например, распределенный сетевой диск), линия с glob и os.path.join является неприятной строкой. Хотя, как говорили другие, две петли в норме.
filename = ['a.txt', 'b.txt', 'c.txt']
searchPatterns = [os.path.join(source_path, files) for files in filename]
searchResults = [glob.glob(pattern) for pattern in searchPatterns]
fileListFlat = sum(searchResults,[])
for file in fileListFlat:
print file
Длительное выражение трудно читать, когда вам нужно сканировать вправо и назад. это еще хуже, когда есть много локальных переменных, лямбдов и понятий, просто разделенных паранами и запятыми, в нескольких строках. Используйте их только в том случае, если ваш код не становится длиннее и сложнее.
Для случая, я предпочитаю извлекать find
как компромисс. Но, как сказал верхний ответ, ваш код достаточно хорош.
from itertools import chain
find = lambda p: glob.glob(os.path.join(source_path, p))
for file in chain(map(find, filename)):
"""
=) I like one-level indentation here.
=( I don't know which file pattern is used currently,
unless I use longer expression...
"""