Показаны сообщения с ярлыком Генераторы списков. Показать все сообщения
Показаны сообщения с ярлыком Генераторы списков. Показать все сообщения

15 апреля 2013 г.

Понимание генераторов множеств и словарей

Сейчас 2 часа  ночи, я ничего не понимаю, что относится к программированию на Python, но пишу этот пост... надеюсь кому то он поможет.


>>> {x * x for x in range(10)}         # Генератор
{0, 1, 4, 81, 64, 9, 16, 49, 25, 36}

>>> set(x * x for x in range(10)) # Генератор и конструктор типа
{0, 1, 4, 81, 64, 9, 16, 49, 25, 36}

>>> {x: x * x for x in range(10)}
{0: 0, 1: 1, 2: 4, 3: 9, 4: 16, 5: 25, 6: 36, 7: 49, 8: 64, 9: 81}

>>> dict((x, x * x) for x in range(10))
{0: 0, 1: 1, 2: 4, 3: 9, 4: 16, 5: 25, 6: 36, 7: 49, 8: 64, 9: 81}

11 апреля 2013 г.

Создание собственных версий функций zip(...) и map(None, ...)


В предыдущих постах мы создавали якобы свои функции zip и map . Но это не совсем то, что нам нужно, так как создавая одну из них мы использовали вторую - которая встроена в язык программирования Python.

Поэтому в этом посте мы это полностью исправим. Кстати в разных версиях, map работает по разному, вот некоторые примеры для Python 2.x и Python 3.0.


C:\misc> c:\python26\python
>>> map(None, [1, 2, 3], [2, 3, 4, 5])
[(1, 2), (2, 3), (3, 4), (None, 5)]
>>> map(None, ‘abc’, ‘xyz123’)
[(‘a’, ‘x’), (‘b’, ‘y’), (‘c’, ‘z’), (None, ‘1’), (None, ‘2’), (None, ‘3’)]

3 декабря 2012 г.

Send и next


Расширенный протокол функций-генераторов: send и next

Метод send выполняет переход к следующему элементу и обеспечивает для вызывающей программы способ взаимодействия с генератором, влияя на его работу.

При использовании расширенного протокола значения передаются генератору G вызовом метода G.send(value). После этого выражение yield возвращает значение, полученное от метода send. Когда вызывается обычный метод G.__next__() (или выполняется эквивалентный вызов next(G)), выражение yield возвращает None.
Например:

>>> def gen():
...     for i in range(10):
...         X = yield i
...         print(X)
...
>>> G = gen()
>>> next(G)    # Чтобы запустить генератор, необходимо сначала вызвать next()
0
>>> G.send(77) # Переход к следующему значению 
77             # и передача значения выражению yield
1
>>> G.send(88)
88
2
>>> next(G)    # next() и X.__next__() передают значение None
None
3

Другое


Пост похожий на 
полезные функции, но все так не то...

Добавление проверок и вложенных циклов (функция filter):
Добавив после цикла for
оператор if получим реализацию логики выбора. Генераторы списков с оператором if можно  представить  как аналог  встроенной функции filter – они пропускают элементы, для которых условное выражение в операторе if возвращает ложь.

Две версии реализации выбора четных чисел в диапазоне от
0 до  4 –  с помощью генератора списка и  с помощью функции filter:
№1
>>> [x for x in range(5) if x % 2 == 0]
[0, 2, 4]
№2 (filter+lambda) 
>>> list(filter((lambda x: x % 2 == 0), range(5)))
[0, 2, 4]

Добиваемся эффекта действия функций filter и map в единственном выражении:
>>> list(map((lambda x: x**2), filter((lambda x: x % 2 == 0), range(10))))
[0, 4, 16, 36, 64]

28 ноября 2012 г.

Генераторы и итераторы


Генераторы и итераторы 
все таки без продолжения никак

Генераторы списков, будучи по своей природе циклами for, очень тесно связаны с инструментами функционального программирования (такими как функции map и filter), поэтому мы снова вернемся к ним.

Генераторы списков и функция map:
Встроенная функция ord в языке Python возвращает целочисленный код ASCII единственного символа (обратной к ней является встроенная функция chr – она возвращает символ, соответствующий коду ASCII):
>>> ord(‘s’)
115

18 октября 2012 г.

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


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

Генераторы списков представляют  один из самых заметных инструментов, где используется протокол итераций. Генераторы списков, как это не странно, предназначены для удобной обработки списков, к которой можно отнести и создание новых списков, и модификацию существующих.
Использование генераторов списков  для работы с файлами:
У объекта файла имеется метод readlines, который загружает файл целиком в список строк
>>> f = open(‘script1.py’)
>>> lines = f.readlines()
>>> lines
[‘import sys\n’, ‘print(sys.path)\n’, ‘x = 2\n’, ‘print(2 ** 33)\n’]


Этот  фрагмент работает,  но все  строки в списке  оканчиваются символом новой строки (\n).