Видео — первая часть, вторая часть и презентация.
Автор: Andrew Svetlov
Автор: Andrew Svetlov
Все начинается с объявления класса:
class A(object):
field = 12
def method(self, param):
return param + self.field
class A(object):
field = 12
def method(self, param):
return param + self.field
Имеющие опыт программирования на компилируемых языках могут увидеть здесь декларативную конструкцию, но это только обман зрения. В python всего две декларативные конструкции — объявление кодировки файла и импорт синтаксических конструкций «из будущего». Все остальное — исполняемое. Написанное объявление это синтаксический сахар для следующего:
txt_code = """
field = 12
def method(self, param):
return param + self.field
"""
class_body = {}
compiled_code = compile(txt_code, __file__, "exec")
eval(compiled_code, globals(), class_body)
A = type("A", (object,), class_body)
txt_code = """
field = 12
def method(self, param):
return param + self.field
"""
class_body = {}
compiled_code = compile(txt_code, __file__, "exec")
eval(compiled_code, globals(), class_body)
A = type("A", (object,), class_body)
Оба этих способа создать класс A совершенно эквивалентны. Окончательно убедиться в том, что объявление класса исполнимо можно посмотрев вот на это:
def this_is_not_cplusplus(some_base_class, num_methods):
class Result(some_base_class):
x = some_base_class()
for pos in range(num_methods):
# добавим функцию в locals - она попадает в тело
# класса Result и станет его методом
locals()['method_' + str(pos)] =
lambda self, m : m + num_methods
return Result
class_with_10_methods = this_is_not_cplusplus(object, 10)
class_with_20_methods = this_is_not_cplusplus(
class_with_10_methods, 20)
print class_with_10_methods().method_3(2) # напечатает 12
print class_with_20_methods().method_13(2) # напечатает 22
def this_is_not_cplusplus(some_base_class, num_methods):
class Result(some_base_class):
x = some_base_class()
for pos in range(num_methods):
# добавим функцию в locals - она попадает в тело
# класса Result и станет его методом
locals()['method_' + str(pos)] =
lambda self, m : m + num_methods
return Result
class_with_10_methods = this_is_not_cplusplus(object, 10)
class_with_20_methods = this_is_not_cplusplus(
class_with_10_methods, 20)
print class_with_10_methods().method_3(2) # напечатает 12
print class_with_20_methods().method_13(2) # напечатает 22
Функция this_is_not_cplusplus создает новый класс каждый раз, когда мы ее вызываем, используя переданный тип в качестве базового и создавая в н
В этой статье я попытаюсь описать процесс создания готового python окружения и работу с пакетами на пользовательском уровне. Статья расcчитана на новичков (в основном для студентов, слушающих мои курсы).
Задачи обычно возникающие при установки питона и его пакетов:
Кроме этого я пробегусь по этим полезным вещам:
Если вы используете linux, то лучше использовать python идущий в пакетах — как правило это немного измененный cpython. Для windows можно выбирать между стандартным питоном и дистрибутивом от Active State. Последний содержит расширенную документацию и некоторые дополнительные библиотеки. Мы не будем рассматривать PyPy/Stackless/etc — ограничимся только CPython. Дальше нужно сделать выбор между двумя ветками — 3.2/3.3 и 2.7. Пока что с 2.7 у вас будет меньше проблем, но третья версия по поддержке уже подбирается достаточно близко. x86 и amd64 версии выбираем по вкусу. Установка и под windows и совершенно стандартна и не должна вызывать проблем. В linux питон уже почти 100% установлен.
Динамический характер языка делает написание функциональных IDE достаточно сложным, а высокая компактность кода и pythonic подход заметно уменьшает в них необходимость. Так что не сложные проекты можно делать в продвинутых текстовых редакторах — [notepad++], sublime text (или vim/emacs). Хотя новичкам IDE будут оказывать заметную помошь встроенной подсказкой и каким ни каким статическим анализом. Из IDE я бы выделил eclipse + pydev и платные PyCharm и KomodoIDE. Также есть Python tools for VS, которые добавляет поддержку cpython и ironpython в VS2010/VS2012.
Я бы советовал выбирать между sublime text и eclipse + pydev.
Пакеты/модули в python это файлы с расширениями py/pyc/pyo/(pyd или so), или директории с такими файлами. Также весь пакет может быть в одном архиве (только если пакет не содержит pyd/so файлы). По умолчанию пакеты устанавливаются в системную папку — PYTHON_ROOTlibsite-packages для windows и /usr/local/lib/pythonXX/dist-packages для ubuntu (XX — версия питона, PYTHON_ROOT — корневая папка установки python, как правило С:PythonXX)
Если вы используете linux, то можно использовать пакеты из дистрибутива — в Ubuntu/Fedora есть практически все. Иначе искать пакеты в основном стоит на pypi или с помощью google. Пакеты могут быть в трех основных форматах: архив, exe/msi, egg.
Архив нужно распаковать, в корневой папке должен быть файл setup.py. Если его там нет, то можно просто скопировать содержимое архива в директорию с пакетами. Если setup.py есть, то нужно выполнить python setup.py install. При этом следует использовать тот интерпретатор питона, в который вы хотите установить пакет. Если пакет не предоставляет модулей написанных на С/С++, то установка должна пройти без особенных проблем. Иначе python будет пытаться собрать компилируемые расширения. В linux такой процесс проходит чаще всего безболезненно (максимум требуется установка пакетов с заголовочными файлами для для используемых C библиотек), а вот в windows путь компиляции может быть достаточно трудным.
При установке в windows проще использовать уже собранный exe/msi файл. Для большинства пакетов они доступны на pypi или на сайте библиотеки, также много бинарных пакетов можно найти на pythonlibs. При загрузке обратите внимание на архитектуру и версию python. Для установки такие пакеты нужно запустить. Библиотеки не содержащие компилируемого кода уставливаются без проблем на обеих системах.
egg это формат пакетов одного из пакетные менеджеров питона — setuptools. Грубо говоря это zip архив с дополнительной информацией о пакете и его зависимостях. Более новой и активно развиваемой альтернативой setuptools является pip. pip использует код setuptools(или distribute) и не поддерживает egg. Оба этих менеджера умеют находить пакеты по имени на pypi, по URL и локально. Поддерживаются разнообразные форматы архивов и автоматическая установка зависимостей. pip умеет деинсталлировать пакеты и поддерживает установку из svn/git/mercurial.
Установка pip — www.pip-installer.org/en/latest/installing.html
Установка setuptools
Оба этих менеджера предоставляют команду easy_install, pip кроме этого предоставляет команду pip.
Использование (примеры команд без их вывода):
# pip install pylint # установим pylint
# easy_install install -U pylint # обновить пакет
# pip install --upgrade simplejson
# pip uninstall simplejson # удалить
# pip install http://my.package.repo/SomePackage-1.0.4.zip
# pip install git+https://github.com/simplejson/simplejson.git
# pip install svn+svn://svn.zope.org/repos/main/zope.interface/trunk/
# pip install pylint # установим pylint
# easy_install install -U pylint # обновить пакет
# pip install --upgrade simplejson
# pip uninstall simplejson # удалить
# pip install http://my.package.repo/SomePackage-1.0.4.zip
# pip install git+https://github.com/simplejson/simplejson.git
# pip install svn+svn://svn.zope.org/repos/main/zope.interface/trunk/
virtualenv позволяет делать на одной машине несколько независимых инсталляций python, каждая из которых имеет свой интерпретатор, набор настроек и библиотек. Некоторые из таких окружений могут использовать системную папку с дополнительными пакетами. Кроме этого virtualenv позволяет устанавливать питон и пакеты пользователям без прав root.
$ sudo pip install virtualenv # или sudo apt-get install python-virtualenv
$ virtualenv --distribute ENV_NAME # или python virtualenv.py --distribute ENV_NAME—distribute заставить virtualenv установить distribute вместо setuptools.
$ sudo pip install virtualenv # или sudo apt-get install python-virtualenv
$ virtualenv --distribute ENV_NAME # или python virtualenv.py --distribute ENV_NAME—distribute заставить virtualenv установить distribute вместо setuptools.
Эта команда создаст папку ENV_NAME внутри которой будет интерпретатор python ENV_NAME/bin/python и каталог для пакетов ENV_NAME/lib/pythonX.X/site-packages. ENV_NAME/bin/python будет настроен на поиск пакетов в ENV_NAME/lib/pythonX.X/site-packages. Также virtualenv устанавливает в новое окружение pip. Что-бы активировать это окружений нужно исполнить скрипт activate.
$ source ENV_NAME/bin/activate
> ENV_NAMEScriptsactivate # для windows
$ source ENV_NAME/bin/activate
> ENV_NAMEScriptsactivate # для windows
Теперь команда python будет приводить к запуску питона из ENV_NAME/bin/python, то же относится и к pip. После окончания работы нужно выполнить deactivate. virtualenv включили в стандартную библиотеку начиная с python3.3
Линтами называют средства статического анализа по имени первой такой утилиты, которая находила странно написанные участки C кода, потенциально содержащие ошибки. Из-за динамического характера python сделать для него очень хороший линт невозможно, а даже просто хороший очень сложно. Ошибки при которых С программа даже не скомпилируется могут легко загнать в угол python линты. Но тем не менее значительную часть (а у начинающих — практически все) ошибок/опечаток они найдут.
Три основных lint’а для python это pylint, pychecker и pyflakes. Из них pylint, наверное, наиболее сообразительный. Кроме этого он имеет большое количество настроек, которые позволяют изменить особенности проверок. Также pylint проверяет стиль кода, используя шаблоны из конфигурационного файла и собирает полезную статистику. Плюс большая часть IDE и даже sublime имеют интеграцию с pylint.
По умолчанию pylint слишком требовательный так что начинать его использование стоит с подстройки конфига под себя, кроме этого иногда он дает ложные срабатывания.
Как более легкую альтернативу можно использовать pep8, проверяющий код на соответствие основному python стандарту кодирования.
Чуть подробнее о установке ipython. Под linux с правами root все просто (ubuntu):
$ sudo apt-get install ipython ipython-doc ipython-notebook ipython-qtconsole python-zmq
$ sudo apt-get install ipython ipython-doc ipython-notebook ipython-qtconsole python-zmq
или
$ sudo apt-get install --install-suggests ipython
$ sudo apt-get install --install-suggests ipython
ipython готов к запуску —
$ ipython qtconsole # GUI консоль
$ ipython notebook # Web интерфейс
$ ipython # консольный интерфейс
$ ipython qtconsole # GUI консоль
$ ipython notebook # Web интерфейс
$ ipython # консольный интерфейс
Под windows все не так просто — нужно загрузить все пакеты и зависимости вручную и установить их. pip поможет не сильно, поскольку большая часть пакетов С расширения с внешними зависимости и собирать их будет лишней сложностью. Зависимости ipython (поскольку мы не будем использовать pip то их придется выяснять и устанавливать самостоятельно) можно определить двумя способами — найти в документации по установке или пытаться запускать ipython и смотреть на ошибки импорта. Из документации находим зависимости:
Бинарные версии всех этих пакетов есть в pythonlibs. Загружаем и ставим в любом порядке. После чего выбираем из:
> С:Python2.7Scriptsipython.bat qtconsole # GUI консоль
> С:Python2.7Scriptsipython.bat notebook # Web интерфейс
> С:Python2.7Scriptsipython.bat # консольный интерфейс
> С:Python2.7Scriptsipython.bat qtconsole # GUI консоль
> С:Python2.7Scriptsipython.bat notebook # Web интерфейс
> С:Python2.7Scriptsipython.bat # консольный интерфейс
Если поставить питон совсем никак нельзя, то можно воспользоваться web консолью на указанном сайте. После регистрации можно бесплатно запустить 2 python/ipython консоли в браузере и пробовать python без установки.
Ссылки:
pypi.python.org/pypi/virtualenv
www.python.org/download
www.activestate.com/activepython/downloads
pypi.python.org/pypi
www.lfd.uci.edu/~gohlke/pythonlibs
www.pip-installer.org/en/latest/index.html
ipython.org/ipython-doc/stable/install/install.html
pychecker.sourceforge.net
pytools.codeplex.com
launchpad.net/pyflakes
www.python.org/dev/peps/pep-0008
pypi.python.org/pypi/pylint
pypi.python.org/pypi/pep8
www.jetbrains.com/pycharm
pydev.org
pypi.python.org/pypi/setuptools
www.sublimetext.com
www.activestate.com/komodo-ide
pythonanywhere.com
Исходники этого и других постов со скриптами лежат тут — github.com/koder-ua. При использовании их, пожалуйста, ссылайтесь на koder-ua.blogspot.com.
Автор: konstantin danilov
Общий вид записи функций в питоне:
Автор: Бихтсэ
Дата публикации: 2012-09-14T01:51:00.000-07:00
Что приходит в голову при словах «числа в Питоне?»
int и float. Если речь идет о Python 2 — еще и упразднённый long. Наверное, вспомнится очень мало где используемый complex.
Я же хочу рассказать о Decimal и Fraction.
Просто незаменим, если нужно считать деньги. Представим, что нам нужно работать с гривной (это такая украинская валюта, с точки зрения рассматриваемого вопроса ничем не отличающаяся от рубля, евро или доллара). Сотая часть гривны называется копейкой. Естественно думать, что гривны будут представлены целой частью числа, а копейки — дробной.
Что произойдёт, если для денег мы станем использовать float?
Как я писал в статье: 4 грн 31 коп будут на самом деле иметь внутреннюю запись 4.3099999999999996. Да, при печати всё показывается нормально если у вас Python 2.7+ — но внутри это всё же чуть-чуть иное число!
И если работать с такими числами (складывать, вычитать, делить и умножать) — ошибка будет нарастать и рано или поздно превысит копейку, а потом счет пойдет и на гривны. Чем больше операций — тем выше ошибка.
В результате дебет перестаёт сходиться с кредитом, бухгалтерия встаёт на уши и разработчик получает большую проблему на свою голову (случай из жизни моего друга).
Чтобы этого избежать, нужно использовать decimal — который никогда ничего не теряет.
Внутри decimal представлен как знак, набор цифр и положение десятичной точки — т.е. нет никакого округления.
Использование очень простое:
>>> from decimal import Decimal
>>> Decimal("4.31")
Decimal('4.31')
>>> Decimal("4.31") + Decimal("1.10")
Decimal('5.41')
Все стандартные операции над decimal работают так же хорошо, как и с просто числами.
К слову, базы данных как правило имеют встроенную поддержку этого типа, а драйвера DBAPI и ORM вроде Django и SQLAlchemy тоже умеют работать с decimal.
К сожалению, этого базиса недостаточно, а документация, исчерпывающе полная, — не содержит простых ясных инструкций для ленивого программиста.
Пример:
>>> Decimal("1.10") / 3
Decimal('0.3666666666666666666666666667')
Ой! Зачем так много цифр, ведь у нас гривна с копейками?!!
Дело в том, что помимо Decimal есть еще и Context. По умолчанию у него точность в 28 чисел в дробной части, что явно многовато для валюты. Настроим на 2 знака:
>>> from decimal import getcontext
>>> getcontext().prec = 2
>>> Decimal('1.10') / 3
Decimal('0.37')
Уже лучше.
Правила округления тоже задаются контекстом. По умолчанию это ROUND_HALF_UP — округлять вверх, если цифра пять и больше. Как в школе учили. Можно настроить и другой способ — читайте документацию. Еще можно указать, чтобы при разных ситуациях (потеря точности или бесконечность в результате, например) генерировалось исключение а не происходило округление. Кому надо — пусть изучает эту самую документацию, ключевое слово trap.
Вернемся к наиболее распространенным задачам.
Что делать, если часть вычислений нужно проводить с точностью «до копеек», а некоторые (например, то же сведение баланса и подсчет налогов) — до сотых долей копеек?
Наиболее практичный способ — создание своего контекста и применение его в with statement:
>>> from decimal import Context, localcontext
>>> with localcontext(Context(4)):
... print(repr(Decimal("1.10") / 3))
Decimal('0.3667')
Округление:
>>> Decimal('1.12').quantize(Decimal('0.1'))
Decimal('1.1')
>>> Decimal('1.16').quantize(Decimal('0.1'))
Decimal('1.2')
Внимание! Округлять можно только до той максимальной точности, которая позволена текущим контекстом. Сейчас у нас глобальный контекст имеет точность 2.
>>> getcontext().prec = 2
>>> Decimal('1.10').quantize(Decimal('0.000001'))
Traceback (most recent call last):
...
decimal.InvalidOperation: quantize result has too many digits for current context
Вот и всё.
За рамками статьи осталось многое. Моя цель — дать необходимый минимум знаний, требуемый для работы с денежными единицами. Остальное, повторюсь ещё раз, найдете в документации — она большая и исчерпывающая, содержит описание многих дюжин доступных функций.
И, тем не менее, изложенного достаточно для практически любой повседневной работы.
Важное дополнение. Изначально decimal был написан на чистом питоне. Т.е. корректно считал, но делал это довольно медленно. Не
Для новичков сейчас не совсем понятно, что это такое. Сейчас разъясню.
Мы можем писать программу, но её нужно как то запускать. Не совсем понимаю, почему это не предусмотрено при установке питона… Разработчики наверное думают, что все в интернете профессиональные программисты.
Но если честно, то запустить программу на питоне без прописки патча как то не удобно и не каждый догадается как. Читать