Сообщения

Сообщения за 2017

Итерируемый объект, итератор и генератор

У большинства популярных сейчас языков программирования, на уровне языка или стандартной библиотеки, реализованы многие виды коллекций и различные инструменты к ним. Видимо, поэтому, в среднем понимания работы структур данных, как реализованы итераторы и генераторы к ним, сильно страдает. На мой взгляд, самое главное - это фундаментальные знания, и тогда с изучением новых языков/фреймворков и прочими модными тенденциями, проблем не будет. Так как почти всегда, - это или забытое старое или несколько измененное. Что то координатно новое бывает крайне редко. Вообщем, решил написать базовые вещи про итераторы и генераторы на хабре, с примерами на python:  Итерируемый объект, итератор и генератор

Мемоизация и каррирование

Мемоизация (memoization) - это способ оптимизации при котором сохраняется результат выполнения функции и этот результат используется при следующем вызове. Берем рекурсивную реализацию нахождения числа Фибоначчи и смотрим время выполнения @clock def fib (n): if n < 2 : return n return fib(n - 2 ) + fib(n - 1 ) print ( 'fib(20) =' , fib( 20 )) [0.35938287s] fib(20) -> 6765 Время работы будет очень быстро расти при увеличении числа которое нужно найти, плюс возможна ошибка RecursionError. Для оптимизации подобного алгоритма хорошо подходит метод мемоизации, то есть сохранение и повторное использования ранние вычисленных значений. _fib_cache = { 1 : 1 , 2 : 1 } @clock def mem_fib (n): result = _fib_cache . get(n) if result is None : result = mem_fib(n - 2 ) + mem_fib(n - 1 ) _fib_cache[n] = result return result print ( 'mem_fib(200) =' , mem_fib( 200 )) [0.03125453s] mem_fib(200) -&g

Декораторы функций в Python

Для понимания декораторов нужно помнить что, функция в Python это объект и функция может быть определена в другой функции. Так же нужно понимания  Области видимости и замыкания в Python . Декоратор функций в общем виде это функция которая принимает функцию и возвращает функцию. Так же возможна реализация через класс и реализацию метода __call__ Главное свойство декораторов -то, что они выполняются сразу после определения декорируемой функции. registry = [] def register (func): print ( 'running register(%s)' % func) registry . append(func) return func @register def f1 (): print ( 'running f1()' ) def f2 (): print ( 'running f2()' ) f2 = register(f2) # эквивалентно @register def f3 (): print ( 'running f3()' ) def main (): print ( 'running main()' ) print ( 'registry -> ' , registry) f1() f2() f3() if __name__ == '__main__' : main() Функция regi

Область видимости и замыкания в Python

Прежде чем переменной можно будет воспользоваться, ей необходимо присвоить значения. Область видимости переменной определяется местом, где ей было присвоено значение. Правило LEGB L ocal локальная область функции E nclosing область внешней функции G lobal глобальное пространство B uilt-in встроенном (модуль builtis) Если не указаны инструкции, то поиск переменных по пространствам имен происходит с низу верх local->enclosing->global->built-in x = 10 print ( 'Global x =' , x) def fun_enclosing (): print ( 'Enclosing x =' , x) def fun_local (): print ( 'Local x =' , x) fun_local() fun_enclosing() Global x = 10 Enclosing x = 10 Local x = 10 Любое присвоение переменной в функции создает новую локальную переменную x = 10 print ( 'Global x =' , x) def fun_enclosing (): x = 20 # создания новой переменной в пространстве имен fun_enclosing print ( 'Enclosing x =' , x) de

UnicodeDecodeError при pip install в rus Windows

Если при установки пакета возникает UnicodeDecodeError: 'utf-8' codec can't decode byte 0xd1 in position 3: invalid continuation byte Находим файл lib\site-packages\pip\compat\__init__.py Ориентировочно на 71 строке находим функцию console_to_str(s) В консоли вводим команду chcp . К примеру она показала  866 В функции console_to_str(s) меняем return s.decode(' utf_8 ') на return s.decode(' 866 ')

Кратко про SQLAlchemy Core

SQLAlchemy Engine это слой абстракции над DB-API. Он содержит DB-API драйвера для разных СУБД, их можно указать в строке подключения. Engine.execute() и Engine.connect() два основных метода. Так же у него есть свой пул соединений. create_engine() - фабричная функция для создания Engine. Metadata это логическая структура базы данных. Она содержит список таблиц(Table), их отношения и другие объекты. Table абстракция таблицы. Содержит колонки(Column) и другие свойства. Таким образом можно иметь одновременно несколько engine с разными драйверами и коннектами, разные metadata, и совместно их использовать. примеры на github from sqlalchemy import MetaData, Table , Column , Integer , Numeric , String, DateTime from datetime import datetime metadata = MetaData() users = Table ( 'users' , metadata, Column ( 'user_id' , Integer (), primary_key = True ), Column ( 'username' , String( 15 ), nullable = False , unique = True ),

Управления доступом к атрибутам в Python

Фактически это конспект 37 главы книги Марка Лутца "Изучаем Python" Код на  github Управления доступом к атрибутам в Python может осуществляться несколькими способами: __getattr__ __set__ __getattribute__ __delete__ property дескриптор property и дескрипторы применяются к отдельным атрибутам. Свойства attribute = property(fget, fset, fdel, doc) Все аргументы по умолчанию None, при обращение приводят к исключению Примеры # пример использования property # attribute = property(fget, fset, fdel, doc) class Person : def __init__ ( self , name): self . _name = name def get_name ( self ): return self . _name def set_name ( self , name): self . _name = name def del_name ( self ): print ( 'del name' , self . name) del self . _name name = property (get_name, set_name, del_name) class SubPerson (Person): pass bob = Person( 'bob' ) print (bob . name) bob . name = &