Как избежать этого дублирования кода с помощью цикла while? - PullRequest
0 голосов
/ 27 ноября 2018

Я хочу найти первое имя файла myfile????.txt, которое еще не существует (???? - это число).Это работает:

import os
i = 0
f = 'myfile%04i.txt' % i
while os.path.exists(f):
    i += 1
    f = 'myfile%04i.txt' % i

, но мне не нравится дублирование кода f = ....

Есть ли питонический способ избежать дублирования кода в этом whileloop?

NB: я опубликовал полудовлетворительное решение, используя идиому do/while, как упоминалось в основном ответе Эмулировать цикл do-while в Python? , но я все еще задаюсь вопросом, есть ли лучший способ для этого конкретного случая (таким образом, это не обман этого вопроса).

Ответы [ 5 ]

0 голосов
/ 27 ноября 2018

Здесь не нужно следовать парадигме while, вложенное выражение генератора с next() работает:

import os
from itertools import count
f = next(f for f in ('myfile%04i.txt' % i for i in count()) if not os.path.exists(f))
print(f)
0 голосов
/ 27 ноября 2018

Вы можете сделать:

import os
from itertools import count

cursor = count()
it = iter((path for path in map(lambda x: 'myfile%04i.txt' % x, cursor) if not os.path.exists(path)))
first = next(it, None)

if first:
    print(first)

Вывод

myfile0000.txt
0 голосов
/ 27 ноября 2018

Я почти нашел ответ , в то время как писал конец вопроса.После нескольких модификаций он работает:

import os
i = 0
while True:
    f = 'myfile%04i.txt' % i
    if not os.path.exists(f):
        break
    i += 1
print f

Тем не менее, мне интересно, есть ли более питонический способ, может быть, с итератором, генератором, next(...) или чем-то подобным.

0 голосов
/ 27 ноября 2018

Это слишком просто?

import os
f = 'myfile0000.txt'
while os.path.exists(f):
    i += 1
    f = 'myfile%04i.txt' % i
0 голосов
/ 27 ноября 2018

Избавьтесь от переменной f.

import os

i = 0
while os.path.exists('myfile%04i.txt' % i):
    i += 1
...