Сказать результат выполнения вложенного цикла по двум спискам и сложение элементов

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.