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

17 апреля 2013 г.

Хронометраж в Python -e

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

Так вот чтоб все это можно было сделать мы будем использовать модуль Time, который уже есть в инструкциях Python -a.

Для того чтоб все это работало мы создадим и сохраним на долго, утилиту timer.


# Файл mytimer.py

import time
reps = 1000
repslist = range(reps)

def timer(func, *pargs, **kargs):
    start = time.clock()
    for i in repslist:
        ret = func(*pargs, **kargs)
    elapsed = time.clock() - start
    return (elapsed, ret) 

Эта утилита способна вызывать любую функцию с любым количеством аргументов. Она фиксирует начальное время, вызывает функцию фиксированное число раз и вычитает время начала из времени конца.

  • Модуль time из стандартной библиотеки языка Python позволяет получить текущее  время  с  точностью,  зависящей  от  платформы.  В  Windows,  как утверждается, этот  модуль  позволяет получить  время  с точностью до  микросекунды и, следовательно, обеспечивает высокую точность. 
  • Вызов функции range был вынесен за пределы цикла измерения времени, благодаря чему время конструирования диапазона не накладывается на получаемые результаты в Python 2.6. В Python 3.0 функция range возвращает итератор, поэтому в версии 3.0 данный шаг можно считать излишним (хотя он и не мешает).
  • Счетчик reps  оформлен как глобальная переменная, благодаря чему  она 
может изменяться импортирующим модулем при необходимости: mytimer. 
reps = N.

Далее будет подробней...

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}

5 апреля 2013 г.

Имитация функций zip и map



В данном посте будет рассказано о применении итераций для имитации функций zip и map.


Мы уже видели, как встроенные функции zip и map позволяют объединять итерируемые объекты и отображать на них функции соответственно. При  вызове с  несколькими аргументами  функция  map отображает  заданную функцию на  элементы,  взятые  из каждой последовательности, практически тем же способом, каким функция zip объединяет их:

2 апреля 2013 г.

Генераторы - объекты итераторов однократного применения


Функции-генераторы, выражения-генераторы имеют собственные
итераторы и поддерживают возможность лишь однократного выполнения итераций.


Например, для выражения-генератора из предыдущего поста итератором является сам генератор (фактически вызов
метода iter генератора не выполняет никаких действий):
>>> G = (c * 4 for c in ‘SPAM’)
>>> iter(G) is G # Итератором генератора является сам генератор: 
True # G имеет метод __next__

28 ноября 2012 г.

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


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

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

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

20 октября 2012 г.

Итерируемые объекты


Новые итерируемые объекты

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


>>> zip(‘abc’, ‘xyz’) # Итерируемый объект в Python 3.0 (список в 2.6)
<zip object at 0x02E66710>

>>> list(zip(‘abc’, ‘xyz’))          # Принудительное создание списка 
[(‘a’, ‘x’), (‘b’, ‘y’), (‘c’, ‘z’)] # результатов для отображения в 3.0
-----------------------------------------------------------------

17 октября 2012 г.

Понять итераторы


Итераторы, основы

Итераторы мы будем рассматривать на примере работы с файлами, как один из типов данных.
Например вызывая метод readline, мы перемещаемся к следующей строке:

>>> f = open(‘script1.py’) # Прочитать 4 строки из файла сценария 
>>> f.readline()           # Метод readline загружает одну строку
‘import sys\n’
>>> f.readline()
‘print(sys.path)\n’
>>> f.readline()
‘x = 2\n’
>>> f.readline()

‘print(2 ** 33)\n’
>>> f.readline()           # Вернет пустую строку по достижении конца файла
‘’
-----------------------------------------------------------------


Далее тот же самый пример, только используем функцию __next__().


По достижении конца файла метод __next__ возбуждает встроенное исключение
StopIteration вместо того, чтобы возвращать пустую строку:


>>> f = open(‘script1.py’) # Метод __next__ загружает одну строку
>>> f.__next__()# и возбуждает исключение по достижении конца
                # файла
‘import sys\n’
>>> f.__next__()
‘print(sys.path)\n’
>>> f.__next__()
‘x = 2\n’
>>> f.__next__()
‘print(2 ** 33)\n’
>>> f.__next__()
Traceback (most recent call last):
  ...текст сообщения об ошибке опущен...
StopIteration

Подобные объекты в языке Python считаются итерируемыми.
-----------------------------------------------------------------