Избегайте повторения функций в условных

Я хочу минимизировать следующий небольшой блок кода:

if jwinkler.get_jaro_distance(text,l1) >= 0.90 or jwinkler.get_jaro_distance(text, l2) >= 0.90 or jwinkler.get_jaro_distance(text,l3) >= 0.90:
    print('passed')

На самом деле, как вы увидите, функция всегда одинакова, меняется только второй параметр (l1, l2, l3). Мне пришло в голову сделать это:

if True in [jwinkler.get_jaro_distance(text,x) >= 0.90 for x in [l1,l2,l3]]:
    print('passed')

, который работает , но это не кажется Pythonic . Есть ли другой способ сделать это?

0
задан 29.11.2019, 19:39
2 ответа

Недели назад я pasГі что-то похожее на то, что никто не сумел давать мне ответ mГЎs, что та, которую ты сами даешь, asГ - что я предполагаю, что habrГЎ, что соответствовать, конечно гораздо лучше, что первая opciГіn.

0
ответ дан 01.12.2019, 10:35
  • 1
    Это не ответ, а комментарий. Пожалуйста bó rrala и convié rtela в комментарии в вопрос. – abulafia 30.11.2019, 13:36

Форма pythГіnica serГ - в следующую:

if any(jwinkler.get_jaro_distance(text,x) >= 0.90 for x in [l1,l2,l3]):
    print('passed')

ExplicaciГіn

  • any() ждет iterable как parГЎmetro. В этом случае его перемещают одна expresiГіn порождающая (он наблюдает, что я не поместил ее между квадратными скобками, так как, того, чтобы сделать раньше одной serГ - comprensiГіn из списков )
  • any(), он извлекает элементы iterable и как только он находит один True, он возвращает True.

Преимуществ на тебе soluciГіn

  • предотвращает создавать промежуточный список, следовательно он mГЎs работоспособно в памяти. Одной expresiГіn порождающая lazy , он не создает новый элемент до тех пор, пока мы не просим это у него повторяя на ней. Взамен одна comprensiГіn списков верьте во все элементы и возврати список, который содержит их.
  • предотвращает оценивать последующие элементы, если находится True готовый. Таким образом он ведет себя как or в одной expresiГіn booleana. Этого знает как короткое замыкание lГіgico . Следовательно смоги быть mГЎs работоспособно tambiГ©n во времени ejecuciГіn (если только все элементы не будут False, в случае которых нужно оценивать все их так или иначе).

PD: TambiГ©n у тебя есть all(), который сходный с any(), но sГіlo возврати True, если всех элементов True. В этом случае короткое замыкание lГіgico случается как только находится один False, так как в этом случае уже он может возвращать False, не оценивая оставшейся части.

0
ответ дан 01.12.2019, 10:35