Есть ли возможность использовать else в сокращённой форме цикла for?
1 for x in input() if x in 'aeiou'
вот сюда нужно добавить else
я сделал обычным циклом
for x in text.lower():
if x in 'aeiouy':
vowels += 1
else:
consonants += 1
Мне интересно, нельзя ли использовать укороченный вариант. Попробовал вот так:
vowels = sum(1 if x in 'aeiou' else consonants += 1) for x in input()
Выдаёт ошибку invalid syntax.
Ответы (2 шт):
В генераторах последовательностей если вы пишите if после цикла, то он служит фильтром для выходной последовательности, и писать там else нельзя. Да и что бы оно там означало, если if управляет по генератором по True/False.
a = [x for x in [0, 1, 2, 3] if X > 1]
# на выходе a = [2, 3]
Если if стоит до цикла, то он управляет значением, которое попадёт в выходную последовательность, и else там быть обязано (т.к. в последовательность что-то же должно попасть.
a = ["A" if x > 2 else "B" for x in [0, 1, 2, 3] ]
# на выходе a = ["B", "B", "B", "A"]
И можно оба варианта комбинировать.
a = ["A" if x > 2 else "B" for x in [0, 1, 2, 3] if x > 1]
# на выходе a = ["B", "A"]
Можно, конечно, из академического интереса изгольнуться и сделать вычисления нескольких переменных в одной последовательность. Но у такого кода читаемость сильно хромает.
vowels, consonants = map(sum, (zip(*((1,0) if x in 'aeiouy' else (0,1) for x in input()))))
как метко выразился @GrAnd в комментариях, можно "испитониться" и засунуть вычисления обеих переменных в одну строчку, еще таким способом:
text = 'my test text'
v = c = 0
[(v:= v+1) if i in 'aeiouy' else (c:= c+1) for i in text.lower()]
print(f'{v=}, {c=}') # v=3, c=9
справедливости ради, надо заметить, что ваш код (как и этот) считает не количество гласных и согласных в тексте, а количество гласных и НЕгласных.