Как понимать такое использование for и if в Python?
Cобствено, непонятная строка:
l = [i for i in A[1:] if i <= m]
Что делает i for i в срезе массива и как работает if?
Как я понимаю для каждого i в срезе массива A[1:len(A)-1] проверяется условие и при истине оно возвращает элемент в список.
Код целиком, пример бинарного поиска из книги «Грокаем Алгоритмы», ошибок не кидает:
def qsort(A):
if len(A) < 2: return A
pivot = A[0]
l = [i for i in A[1:] if i <= pivot] # else pass?
r = [i for i in A[1:] if i > pivot]
return qsort(l) + [pivot] + qsort(r)
Ответы (1 шт):
Эта конструкция называется List Comprehension
Аналогичные генераторы есть для tuple, set, map:
setOfEven = { x for x in range(1000) if x%2 == 0 }
dictOddSquares = { x : x*x for x in range(1000) if x%2 == 1 }
УТОЧНЕНИЕ
Про tuple я был не прав, виноват. В Python можно написать вот такой текст:
t = ( x*x for x in range(10) )
Это выглядит как List Comprehension, только для tuple, поэтому я всегда это воспринимал именно как tuple comprehension. Но на самом деле это иная конструкция, которая называется Generator Expression
Присваивание выше создаёт генератор, эквивалентный генератору
def _gen():
for x in range(10):
yield x*x
t = _gen()
только в одну строчку. Как будто tuple comprehension выглядит присваивание
t = tuple( x*x for x in range(10) )
но на самом деле это вызов конструктора tuple c генератором x*x for x in range(10) в качестве аргумента.