В нескольких случаях я хотел бы использовать синтаксис python для коротких замыканий в списках или генераторных выражений.Рекомендации по организации короткого замыкания
Вот простой список понимание, и эквивалентный цикл в Python:
my_list = [1, 2, 3, 'potato', 4, 5]
[x for x in my_list if x != 'potato']
result = []
for element in my_list:
if element != 'potato':
result.append(element)
Там не поддерживают на языке для понимания которые короткое замыкание. Предлагаемый синтаксис и эквивалент для цикла в Python:
[x for x in my_list while x != 'potato']
# --> [1, 2, 3]
result = []
for element in my_list:
if element != 'potato':
result.append(element)
else:
break
Он должен работать с произвольными итерируемыми, в том числе бесконечных последовательностей, и быть удлинению к генератору синтаксиса выражений. Я отдаю себе отчет в list(itertools.takewhile(lambda x: x != 'potato'), my_list)
в качестве опции, но:
- это не особенно вещий - не читаемыми, как некоторое время осмыслению
- это, вероятно, не может быть столь же эффективным или быстро, как постижение CPython
- его требует дополнительного шага для преобразования вывода, тогда как это может быть поставлено в понимание напрямую, например
[x.lower() for x in mylist]
- даже original author doesn't seem to like it much.
Мой вопрос в том, есть ли теоретическая морщина о том, почему не рекомендуется распространять грамматику на этот прецедент, или это просто невозможно, потому что python dev считает, что это было бы редко полезно? Это похоже на простое дополнение к языку и полезную функцию, но я, вероятно, не замечаю некоторых скрытых тонкостей или осложнений.
'result = []; any (x == 'potato' или result.append (x) для x в my_list) '. Хм ... нет, я думаю, что это хуже, чем takewhile :) –
Я думаю, что вы с большей вероятностью получите хороший ответ в [python-dev] (http://mail.python.org/mailman/listinfo/python- dev) список рассылки. – Elazar
@gnibbler: вы только что реализовали 'filterfalse', OP хочет остановить все добавления после того, как будет найден первый« картофель ». Попробуйте: 'found = []; result = []; any (x == 'potato' и not found.append (x) или result.append (x), если не найдено else None для x в my_list) ' – PaulMcG