Содержание

    Генераторы списков

    Иногда возникает необходимость создать список с определенными значениями элементов. Например, предподсчитать квадраты чисел или получить список вида [1, 2, 3, 4, 5, 6, ...], или даже просто получить список заполненный нулями.

    Самый простой способ это с помощью метода append добавлять в конец списка нужные элементы, например:

    
    
    In [1]:
    l = list()
    
    for i in range(10):
        l.append(i ** 2)
        
    print(l)
    
    
    
    
    [0, 1, 4, 9, 16, 25, 36, 49, 64, 81]
    

    В Python существует более простой способ делать подобные вещи, он называется генератор списка. Для понимания его можно рассматривать как сокращение записи с for, но, формально, он сокращением не является, это просто отдельная конструкция. Например, код, который делает то же самое, что и выше:

    
    
    In [2]:
    l = [i ** 2 for i in range(10)]
    print(l)
    
    
    
    
    [0, 1, 4, 9, 16, 25, 36, 49, 64, 81]
    

    Как можно попытаться запомнить конструкцию:

    имя_списка = [элемент_добавляемый_в_конец for переменная in что-то_списокоподобное]

    
    
    In [3]:
    l = [0 for i in range(10)]  # список длины 10 из нулей
    print(l)
    
    l1 = [0] * 10  # списки можно как и строки умножать на число, но этот способ имеет свои особенности, лучше генератор
    print(l1)
    
    
    
    
    [0, 0, 0, 0, 0, 0, 0, 0, 0, 0]
    [0, 0, 0, 0, 0, 0, 0, 0, 0, 0]
    
    
    
    In [4]:
    l = [2 ** i for i in range(10)] # список длины 10 из степеней двоек
    print(l)
    
    
    
    
    [1, 2, 4, 8, 16, 32, 64, 128, 256, 512]
    

    На самом деле генераторы умеют "сокращать" еще более сложную запись. В конце генератора можно написать условие, при выполнении которого элементы будут добавляться. Например:

    
    
    In [5]:
    l = list()
    
    for i in range(10):
        if i % 2 == 1:
            l.append(i ** 2)
        
    print(l) # в l квадраты нечетных чисел
    
    
    
    
    [1, 9, 25, 49, 81]
    
    
    
    In [6]:
    l = [i ** 2 for i in range(10) if i % 2 == 1]
    print(l)
    
    
    
    
    [1, 9, 25, 49, 81]
    

    Так же можно делать со списками и строками:

    
    
    In [7]:
    a = [i for i in [1, 2, 3, 4, 5, 6] if i % 2 == 0]
    print(a)
    
    
    
    
    [2, 4, 6]
    
    
    
    In [8]:
    b = [c for c in "abcdef"]
    print(b)
    
    
    
    
    ['a', 'b', 'c', 'd', 'e', 'f']
    

    Часто генератор используют для преобразования типа элемента:

    
    
    In [9]:
    a = [1, 2, 3]
    b = [str(i) for i in a]
    print(b)
    
    
    
    
    ['1', '2', '3']
    
    
    
    In [10]:
    a = ['1', '2', '3']
    b = [int(x) for x in a]
    print(b)
    
    
    
    
    [1, 2, 3]