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

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}

13 апреля 2013 г.

Краткая сводка по синтаксису генераторов в Python 3.0

В данном посте, мы попытаемся показать все разновидности генераторов



  • В случае с множествами {1, 3, 2} эквивалентна вызову set([1, 3, 2]), а новый синтаксис генераторов множеств {f(x) for x in S if P(x)}, напоминает синтаксис выражений-генераторов set(f(x) for x in S if P(x)), где f(x) – произвольное выражение.

  • В случае со словарями новая конструкция генераторов словарей {key: val for (key, val) in zip(keys, vals)} действует точно так же, как dict(zip(keys, vals)), and {x: f(x) for x in items}, и напоминает выражение-генератор dict((x, f(x)) for x in items).
Ниже показана краткая сводка по всем альтернативным генераторам в версии Python 3.0.  Последние  две конструкции являются новыми  и  недоступны  в версии Python 2.6:
>>> [x * x for x in range(10)]       # Генератор списков:
                                     # конструирует список
[0, 1, 4, 9, 16, 25, 36, 49, 64, 81] # подобно вызову 
                                     # list(generator expr)
>>> (x * x for x in range(10))       # Выражение-генератор: 
                                     # воспроизводит 
<generator object at 0x009E7328>     # элементы. Скобки часто
                                     # необязательны
>>> {x * x for x in range(10)}       # Генератор множеств,
                                     # новинка в Python 3.0
{0, 1, 4, 81, 64, 9, 16, 49, 25, 36} # {x, y} – литерал множества 
                                     # в Python 3.0
>>> {x: x * x for x in range(10)}    # Генератор словарей,
                                     # новинка в Python 3.0
{0: 0, 1: 1, 2: 4, 3: 9, 4: 16, 5: 25, 6: 36, 7: 49, 8: 64, 9: 81}

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]

9 сентября 2012 г.

Cписки, углубляемся

Списки в действии:

Операция - Интерпретация
L = []  - Пустой список
L = [0, 1, 2, 3]  - Четыре элемента с индексами 0..3
L = [‘abc’, [‘def’, ghi’]]  - Вложенные списки
L = list(‘spam’) - Создание списка из итерируемого объекта.
L = list(range(-4, 4)) - Создание списка из непрерывной последовательности   целых чисел


31 августа 2012 г.

Списки, основа


Списки 
В данном посте будет коротко описаны основы списков.

Список=["первый объект","второй объект",3,4,"5й объект"]
>>>Список
['первый объект','второй объект',3,4,'5й объект']


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