1

Тема: Дії над рядком (str)

Знайшов такий код на Git

raw_data = input()
data = (''.join([char for char in raw_data if char in('(){}[]<>')]))

Він форматує заданий текст так, що в рядку залишаються тільки символи дужок.
Я розумію, що тут просто циклом проходяться по рядку і вибирають тільки задані символи, а потім об'єднують все це в рядок через join.
Але я не розумію, що робить char перед for. Поясніть будь ласка.
P's. Я щось думаю, що це те що виводить цикл якщо умова if правдива, але не впевнений в цьому.

2 Востаннє редагувалося koala (05.06.2019 14:45:23)

Re: Дії над рядком (str)

Це генераторний вираз, нативний спосіб у Python робити map/filter.
Є стандартна ситуація: зі списку (чи взагалі чогось ітерабельного) треба зробити інший список, наприклад, із подвоєнням парних. Звичайний код виглядатиме так:

source = [1,2,3]
target = []
for s in source:
  if s%2==0:
    target.append(2*s)

Це можна скоротити до

source = [1,2,3]
target = [2*s for s in source if s%2==0]

Сенс зрозумілий, довжина скоротилася удвічі. Додатковий бонус - можна не перетворювати результат на список, тоді цикл виконається лише в той момент, коли буде потрібним:

source = randrange(100) for _ in range(1000000)
target = (2*s for s in source)
#ми можемо передати target в іншу функцію, цикл ще не буде викликано
second_target = (t for t in target if t%2==0)
print(len(list(second_target))) #і тільки тут буде виконано всі дії в один цикл
Подякували: Eff1c, leofun012

3

Re: Дії над рядком (str)

І так, ваш код можна записати

data = ''.join(filter(lambda c:c in '(){}[]<>',raw_data))

але з генераторним виразом він виразніший.

Подякували: Eff1c, leofun012