21. Сказать результат выполнения вложенного цикла по двум спискам и сложение элементов
Условие задачи Даны два списка a и b из предыдущей задачи. Необходимо сказать что будет результатом вывода print
for x in a:
for y in b:
print(x + y)
Как изменить код, чтобы для строковых была конкатенация, для int - сумма, а остальные варианты пропускались? Нашиши оптимизтрованный вариант.
Спойлеры к решению
Подсказки
- В Python оператор
+работает по-разному для разных типов. - Строка + строка даёт конкатенацию.
- Число + число даёт сумму.
- Строка + число вызовет
TypeError. - В исходном цикле программа остановится на первой несовместимой паре.
- Важно учитывать, что
boolявляется подклассомint, поэтомуTrueлучше отдельно исключить, если нужны именно целые числа.
Решение
Исходные списки:
a = ['a', 'b', 3, 'true', True, 1, 0]
b = ['0', 1, 3, 5, 7]
for x in a:
for y in b:
print(x + y)
Сначала будет выполнено:
'a' + '0'
Это корректная конкатенация строк, поэтому на экран выведется:
a0
После этого будет попытка выполнить:
'a' + 1
Это уже ошибка, потому что строку нельзя складывать с числом.
Итоговый вывод:
a0
TypeError: can only concatenate str (not "int") to str
Остальные пары обработаны не будут, потому что программа остановится на ошибке.
Оптимизированный вариант:
a = ['a', 'b', 3, 'true', True, 1, 0]
b = ['0', 1, 3, 5, 7]
a_strings = [x for x in a if type(x) is str]
b_strings = [x for x in b if type(x) is str]
a_ints = [x for x in a if type(x) is int]
b_ints = [x for x in b if type(x) is int]
for x in a_strings:
for y in b_strings:
print(x + y)
for x in a_ints:
for y in b_ints:
print(x + y)
Результат:
a0
b0
true0
4
6
8
10
2
4
6
8
1
3
5
7
Здесь сначала отдельно выбираются строки, отдельно целые числа. После этого программа обрабатывает только совместимые пары:
str + str
int + int
Все остальные варианты пропускаются. Используется type(x) is int, а не isinstance(x, int), чтобы True не считался числом. В Python bool наследуется от int, поэтому isinstance(True, int) вернул бы True.