Модераторы: Daevaorn

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> переводим Python FAQ, на русский язык 
:(
    Опции темы
setq
Дата 14.10.2005, 16:17 (ссылка)    |    (голосов: 0) Загрузка ... Загрузка ... Быстрая цитата Цитата


Unregistered











 давайте переводить питоновский FAQ на русский.)

вот ссылка http://www.python.org/doc/faq/

если Вы хотите попереводить: выбираете понравившуюся статью, переводите её, выкладываете сюда, оповещаете меня, чтобы я отредактировал содержание. в содержании красным я буду отмечать переведённые подпункты. выбирайте статью, которая Вам по душе и вперёд.)

для обсуждения перевода, возникающих сложностей, неточностей, комментариев и т.д создана другая тема (она здесь). будет лучше, если эта тема останется только для статей.


1   General Python FAQ
1.1   Общая информация
1.1.1   Что такое Питон?
1.1.2   Для чего изначально создавался Питон?
1.1.3   Где применим Питон?
1.1.4   Что из себя представляет нумерация версий Питона?
1.1.5   Существуют ли какие-нибудь ограничения на использования Питона, связанные с copyright-правами?
1.1.6   Как я могу получить копию исходных кодов Питона?
1.1.7   Где можно получить документацию по Питону?
1.1.8   Я никогда до этого не программировал. Существует ли какое-нибудь учебное пособие по Питону?
1.1.9   Какие есть FTP сайты, зеркалирующие дистрибутивы Питона?
1.1.10   Существуют ли группы новостей или почтовые рассылки, посвящённые Питону?
1.1.11   Как мне получить тестовую бета-версию Питона?
1.1.12   Как мне подать сообщение об ошибке или предложить патч?
1.1.13   Опубликованы ли какие-нибудь статьи о Питоне?

(перейти)
1.1.14 Есть ли книги по Питону?
1.1.15   В какой точке мира находится www.python.org?
1.1.16   Почему язык называется «Питон»?
1.1.17   А должно ли мне нравиться шоу «Monty Python’s Flying Circus»?
1.2   Питон в реальном мире
1.2.1   Насколько Питон стабилен?
1.2.2   Как много людей использует Питон?

(перейти)
1.2.3   Есть ли какие – нибудь важные проекты, сделанные на питоне? (перейти)
1.2.4   Какие усовершенствования в Питоне ожидаются в будущем?
1.2.5   Разумно ли предлагать несовместимые изменения в Питоне?
1.2.6   Что такое Python Software Foundation?

(перейти)
1.2.7   Питон и проблема Y2K ( 2000 год) (перейти)
1.2.8   Подходит ли Питон начинающим программистам? (перейти)
1.3   Upgrading Python
1.3.1   Что за модуль bsddb185, и почему мое приложение жалуется на него??

(перейти)
1.4   Python's Design
1.4.1   Почему в Питоне для группировки инструкций используется выравнивание?
1.4.2   Почему вычисления с плавающей точной столь неаккуратны?

(перейти)
1.4.3   Почему строки в Питоне не изменяемы?
1.4.4   Почему использование self должно быть явным в определениях и вызовах методов?
1.4.5   Почему я не могу в выражениях использовать присваивание?
1.4.6   Почему для одной функциональности используются методы (например list.index()), а для другой – функции (например len(list))?

(перейти)
1.4.7   Почему join() является методом строки, а не списка или кортежа? (перейти)
1.4.8   Как быстры исключения?
1.4.9   Почему в Питоне нет инструкции switch или case?
1.4.10   Не лучше было бы эмулировать потоки в интерпретаторе, а не надеяться на реализацию потоков, зависящую от операционной системы?
1.4.11   Почему лямбда-форма не может содержать инструкции?

(перейти)
1.4.12   Можно ли скомпилировать в машинный код, Си или любой другой язык программу на Питоне?
1.4.13   Как Питон управляет памятью?

(перейти)
1.4.14   Почему при выходе из питона освобождается не вся память?
1.4.15   Почему типы кортеж (tuple) и список (list) разделены?
 (перейти)
1.4.16   Как реализованы списки?
1.4.17   Как реализованы словари?
 (перейти)
1.4.18   Why must dictionary keys be immutable?
1.4.19   Why doesn't list.sort() return the sorted list?
1.4.20   How do you specify and enforce an interface spec in Python?
1.4.21   Why are default values shared between objects?
1.4.22   Почему в языке python нет ключевого слова goto? (перейти)
1.4.23   Why do I get a SyntaxError for a 'continue' inside a 'try'?
1.4.24   Why can't raw strings (r-strings) end with a backslash?
1.4.25   Why doesn't Python have a "with" statement like some other languages?
1.4.26   Why are colons required for the if/while/def/class statements?
--------------------------------------------------------------------------------------------
1   Programming FAQ
1.1   Общие Вопросы
1.1.1   Существует ли для Питона отладчик кода с точками останова, пошаговым выполнением и т.д?
 (перейти)
1.1.2   Есть ли инструменты, помогающие находить баги и проводить статический анализ?
1.1.3   Как создать самостоятельную программу (stand-alone binary) из скрипта на Питоне?
1.1.4   Есть ли стандарт или единый стиль для написания кода в Питоне?
 (перейти)
1.1.5   Моя программа слишком медленная. Как можно увеличить её скорость? (перейти)
1.2   Core Language
1.2.1   Как из функции получить доступ к глобальной переменной?
1.2.2   Как определяются локальные и глобальные переменные в Питоне?
1.2.3   Как организовать совместный доступ к глобальным переменным для нескольких модулей?

(перейти)
1.2.4   Как правильнее использовать импортирование? (перейти)
1.2.5   Как передать дополнительные или именованные параметры (optional or keyword parameters) из одной функции в другую? (перейти)
1.2.6   Как написать функцию, которая возвращает значения в параметрах (вызов по ссылке)? (перейти)
1.2.7   Как в Питоне написать функционал (higher order function)? (перейти)
1.2.8   Как в Питоне получить копию объекта?
1.2.9   Как узнать методы и атрибуты объекта?

(перейти)
1.2.10 Как получить имя объекта? (перейти)
1.2.11   Существует ли эквивалент тернарному оператору Си "?:" ? (перейти)
1.2.12   Можно ли на Питоне составить выражение, которое трудно прочитать (obfuscated one-liners)?
1.3   Numbers and strings
1.3.1   Как определять шестнадцатиричные и восьмиричные целые?
1.3.2   Почему -22 / 10 возвращает -3?
1.3.3   Как преобразовать строку в число?
1.3.4   Как преобразовать число в строку?

(перейти)
1.3.5   Как изменить строку в памяти (in place)?
1.3.6   Как вызвать функцию/метод имя которого сохранено в строке?

(перейти)
1.3.7   Is there an equivalent to Perl's chomp() for removing trailing newlines from strings?
1.3.8   Is there a scanf() or sscanf() equivalent?
1.3.9   What does 'UnicodeError: ASCII [decoding,encoding] error: ordinal not in range(128)' mean?
1.4   Sequences (Tuples/Lists)
1.4.1   How do I convert between tuples and lists?
1.4.2   What's a negative index?
1.4.3   Как обработать последовательность (iterate over a sequence) в обратном порядке? (перейти)
1.4.4   Как удалить повторяющиеся элементы (duplicates) из списка? (перейти)
1.4.5   Как создать в Питоне массив?
1.4.6   Как создать многомерный список (multidimensional list)?

(перейти)
1.4.7   How do I apply a method to a sequence of objects?
1.5   Dictionaries
1.5.1   How can I get a dictionary to display its keys in a consistent order?
1.5.2   I want to do a complicated sort: can you do a Schwartzian Transform in Python?
1.5.3   How can I sort one list by values from another list?
1.6   Objects
1.6.1   What is a class?
1.6.2   What is a method?
1.6.3   What is self?
1.6.4   How do I check if an object is an instance of a given class or of a subclass of it?
1.6.5   What is delegation?
1.6.6   How do I call a method defined in a base class from a derived class that overrides it?
1.6.7   How can I organize my code to make it easier to change the base class?
1.6.8   How do I create static class data and static class methods?
1.6.9   How can I overload constructors (or methods) in Python?
1.6.10   I try to use __spam and I get an error about _SomeClassName__spam.
1.6.11   В моём классе определён метод __del__ но он не вызывается когда я удаляю объект.
1.6.12   Как мне получить список всех экземпляров заданного класса?

(перейти)
1.7   Modules
1.7.1   How do I create a .pyc file?
1.7.2   How do I find the current module name?
1.7.3   How can I have modules that mutually import each other?
1.7.4   __import__('x.y.z') returns <module 'x'>; how do I get z?
1.7.5   Когда я редактирую импортированный модуль а затем перезагружаю его, изменения невидны. Почему? (перейти)
--------------------------------------------------------------------------------------------
1   Python Library and Extension FAQ
1.1   General Library Questions
1.1.1   How do I find a module or application to perform task X?
1.1.2   Where is the math.py (socket.py, regex.py, etc.) source file?
1.1.3   How do I make a Python script executable on Unix?
1.1.4   Is there a curses/termcap package for Python?
1.1.5   Is there an equivalent to C's onexit() in Python?
1.1.6   Why don't my signal handlers work?
1.2   Common tasks
1.2.1   How do I test a Python program or component?
1.2.2   How do I create documentation from doc strings?
1.2.3   How do I get a single keypress at a time?
1.3   Threads
1.3.1   How do I program using threads?
1.3.2   None of my threads seem to run: why?
1.3.3   How do I parcel out work among a bunch of worker threads?
1.3.4   What kinds of global value mutation are thread-safe?
1.3.5   Can't we get rid of the Global Interpreter Lock?
1.4   Input and Output
1.4.1   How do I delete a file? (And other file questions...)
1.4.2   How do I copy a file?
1.4.3   How do I read (or write) binary data?
1.4.4   I can't seem to use os.read() on a pipe created with os.popen(); why?
1.4.5   How do I run a subprocess with pipes connected to both input and output?
1.4.6   How do I access the serial (RS232) port?
1.4.7   Why doesn't closing sys.stdout (stdin, stderr) really close it?
1.5   Network/Internet Programming
1.5.1   What WWW tools are there for Python?
1.5.2   How can I mimic CGI form submission (METHOD=POST)?
1.5.3   What module should I use to help with generating HTML?
1.5.4   How do I send mail from a Python script?
1.5.5   How do I avoid blocking in the connect() method of a socket?
1.6   Databases
1.6.1   Are there any interfaces to database packages in Python?
1.6.2   How do you implement persistent objects in Python?
1.6.3   Why is cPickle so slow?
1.6.4   If my program crashes with a bsddb (or anydbm) database open, it gets corrupted. How come?
1.6.5   I tried to open Berkeley DB file, but bsddb produces bsddb.error: (22, 'Invalid argument'). Help! How can I restore my data?
1.7   Mathematics and Numerics
1.7.1   How do I generate random numbers in Python?
--------------------------------------------------------------------------------------------
1   Extending/Embedding FAQ
1.1   Могу ли я создавать свои собственные функции на Си?
1.2   Могу ли я создавать свои собственные фунции на Си++?
1.3   Писать на Си – это сложно. Существуют ли какие-нибудь другие варианты?
1.4   Как я могу из Си выполнить некоторые инструкции Питона?
1.5   Как я могу из Си вычилсить некоторое выражения Питона?
1.6   Как мне в Си получить значения из питоновского объекта?
 (перейти)
1.7   How do I use Py_BuildValue() to create a tuple of arbitrary length?
1.8   How do I call an object's method from C?
1.9   How do I catch the output from PyErr_Print() (or anything that prints to stdout/stderr)?
1.10   How do I access a module written in Python from C?
1.11   How do I interface to C++ objects from Python?
1.12   I added a module using the Setup file and the make fails; why?
1.13   How do I debug an extension?
1.14   I want to compile a Python module on my Linux system, but some files are missing. Why?
1.15   What does "SystemError: _PyImport_FixupExtension: module yourmodule not loaded" mean?
1.16   How do I tell "incomplete input" from "invalid input"?
1.17   How do I find undefined g++ symbols __builtin_new or __pure_virtual?
1.18   Can I create an object class with some methods implemented in C and others in Python (e.g. through inheritance)?
1.19   When importing module X, why do I get "undefined symbol: PyUnicodeUCS2*"?
--------------------------------------------------------------------------------------------
1   Python Windows FAQ
1.1   How do I run a Python program under Windows?
1.2   How do I make python scripts executable?
1.3   Why does Python sometimes take so long to start?
1.4   Where is Freeze for Windows?
1.5   Is a *.pyd file the same as a DLL?
1.6   How can I embed Python into a Windows application?
1.7   How do I use Python for CGI?
1.8   How do I keep editors from inserting tabs into my Python source?
1.9   How do I check for a keypress without blocking?
1.10   How do I emulate os.kill() in Windows?
1.11   Why does os.path.isdir() fail on NT shared directories?
1.12   cgi.py (or other CGI programming) doesn't work sometimes on NT or win95!
1.13   Why doesn't os.popen() work in PythonWin on NT?
1.14   Why doesn't os.popen()/win32pipe.popen() work on Win9x?
1.15   PyRun_SimpleFile() crashes on Windows but not on Unix; why?
1.16   Importing _tkinter fails on Windows 95/98: why?
1.17   How do I extract the downloaded documentation on Windows?
1.18   Missing cw3215mt.dll (or missing cw3215.dll)
1.19   Warning about CTL3D32 version from installer
--------------------------------------------------------------------------------------------
1   Graphic User Interface FAQ
1.1 Общие вопросы о GUI
1.1.1 Какие независимые от платформы инструментарии GUI доступны в Питоне?
1.1.1.1 Tkinter
1.1.1.2   wxWindows
1.1.1.3   Qt
1.1.1.4   GTk+
1.1.1.5   FLTK
1.1.1.6   FOX
1.1.1.7   OpenGL
1.1.2 Какие платформенно-специфичные инструментарии для GUI доступны в Питоне?
 (перейти)
1.2   Tkinter questions
1.2.1   How do I freeze Tkinter applications?
1.2.2   Can I have Tk events handled while waiting for I/O?
1.2.3   I can't get key bindings to work in Tkinter: why?
--------------------------------------------------------------------------------------------
"Почему Питон установлен на моём компьютере?" (перейти)    

Это сообщение отредактировал(а) setq - 6.6.2007, 08:44
  Вверх
setq
Дата 15.10.2005, 09:14 (ссылка)    |    (голосов: 0) Загрузка ... Загрузка ... Быстрая цитата Цитата


Unregistered











из Programming FAQ

1.2.10 Как получить имя объекта?

Простой ответ: никак, потому что у объектов нет имён. Важно понимать: присваивание (assignment) только связывает имя со значением; То же самое относится к операторам def и class, но в этом случае значение is a callable. Взгляните на следующий код:

Код
class A:
    pass

B = A

a = B()
b = a
print b
<__main__.A instance at 016D07CC>
print a
<__main__.A instance at 016D07CC>


Как видите, у класса всё-таки есть имя: даже несмотря на то, что он связан (bound) с двумя именами и вызван через имя B, созданный экземпляр по прежнему печатает, что он - экземпляр класса A. Так или иначе, невозможно сказать какое имя у самого экземпляра: a или b, поскольку эти имена связаны с одним значением.

Вообще-то, Вашему коду не обязательно "знать имена" отдельных значений. Если только Вы специально не собираетесь писать introspective programs, Вам лучше попробовать другой подход.

В конференции comp.lang.python Fredrik Lundh однажды дал отличную аналогию, отвечая на этот вопрос:

Цитата
Так же, как получить имя кошки, которую вы нашли во дворе: кошка (объект) не может назвать Вам своё имя сама, и ей по большому счёту всё равно -- так что единственный способ узнать как её зовут это расспросить всех Ваших соседей (пространства имён) их ли это животное (объект)...

...и не удивляйтесь если у неё окажется много разных имён или вообще ниодного*!



(*) от переводчика: "...или вообще ниодного" - аналогия остаётся аналогией) : объект, не связанный ни с одним именем, как Вы знаете удаляется из памяти.

Это сообщение отредактировал(а) sergej.z - 11.11.2005, 20:55
  Вверх
setq
Дата 15.10.2005, 18:18 (ссылка)    |    (голосов: 0) Загрузка ... Загрузка ... Быстрая цитата Цитата


Unregistered











 из Programming FAQ

1.2.11   Существует ли эквивалент тернарному оператору Си "?:" ?

Ответ для Python 2.4 и меньше:

Нет. Во многих случаях Вы можете имитировать a?b:c с помощью "a and b or c", но есть одно "но": если b - 0 (или пустое, или None -- любое значение, которое оценивается как ложное), то вместо него будет выбрано c. Во многих случаях Вы можете, глядя на код, понять что этого не произойдёт (например, из-за того что b константа или имеет тип, который не может быть ложным), но в общем случае это может оказаться проблемой.

Tim Peters (who wishes it was Steve Majewski) предложил следуещее решение: (a and [ b ] or [c])[0]. Поскольку [ b ] - это одноэлементный список (singleton list) - он всегда истинный, таким образом неверный вариант никогда не будет выбран; затем применяя [0] ко всей конструкции мы получаем b или c, что и требовалось. Выглядит некрасиво, но может помочь в тех редких случаях, когда переписывание Вашего кода с 'if' представляется по-настоящему неудобным.

Обычно самое лучшее решение - это использование конструкции if...else. Другое решение - реализация оператора "?:" в виде функции:

Код
def q(cond,on_true,on_false):
    if cond: 
        if not isfunction(on_true): return on_true 
        else: return apply(on_true)
    else:
        if not isfunction(on_false): return on_false 
        else: return apply(on_false)


В большинстве случаев Вам достаточно просто передать b и c: q(a,b,c). Для того чтобы избежать вычисления b или c если это не нужно, заключайте их в lambda-функции, т.е: q(a,lambda: b, lambda: c).

Вопрос почему в Питоне нет выражения if-then-else имеет несколько ответов: многие языки спокойно обходятся без него; оно может легко ухудшить читаемость кода; не был найден способ сказать это "по-питоновски"; анализ стандартной библиотеки нашёл не очень много мест, где использование if-then-else сделало бы код более читаемым.

В 2002 был опубликован PEP 308 предлагающий несколько возможных вариантов синтаксиса, общественность попросили проголосовать за них. Голосование выявило несовместимость вкусов. Большинству нравился какой-то один вариант и не нравились все остальные; многие предпочли не иметь тернарного оператора вовсе, чем иметь тот, который им не нравится. 

Ответ для версии 2.5

Да. Такая конструкция была введена в новой версии Python: exp1 if cond else exp2 означает если cond истинно значением будет exp1, а если ложно -- exp2.

Это сообщение отредактировал(а) setq - 20.11.2006, 00:44
  Вверх
srd
Дата 15.10.2005, 18:56 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Нереварин
**


Профиль
Группа: Участник Клуба
Сообщений: 951
Регистрация: 30.8.2003
Где: Владивосток

Репутация: 7
Всего: 49



"Why is Python Installed on my Computer?" FAQ

Почему Питон установлен на моём компьютере?

Что такое Питон?

Питон – это язык программирования. Он используется в самых разных приложениях. Преподаётся в некоторых школах и колледжах как первый язык программирования, потому что Питон легко осваивается. Но и разработчики профессионального программного обеспечения используют Питон, например в Google, NASA и Industrial Light & Magic.

Если вы хотите узнать о Питоне больше, начните с «Руководство по Питону для начинающих» (http://www.python.org/moin/BeginnersGuide).

Почему Питон установлен на моей машине?

Если вы нашли в своей системе Питон, но не помните, что бы вы его устанавливали, то у этого может быть несколько причин.
Возможно, другой пользователь компьютера хочет научиться программировать; вам лучше знать, кто пользовался компьютером и мог установить Питон.
Другие приложения, установленные на машине, могут быть написаны на Питоне. На домашних компьютерах подобным приложением может быть PySol (http://www.oberhumer.com/opensource/pysol/), карточный пасьянс, содержащий в себе больше 200 различных игр и их вариаций.
Некоторые Windows-машины также могут иметь установленный Питон. В настоящее время мы знаем о компьютерах от Hewlett-Packard и Compaq, которые поставляются с Питоном. Вероятно, некоторые административные утилиты HP/Compaq написаны на Питоне. Все компьютеры Apple с Mac OS X имеют Питон; он включён в базовую установку.

Могу ли я удалить Питон?

Это зависит от того, как Питон у вас оказался.

Если кто-то сознательно установил Питон, вы можете удалить его, ничего не повредив. Для Windows используйте иконку «Добавить/Удалить приложения» в Панели управления.

Если Питон был установлен другим приложением, вы тоже можете удалить его, но это приложение не будет больше работать. Возможно, вам лучше будет использовать программу удаления этого приложения вместо непосредственного удаления Питона.

Если Питон попал к вам вместе с операционной системой, то его удаление не рекомендуется. Если вы удалите его, инструменты, написанные на Питоне, перестанут работать, а они могут быть вам нужны. Для решения таких проблем может потребоваться переустановка целой системы.

------------
З.Ы.
Вопросы в этой части FAQ показались мне забавными smile


--------------------
Не смей читать мою подпись!!!
PM MAIL Jabber   Вверх
srd
Дата 16.10.2005, 10:07 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Нереварин
**


Профиль
Группа: Участник Клуба
Сообщений: 951
Регистрация: 30.8.2003
Где: Владивосток

Репутация: 7
Всего: 49



1.1 Общая информация

1.1.1 Что такое Питон?

Питон – это интерпретируемый, интерактивный, объектно-ориентированный язык программирования. Он объединяет в себе модули, исключения, динамическую типизацию, динамические типы данных очень высокого уровня и классы. Питон сочетает поразительную мощь и очень ясный синтаксис. Имеет интерфейс ко многим системным вызовам и библиотекам, различным оконным системам и может быть расширен с помощью Си или Си++. Также применим как язык расширений в приложениях, нуждающихся в программируемом интерфейсе. Наконец, Питон переносим: он работает под управлением многих клонов Unix, на Mac, на PC под управлением MS-DOS, Windows, Windows NT и OS/2.
Если хотите узнать больше, начните с «Руководства по Питону для начинающих» (http://www.python.org/moin/BeginnersGuide).

1.1.2 Для чего изначально создавался Питон?

Это очень краткая история, написанная Guido van Rossum:
Я получил большой опыт в реализации интерпретируемых языков в группе ABC в CWI. Работая в этой группе, я многое узнал о проектировании языков. Это послужило основой многих свойств Питона, включая использование выравнивания для группировки инструкций и внедрение высокоуровневых типов данных (не смотря на то, что в Питоне в деталях есть отличия).
У меня были некоторые претензии к языку ABC, но также мне нравились многие его особенности. При этом было невозможно расширить язык ABC (или его реализацию) в соответствии с моими нуждами. Отсутствие расширяемости было одной из самых больших проблем. У меня был некоторый опыт использования Модулы-2, также я общался с проектировщиками Модулы-3 и читал их отчёты. Модула-3 стала основой синтаксиса и семантики исключений и некоторых других свойств Питона.
Я работал в группе распределённой операционной системы Amoeba в CWI. Мы нуждались в более подходящем способе решения административных задач, чем написание программ на Си или написание скриптов для командного интерпретатора Bourne, т.к. Amoeba имела собственный интерфейс системных вызовов, который не был легко доступен из Bourne. Мой опыт в обработке ошибок в Amoeba позволил понять мне важность исключений как свойства языка программирования.
Мне пришло на ум, что скриптовый язык с синтаксисом ABC и доступом к системным вызовам Amoeba покрыл бы мои нужды. Но было бы глупо создавать язык, уникальный для Amoeba. Так я решил, что мне нужен универсальный и расширяемый язык.
Во время рождественских праздников в 1989 году, я у меня было много свободного времени. Так я решил приступить к работе. В течение следующего года, не смотря на то, что я всё ещё работал над языком в своё личное время, Питон успешно использовался в проекте Amoeba, а отзывы из колледжей позволили мне добавить много ранних улучшений.
В феврале 1991 года, после больше чем года разработки, я решил поместить в USENET сообщение. Что произошло дальше, вы можете узнать из файла Misc/HISTORY.

1.1.3 Где применим Питон?

Питон – это высокоуровневый язык программирования общего назначения, который может быть использован для решения самых разных задач.
Язык поставляется с обширной стандартной библиотекой, которая покрывает такие задачи, как обработка строк (регулярные выражения, Unicode, сравнение файлов), протоколы Internet (программирование HTTP, FTP, SMTP, XML-RPC, POP, IMAP, CGI), разработка программного обеспечения (юнит-тестирование, логирование, профилирование, разбор кода на Питоне), и интерфейсы с операционной системой (системные вызовы, файловые системы, сокеты TCP/IP). Обратитесь к содержанию «Руководства по Библиотеке» (http://docs.python.org/lib/) для того, чтобы получить представление о её возможностях. Также существует множество третье-сторонних расширений. Обратитесь к «Списку пакетов для Питона» (http://www.python.org/pypi) в поисках пакетов, вам интересных.

1.1.4 Что из себя представляет нумерация версий Питона?

Версии Питона обозначаются A.B.C или A.B. A – это старшая часть номера и увеличивается только из-за действительно фундаментальных изменений в языке. B – это младшая часть номера версии и увеличивается и-за менее умопомрачительных изменений. C – самая младшая часть номера и увеличивается с каждым релизом, содержащем исправления ошибок. Обратитесь к PEP 6 (http://www.python.org/peps/pep-0006.html) в поисках информации о релизах с исправлениями ошибок.
Не все релизы представляют из себя только исправления ошибок. Перед выходом нового основного релиза выходит серия инженерных релизов, обозначаемых как альфа, бета и релиз-кандидат. Альфы – это самые ранние релизы, в которых работа над интерфейсами ещё не завершена. Нет ничего неожиданного в том, что некоторый интерфейс может быть изменён в новой альфе. Беты более стабильны, сохраняют существующие интерфейсы. Но возможны добавления новых модулей. Релиз-кандидаты «заморожены» и не содержат никаких изменений кроме исправлений критических ошибок.
Альфы, беты и релиз-кандидаты имеют дополнительный суффикс. Этот суффикс для альфа-версий выглядит как «aN», где N – номер, для бета-версий выглядит как «bN» и для релиз-кандидатов выглядит как «cN». Другими словами, все версии, помеченные как 2.0aN, предшествуют версиям 2.0bN, которые в свою очередь предшествуют версиям 2.0cN, и все они предшествуют версии 2.0
Также вы можете обнаружить версии с суффиксом «+», например «2.2+». Это не релизы, а сборки, полученные непосредственно на основе дерева CVS. На практике, после каждого незначительного релиза дерево CVS увеличивает младший номер версии, который теперь выглядит как «a0», например «2.4a0».
Также смотрите документацию в sys.version, sys.hexversion и sys.version_info.

1.1.5 Существуют ли какие-нибудь ограничения на использования Питона, связанные с copyright-правами?

Нет. Вы можете делать с исходным кодом всё что угодно, пока вы оставляете уведомления о правах и показываете эти уведомления в любой документации по Питону, которую вы делали. Если вы чтите авторские права, то вы можете свободно использовать Питон в коммерческих целях, продавать копии Питона в виде исходных кодов или бинарниках (модифицированных или немодифицированных), или продавать продукты, включающие в себя Питон. Конечно, нам бы хотелось знать, где используется Питон в коммерческих целях.
Смотрите страницу с лицензией PSF (http://www.python.org/psf/license.html) с последующими объяснениями и ссылкой на полный текст лицензии.

1.1.6 Как я могу получить копию исходных кодов Питона?

Дистрибутив с последними исходными кодами Питона всегда может быть найден на python.org по адресу http://www.python.org/download/. Последние инженерные версии исходного кода могут быть получены через анонимный CVS на SourceForge по адресу http://www.sourceforge.net/projects/python.
Дистрибутивы исходных кодов представляют собой архивы tar.gz, содержащие полный код на Си, документацию на LaTeX, модули библиотеки Питона, примеры программы и некоторое полезное свободно-распространяемое программное обеспечение. Всё это может быть скомпилировано и запущено из коробки на большинстве UNIX-платформах.
Старые версии Питона также доступны на python.org.

1.1.7 Где можно получить документацию по Питону?

Вся документация доступна по адресу http://www.python.org/doc/.
Стандартная документация для текущей стабильной версии также доступна по адресу http://docs.python.org/.
Исходники документации на LaTeX являются частью дистрибутива с исходными кодами. Если у вас нет LaTex, то последний комплект документации доступен по анонимному FTP в разнообразных форматах, таких как PostScript и HTML. Посетите приведённые выше URL для получения последних версий.

1.1.8 Я никогда до этого не программировал. Существует ли какое-нибудь учебное пособие по Питону?

Есть множество учебных пособий и книг. Обратитесь к «Руководству начинающего» (http://www.python.org/moin/BeginnersGuide) за информацией для начинающих программистов на Питоне, включающей список учебных пособий.

1.1.9 Какие есть FTP сайты, зеркалирующие дистрибутивы Питона?

Обратитесь к списку зеркал python.org по адресу http://www.python.org/Mirrors.html.

1.1.10 Существуют ли группы новостей или почтовые рассылки, посвящённые Питону?

Есть группа новостей, comp.lang.python и почтовая рассылка http://mail.python.org/mailman/listinfo/python-list. Группа новостей и почтовая рассылка отражают друг друга. Если вы читаете новости, то нет необходимости подписываться на почтовую рассылку. comp.lang.python имеет большой трафик, получает сотни сообщений ежедневно и клиенты Usenet лучше управляются с этим потоком.
Объявления о новых релизах и разных событиях могут быть найдены в comp.lang.python.announce, модерируемом списке с небольшим трафиком (примерно пять сообщений в день). Он доступен как почтовая рассылка http://mail.python.org/mailman/listinfo/python-announce-list
Больше информации о других почтовых рассылках и группах новостей может быть найдена по адресу http://www.python.org/community/lists.html.

1.1.11 Как мне получить тестовую бета-версию Питона?

Выход всех релизов, включая альфы, беты и релиз-кандидаты, объявляется в comp.lang.python и comp.lang.python.announce. Также все анонсы появляются на домашней странице Питона по адресу http://www.python.org, и через RSS.
Вам также доступна инженерная версия Питона через CVS. Смотрите детали в http://sourceforge.net/cvs/?group_id=5470. Если вы не знакомы с CVS, то вам поможет такая документация, как http://linux.oreillynet.com/pub/a/linux/20.../cvs_intro.html.

1.1.12 Как мне подать сообщение об ошибке или предложить патч?

Для ошибок и патчей, пожалуйста, используйте соответствующий сервис проекта Питон на SourceForge.
Ошибки: http://sourceforge.net/tracker/?group_id=5470&atid=105470
Патчи: http://sourceforge.net/tracker/?group_id=5470&atid=305470
Для сообщений об ошибках у вас должна быть учётная запись на SourceForge для того, чтобы мы могли связаться с вами, если у нас появятся последующие вопросы. Также это позволит вам получить обновления с исправлениями обнаруженных вами ошибок.
Для того, чтобы узнать больше о том, как разрабатывается Питон, обратитесь к «Руководству разработчика Питона» (http://www.python.org/dev/).

1.1.13 Опубликованы ли какие-нибудь статьи о Питоне?

Возможно, лучше обратиться к вашей любимой книге о Питоне.
Самая первая статься о Питоне сильно устарела.
Guido van Rossum и Jelke de Boer, "Интерактивное тестирование удалённых серверов с использованием языка программирования Питон", CWI Quarterly, Volume 4, Issue 4 (Декабрь 1991), Амстердам, стр. 283-303.



--------------------
Не смей читать мою подпись!!!
PM MAIL Jabber   Вверх
setq
Дата 16.10.2005, 10:30 (ссылка)    |    (голосов: 0) Загрузка ... Загрузка ... Быстрая цитата Цитата


Unregistered











из Programming FAQ

1.2.7 Как в Питоне написать функционал (higher order function)?

У Вас две возможности: Вы можете использовать вложенные области видимости (nested scopes) или вызываемые классы (callable objects). К примеру, Вы захотели определить функционал linear(a,b), который возвращает функцию f(x), вычисляющую значение a*x+b. Используя вложенные области видимости:

Код
def linear(a,b):
    def result(x):
        return a*x + b
    return result


Или используя вызываемый класс:

Код
class linear:
   def __init__(self, a, b):
       self.a, self.b = a,b
   def __call__(self, x):
       return self.a * x + self.b


В обоих случаях:

taxes = linear(0.3,2)

создаёт вызываемый объект, такой что taxes(10e6) == 0.3 * 10e6 + 2.

Способ с классами имеет тот недостаток, что он чуть чуть медленнее и в результате получается немного больше кода. Однако несколько вызываемых объектов могут share общий интерфейс (signature) через наследование:

Код
class exponential(linear):
   # __init__ inherited
   def __call__(self, x):
       return self.a * (x ** self.b)


И объект также может запоминать своё состояние for several methods:

Код
class counter:
    value = 0
    def set(self, x): self.value = x
    def up(self): self.value=self.value+1
    def down(self): self.value=self.value-1

count = counter()
inc, dec, reset = count.up, count.down, count.set


Здесь inc(), dec() и reset() ведут себя как функции работающие с одной и той же переменной-счётчиком.


комментарии переводчика: я знаю, что "вызываемый класс" это наверно не лучший перевод, но автор ответа использует термин callable object как по отношению к классам, так и к экземплярам. самое интересное, что по-английский всё было понятно ))

  Вверх
srd
Дата 16.10.2005, 14:20 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Нереварин
**


Профиль
Группа: Участник Клуба
Сообщений: 951
Регистрация: 30.8.2003
Где: Владивосток

Репутация: 7
Всего: 49



1.1.14 Есть ли книги по Питону?

Да, много, и ещё больше будет опубликовано. Смотрите Wiki на python.org по адресу http://www.python.org/moin/PythonBooks.
Также вы можете поискать в онлайновых книжных магазинах по слову «Python», отбрасывая ссылки на Monty Python, или просто поискать по ключевым словам «Python» и «language».

1.1.15 В какой точке мира находится www.python.org?

В настоящее время в Амстердаме. Хостинг любезно предоставлен XS4ALL (http://www.xs4all.nl/). Спасибо Томасу Воутерсу (Thomas Wouters) за его работу по поддержанию в порядке хостинга для python.org.

1.1.16 Почему язык называется «Питон»?

Тогда же, когда были начаты работы над Питоном, Guido van Rossum читал опубликованные сценарии для «Monty Python’s Flying Circus» (был в 70-е такой комедийный сериал на BBC, маловероятно, что вы о нём не слышали). Guido van Rossum решил, что ему нужно имя – короткое, уникальное и немного загадочное. Так он решил назвать язык «Питон».

1.1.17 А должно ли мне нравиться шоу «Monty Python’s Flying Circus»?

Нет. Но это могло бы помочь smile

1.2 Питон в реальном мире

1.2.1 Насколько Питон стабилен?

Очень стабилен. Новые стабильные релизы выпускаются примерно каждые 6-18 месяцев с 1991 года. Похоже, так и будет продолжаться в дальнейшем. Сейчас между двумя основными релизами проходит примерно 18 месяцев.
С появлением релизов с исправлением ошибок (bugfix releases) стабильность существующих релизов была увеличена. Релизы с исправлением ошибок, обозначаемые третьим компонентом в номере версии (например 2.1.3, 2.2.2) содержат только исправления для известных проблем. Гарантируется, что в подобных релизах интерфейсы не будут меняться.
В настоящее время релиз 2.4.2 является самой стабильной версией. (прим. пер.: "в настоящее время" - 16 октября 2005 года, релиз 2.4.2 вышел 28 сентября 2005 года).

1.2.2 Как много людей использует Питон?

Возможно, десятки тысяч пользователей. Трудно получить точное число, т.к. Питон доступен для свободного скачивания и не существуют никаких цифр о продажах. Также Питон распространяется через многие другие сайты или вместе с дистрибутивами Линукс. Поэтому и статистика о произведённых загрузках не даёт полной картины. Новостная группа comp.lang.python является очень активной, но не все пользователи Питона пишут в эту группу или читают её. Точной оценки количества подписчиков или пользователей Питона не существует.

-----------------------
P.S.
Смотрел я это шоу "Монти Пайтона". Классический "сортирный" британский юмор. Короче - сильно на любителя smile

Это сообщение отредактировал(а) srd - 16.10.2005, 14:52


--------------------
Не смей читать мою подпись!!!
PM MAIL Jabber   Вверх
setq
Дата 16.10.2005, 21:47 (ссылка)    |    (голосов: 0) Загрузка ... Загрузка ... Быстрая цитата Цитата


Unregistered











из Programming FAQ

1.4.4 Как удалить повторяющиеся элементы (duplicates) из списка?

Загляните в Книгу Рецептов (Python Cookbook) чтобы почитать длинную дискуссию о том как это можно сделать: http://aspn.activestate.com/ASPN/Cookbook/...on/Recipe/52560

Если Вам безразличен порядок элементов в списке, отсортируйте его, а затем двигаясь с конца удаляйте все повторяющиеся элементы:

Код
if List:
   List.sort()
   last = List[-1]
   for i in range(len(List)-2, -1, -1):
       if last==List[i]: del List[i]
       else: last=List[i]


Если все элементы списка могут быть ключами в словаре (т.е являются hashable) это часто работает быстрее

Код
d = {}
for x in List: d[x]=x
List = d.values()



от переводчика: если у Вас установлена версия 2.4, то Вы можете использовать set (такой новый встроенный тип):
Код
>>> list(set([1, 2, 3, 1]))
[1, 2, 3]

про скорость ничего определённого сказать не могу.

Это сообщение отредактировал(а) setq - 16.10.2005, 21:53
  Вверх
setq
Дата 17.10.2005, 17:38 (ссылка)    |    (голосов: 0) Загрузка ... Загрузка ... Быстрая цитата Цитата


Unregistered











из Programming FAQ

1.4.3 Как обработать последовательность (iterate over a sequence) в обратном порядке?

Если это список, то самым быстрым решением будет

Код
list.reverse()
try:
    for x in list:
        "do something with x"
finally:
    list.reverse()


Здесь плохо то, что пока Вы в цикле, список будет временно перевёрнутым. Если Вас это не устраивает, Вы можете создать копию. Это относительно дорогой способ, однако он быстрее, чем что-либо другое:

Код
rev = list[:]
rev.reverse()
for x in rev:
        <do something with x>


Если это не список, то Вы можете использовать более общий, однако менее быстрый, способ:

Код
for i in range(len(sequence)-1, -1, -1):
        x = sequence[i]
        <do something with x>


Более элегантное решение - написать класс, который ведёт себя как последовательность и генерирует (yields) элементы в обратном порядке (solution due to Steve Majewski):

Код
class Rev:
        def __init__(self, seq):
                self.forw = seq
        def __len__(self):
                return len(self.forw)
        def __getitem__(self, i):
                return self.forw[-(i + 1)]


Теперь достаточно просто написать:

Код
for x in Rev(list):
        <do something with x>


К сожалению, этот способ медленнее всех остальных из-за накладных расходов (overhead), связанных с вызовом метода класса.

В Питоне версии 2.3 Вам также становится доступен расширенный синтаксис для срезов:

Код
for x in sequence[::-1]:
       <do something with x>



от переводчика: в Питоне версии 2.4 становится доступна функция reversed(), как раз предназначенная для сабжа )) :

Код
>>> for x in reversed([1,2,3]) :
        print x
3
2
1


Это сообщение отредактировал(а) setq - 17.10.2005, 17:43
  Вверх
setq
Дата 17.10.2005, 23:28 (ссылка)    |    (голосов: 0) Загрузка ... Загрузка ... Быстрая цитата Цитата


Unregistered











из Programming FAQ

1.6.11 В моём классе определён метод __del__ но он не вызывается когда я удаляю объект.

Возможны несколько объяснений.

Оператор del не обязательно вызывает метод __del__ -- он просто уменьшает на единицу счётчик ссылок на объект, и когда тот достигает нуля, только тогда вызывается метод __del__.

Если Ваши структуры данных содержат циклические ссылки (circular links) (например, дерево, у которого каждый потомок содержит ссылку на родителя, а родитель хранит список потомков), то счётчик ссылок никогда не вернётся к нулю. Раз в какое-то время Питон запускает сборщик мусора, находящий такие циклические ссылки, но это может произойти несколько раз прежде чем данные будут обнаружены и удалены, т.е метод __del__ может быть вызван в неудобное случайное время. Это усложняет дело когда Вы пытаетесь воспроизвести баг. Хуже того, порядок в котором вызывается метод __del__ для объектов будет случайным. Вы можете вызвать gc.collect(), чтобы запустить сборку мусора, но бывают такие патологические случаи, в которых сборка мусора ничего не может поделать.

Несмотря на наличие сборки "хитро-циклического" мусора, неплохо определить метод close(), который явно бы вызывался для объектов, когда Вы завершаете с ними работу. Таким образом close() может удалять ссылки на subobjecs. Не вызывайте сам метод __del__. Пусть лучше __del__ тоже содержит в себе вызов close(), а close() должен иметь возможность вызываться более одного раза для одного и того же объекта.

Другой путь избежать циклических ссылок - использовать модуль "weakref", который позволяет ссылаться на объект без увеличения счётчика ссылок на него. Например, в дереве могут использоваться слабые ссылки (weak references) для ссылок на родительские узлы а также узлы одного уровня (если такие ссылки вообще нужны!).

от переводчика: перевод следующего абзаца вынесен в отдельную тему. (ссылка)

Цитата
If the object has ever been a local variable in a function that caught an expression in an except clause, chances are that a reference to the object still exists in that function's stack frame as contained in the stack trace. Normally, calling sys.exc_clear() will take care of this by clearing the last recorded exception.


И наконец, если __del__ возбуждает исключение, то на sys.stderr будет напечатано предупреждение (warning message).


1.6.12 Как мне получить список всех экземпляров заданного класса?

Питон не отслеживает все экземпляры класса (или встроенных типов). Но Вы можете запрограммировать конструктор класса, чтобы он отслеживал их, сохраняя в список слабые ссылки на каждый экземпляр.

Это сообщение отредактировал(а) setq - 17.10.2005, 23:37
  Вверх
srd
Дата 18.10.2005, 07:01 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Нереварин
**


Профиль
Группа: Участник Клуба
Сообщений: 951
Регистрация: 30.8.2003
Где: Владивосток

Репутация: 7
Всего: 49



1.2.4 Какие усовершенствования в Питоне ожидаются в будущем?

Смотрите по адресу http://www.python.org/peps планы расширения Питона (Python Enhancement Proposals (PEP)). PEP - это проектные документы, описывающие возможную новую функциональность Питона, предоставляющие краткую техническую спецификацию и логическое обоснование. PEP 1 (http://www.python.org/peps/pep-0001.html ) описывает формат PEP и процесс. Прочитайте этот документ перед тем, как создавать новый PEP.
Будущие усовершенствования обсуждаются в почтовой рассылке http://mail.python.org/mailman/listinfo/python-dev/.

1.2.5 Разумно ли предлагать несовместимые изменения в Питоне?

Обычно нет. По всему миру существуют миллионы строк кода на Питоне. Поэтому любые изменения в языке, которые затрагивают больше, чем очень маленькую группу существующих программ, рассматриваются с неодобрением. Даже если вы предоставите программу преобразования подобного кода, остаётся проблема с обновлением документации и множества книг. Мы не хотим обновлять их все за один ход.
Если какое-то свойство языка нуждается в изменении, то изменяться оно будет постепенно. PEP 5 (http://www.python.org/peps/pep-0005.html) описывает процедуру внедрения обратно-несовместимых изменений, минимально болезненную для пользователей.

1.2.6 Что такое Python Software Foundation?

Python Software Foundation – это независимая некоммерческая организация, владеющая авторскими правами на Питон версии 2.1 и выше. Целью PSF является развитие открытых технологий, относящихся к языку Питон, и пропаганда использования Питона. Домашняя страница PSF находится по адресу http://www.python.org/psf/.
Пожертвования в пользу PSF в США не облагаются налогом. Если вы используете Питон и находите его полезным, пожалуйста, воспользуйтесь страницей для пожертвований в пользу PSF (http://www.python.org/psf/donations.html).

Это сообщение отредактировал(а) srd - 18.10.2005, 11:13


--------------------
Не смей читать мою подпись!!!
PM MAIL Jabber   Вверх
setq
Дата 19.10.2005, 19:36 (ссылка)    |    (голосов: 0) Загрузка ... Загрузка ... Быстрая цитата Цитата


Unregistered











из Programming FAQ

1.1.5 Моя программа слишком медленная. Как можно увеличить её скорость?

Это нетривиальная (*) задача. Существует много способов убыстрить питоновский код; сейчас (в качестве последнего средства) рассмотрим переписывание некоторых частей кода на Си.

Иногда можно автоматически транслировать из Питона в Си или в код ассемблера x86, т.е Вам даже не придётся модифицировать Ваш код, чтобы выиграть в скорости.

Pyrex способен компилировать слегка изменённый питоновский код в расширение Си (C extension) и может использоваться на многих платформах.

Компилятор времени исполнения (just-in-time compiler) Psyco переводит питоновский код в код ассемблера x86. Psyco способен убыстрить требовательные по скорости функции (critical functions).

Теперь обсудим разнообразные приёмы "выдавить" немного скорости из питоновского кода. Никогда не используйте оптимизацию если анализ кода (profiling) ясно не показал Вам, что некоторая критичная по скорости функция исполняется слишком медленно. Оптимизация почти всегда делает код менее ясным, и Вам незачем платить за это дорогую цену (большее временя на разработку, большая вероятность появления ошибок) если она не окупается итоговой производительностью.

У Skip Montanaro есть страница в Интернете, где собраны приёмы увеличения скорости программ на Питоне: http://manatee.mojam.com/~skip/python/fastpython.html (от переводчика: ссылка ИМХО умерла( )

В одной своей статье Guido van Rossum описал интересный случай оптимизации: http://www.python.org/doc/essays/list2str.html (от переводчика: где-то я читал это по-русски...)

Ещё об одной вещи необходимо сказать: функции и (в особенности) вызовы методов являются довольно дорогим удовольствием; если Вы разработали чистый ОО интерфейс с большим количеством небольших функций, которые либо записывают и читают переменные экземпляров, либо вызывают другие методы, то возможно Вам стоит задуматься о более простом подходе, например о непосредственном доступе к переменным. Обратите также внимение на стандартный модуль "profile" (см. описание в Library Reference Manual), позволяющий определить где Ваша программа выполняется большую часть времени (если Вы наберётесь терпения -- анализ сам по себе замедляет исполнение кода на порядок).

Помните, что многие методы оптимизации (optimization heuristics), которые могут быть Вам знакомы по опыту программирования на других языках, скорее всего сработают и в Питоне. Например, известно что вывод большого количества байт может оказаться быстрее, чем вывод малого засчёт сокращения накладных расходов на системные вызовы. Таким образом CGI скрипт, печатающий свой вывод целиком окажется быстрее, чем скрипт, выдающий ту же информацию по частям.

Также полезно почаще использовать свойства самого языка (core features). Например, взятие среза позволяет получить список или другую последовательность за один такт цикла интерпретатора (interpreter's mainloop), благодаря высоко-оптимизированной реализации на Си. Т.е вместо такого кода:

Код
L2 = []
for i in range[3]:
     L2.append(L1[i])


гораздо короче (а заодно и быстрее) будет следующий код:

Код
L2 = list(L1[:3]) # не нужно вызывать list если L1 список.


Далее: встроенные функции для обработки последовательностей (**) такие как map(), zip() и "друзья" могут послужить удобной (и быстрой) заменой для циклов, выполняющих некоторые элементарные операции. Например вот так можно соединить в пары соответствующие элементы двух списков:

Код
>>> zip([1,2,3], [4,5,6])
[(1, 4), (2, 5), (3, 6)]


а так - посчитать синусы для набора чисел:

Код
>>> map( math.sin, (1,2,3,4))
[0.841470984808, 0.909297426826, 0.14112000806,   -0.756802495308]


В этих случаях операция выполняется очень быстро.

Теперь о строковых методах join() и split(). Например если s1..s7 это большие (10K+) строки, то "".join ([s1,s2,s3,s4,s5,s6,s7]) может оказаться значительно быстрее чем более наглядное s1+s2+s3+s4+s5+s6+s7, так как для "сложения" надо вычислить много подвыражений, а join() производёт копирование за один проход (pass). Для замены подстрок пользуйтесь методом replace(). Используйте регулярные выражения только тогда, когда имеете дело с нетривиальными образцами. Используйте операции форматирования строк string % tuple и string % dictionary.

Не бойтесь применять встроенный метод list.sort() и заодно прочтите mini-HOWTO на тему сортировки для более продвинутых примеров. list.sort() beats все остальные способы сортровки, за редким исключением.

Другая известная техника - "проталкивание" циклов внутрь функций или методов. Предположим у Вас есть медленная программа, и Вы с помощью profiler установили, что питоновская функция ff() вызывается много раз. Если Вы видите что ff():

Код
def ff(x):
    ...сделать что-то с x и вычислить result...
    return result


в основном вызывается из циклов таких как:

Код
list = map(ff, oldlist)


или:

Код
for x in sequence:
    value = ff(x)
    ...сделать что-то с value...


то Вы можете избавиться от накладных расходов на вызов функции, если перепишете ff() как:

Код
def ffseq(seq):
    resultseq = []
    for x in seq:
        ...сделать что-то с x и вычислить result...
        resultseq.append(result)
    return resultseq


а оба вызова замените на list = ffseq(oldlist) и:

Код
for value in ffseq(sequence):
    ...сделать что-то с value...


Для вызова ff(x) не из цикла (single calls) придётся использовать ffseq([x])[0], с небольшой потерей производительности. Разумеется, этот способ не всегда приемлем, но существуют иные варианты which you can figure out.

Вы можете получить некоторый плюс к производительности, сохраняя результаты поиска функций и методов (function or method lookup) в локальную переменную. Цикл вида:

Код
for key in token:
    dict[key] = dict.get(key, 0) + 1


осуществляет поиск (resolves) dict.get на каждой итерации. Если Вы не планируете менять этот метод, то более быстрой реализацией может оказаться:

Код
dict_get = dict.get  # найти метод один раз
for key in token:
    dict[key] = dict_get(key, 0) + 1


Аргументы по умолчанию могут использоваться для присваивания значений единожды - во время компиляции, а не во время исполнения. Это может быть сделано для функций и объектов, которые не будут изменяться во время выполнения программы, как например в следующем случае:

Код
def degree_sin(deg):
    return math.sin(deg * math.pi / 180.0)


функцию можно переписать так:

Код
def degree_sin(deg, factor = math.pi/180.0, sin = math.sin):
    return sin(deg * factor)


Поскольку здесь используются аргументы по умолчанию для объектов, которые не должны изменяться, Вам не следует применять этот trick если Вы пишите API для Ваших пользователей.



(*) "нетривиальная" -- так было переведено tough. )
(**) "встроенные функции для обработки последовательностей" -- в оригинале было "functionally-oriented builtins" ))

Это сообщение отредактировал(а) setq - 19.10.2005, 21:23
  Вверх
setq
Дата 20.10.2005, 22:33 (ссылка)    |    (голосов: 0) Загрузка ... Загрузка ... Быстрая цитата Цитата


Unregistered











из Programming FAQ

1.2.6 Как написать функцию, которая возвращает значения в параметрах (вызов по ссылке)?

Помните, что передача аргументов в Питоне - это присваивание. Поскольку присваивание всего лишь создаёт ссылку на объект, то никакой связи между именами фактического и формального параметра нет, следовательно о вызове по ссылке не может идти речи. Но Вы можете добиться схожего эффекта следующими способами.

Вернуть значения в виде кортежа:

Код
def func2(a, b):
    a = 'new-value'        # a и b - локальные имена
    b = b + 1              # которые ссылаются на новые объекты
    return a, b            # верныть новые значения

x, y = 'old-value', 99
x, y = func2(x, y)
print x, y                 # вывод: new-value 100


Это почти всегда самое наглядное решение.

Использование глобальных переменных. Это ненадёжно в многопоточных программах (и не рекомендуется).

Передавать в функцию изменяемый (changeable in-place) объект в качестве параметра:

Код
def func1(a):
    a[0] = 'new-value'     # 'a' ссылается на изменяемый список
    a[1] = a[1] + 1

args = ['old-value', 99]
func1(args)
print args[0], args[1]     # вывод: new-value 100


Передавать в функцию словарь в качестве параметра:

Код
def func3(args):
    args['a'] = 'new-value'     # args - изменяемый словарь
    args['b'] = args['b'] + 1

args = {'a':' old-value', 'b': 99}
func3(args)
print args['a'], args['b']


Упаковать значения в экземпляре класса:

Код
class callByRef:
    def __init__(self, **args):
        for (key, value) in args.items():
            setattr(self, key, value)

def func4(args):
    args.a = 'new-value'        # args - изменяемый экземпляр класса callByRef
    args.b = args.b + 1

args = callByRef(a='old-value', b=99)
func4(args)
print args.a, args.b


Редко возникает необходимость действительно так всё усложнять, так что лучший способ - это вернуть кортеж.

Это сообщение отредактировал(а) setq - 25.10.2005, 19:26
  Вверх
srd
Дата 22.10.2005, 12:19 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Нереварин
**


Профиль
Группа: Участник Клуба
Сообщений: 951
Регистрация: 30.8.2003
Где: Владивосток

Репутация: 7
Всего: 49



1.2.8. Подходит ли Питон начинающим программистам?

Да. Для обсуждения вопросов использования Питона в образовании вы можете присоединиться к почтовой рассылке http://www.python.org/sigs/edu-sig.

Обычно студенты начинают с процедурного языка (или процедурного подмножества языка) со статической типизацией – Паскаль, Си, подмножество Си++ или Java. Более полезным было бы использование Питона в качестве первого языка программирования. Питон имеет очень простой и непротиворечивый синтаксис, обширную стандартную библиотеку и, что самое важное, Питон позволяет сконцентрироваться на таких важных в программировании умениях, как проблемная декомпозиция (problem decomposition) или проектирование типов данных (data type design). Благодаря Питону, студенты могут быстро освоить основные понятия, типа циклов или процедур. Возможно, что они даже с самого первого курса обучения смогут использовать пользовательские объекты (user-defined objects).

Для студентов, никогда раньше не программировавших, языки со статической типизацией (statically typed language) выглядят неестественно. Они вводят дополнительную сложность, которую студенты должны освоить, и снижают скорость обучения. Студенты пытаются думать как компьютер, разбирают проблемы на составные части, проектируют согласующиеся интерфейсы и инкапсулируют данные. Хотя изучение статически типизированных языков важно в долгосрочном плане, это не лучший выбор для новичков в программировании.

Много разных свойств делают Питон подходящим языком для обучения программированию. Как и Java, Питон имеет обширную стандартную библиотеку, что позволяет студентам очень быстро приступить к проектам, делающим что-то полезное. Такие проекты не ограничиваются калькулятором с четырьмя функциями или программой для проверки баланса. Использование стандартной библиотеки позволит студентам получить удовлетворение от работы над реалистичными приложениями. Также это научит их повторному использованию кода. Дополнительные модули типа PyGame очень полезны для расширения кругозора у студентов.

Интерактивный интерпретатор Питона позволяет студентам проверять разные языковые конструкции в процессе программирования. Они могут держать окно интерпретатора открытым, пока набирают исходный код в другом окне. Если они не помнят методы списка, они могут сделать что-то вроде:

Код

>>> L = []
>>> dir(L)
['append', 'count', 'extend', 'index', 'insert', 'pop', 'remove',
'reverse', 'sort']
>>> help(L.append)
Help on built-in function append:

append(...)
    L.append(object) -- append object to end
>>> L.append(1)
>>> L
[1]


Благодаря интерпретатору документация всегда рядом.

Ещё у Питона есть хорошие интегрированные среды разработки (IDE). Например, IDLE – это кросс-платформенная IDE для Питона, написанная на Питоне с использованием Tkinter. PythonWin – это специфичная для Windows IDE. Пользователи Emacs будут счастливы узнать, что у Emacs есть хорошая поддержка Питона. Все эти среды программирования предоставляют подсветку синтаксиса, автоматическое выравнивание, и доступ к интерактивному интерпретатору во время кодирования. Полный список сред программирования для Питона можно найти по адресу http://www.python.org/editors/.




--------------------
Не смей читать мою подпись!!!
PM MAIL Jabber   Вверх
setq
Дата 22.10.2005, 21:21 (ссылка)    |    (голосов: 0) Загрузка ... Загрузка ... Быстрая цитата Цитата


Unregistered











из Programming FAQ

1.2.4 Как правильнее использовать импортирование?

В общих случаях не используйте from modulename import *. Это засоряет пространство имён того, кто импортирует. Некоторые люди избегают этой идиомы даже для тех немногих модулей, которые были спроектированны, чтобы так импортироваться. Это такие модули как Tkinter и threading.

Импортируйте модули at the top of the file (*). Это отвечает на вопрос какие модули требует Ваш код и находится ли имя модуля в области видимости. Запись по одному импорту на строку упрощает добавление и удаление операторов импорта, но множественный импорт будет занимать меньше места на экране.

Хорошая практика, если Вы импортируете модули в следующем порядке:
стандартные библиотечные модули -- например, sys, os, getopt, re
модули сторонних разработчиков (всё что установлено в директории site-packages) -- например, mx.Datetime, ZODB, PIL.Image и т.д
локально созданные модули

Никогда не используйте относительный импорт внутри пакетов. Если Вы пишете модуль package.sub.m1 и хотите импортировать модуль package.sub.m2, не пишите просто import m2, несмотря на то, что это законно. Пишите вместо этого from package.sub import m2. Относительный импорт может привести к повторной инициализации модуля, вызывая confusing bugs.

Иногда бывает необходимо поместить импорт в функцию или класс, чтобы избежать проблем с циклическим импортом. Gordon McMillan советует:

Цитата
Циклический импорт отлично работает, если оба модуля используют форму "import <module>". Но они терпят неудачу, когда второй модуль хочет извлечь имя из первого ("from module import name") и импорт находится на внешнем уровне (at the top level). Это происходит из-за того, что имена первого модуля ещё недоступны, так как первый модуль занят импортом второго.



(от переводчика: следующий текст возможно тоже относится к словам Gordon McMillan, но это невозможно понять из формата FAQ...)


В этом случае, если второй модуль используется только в одной функции, то импорт можно легко поместить в эту функцию. К тому времени как он будет вызван первый модуль уже закончит инициализацию и второй модуль осуществит свой импорт.

Может оказаться необходимым переместить импорт с внешнего уровня кода, если один из модулей платформно-зависимый. В этом случае импорт всех модулей at the top of the file (*) окажется невозможным. В этой ситуации хорошим решением будет импорт нужных модулей в соответствующем платформно-зависимом коде.

Переносите импорт во вложенные области видимости, такие как определения функций, только если Вы столкнулись с проблемой например циклического импорта или если Вы пытаетесь сократить время инициализации модуля. Эта техника полезна, если многие из импортов не являются необходимыми и зависят от того как программа будет исполняться. Вы также можете поместить импорт в функцию, если конкретные модули используются только в этой функции. Обратите внимание, что загрузить модуль в первый раз может оказаться дорого из-за задержки на инициализацию модуля, однако повторные загрузки виртуально "бесплатны", они стоят только пары поисков в словарях. Даже если имя модуля исчезло из области видимости, модуль скорее всего до сих пор находится в sys.modules.

Если модуль используют только экземпляры определённого класса, то будет разумно импортировать модуль в методе __init__ и затем связывать переменную экземпляра с этим модулем, чтобы таким образом модуль был всегда доступен (через эту переменную) во время жизни объекта. Обратите внимание: чтобы отложить импорт до инициализации первого экземпляра этого класса, импорт должен быть помещён внутрь метода. Помещение импорта внутри класса, но вне метода, приведёт к тому, что импорт произойдёт во время инициализации модуля.


(*) "at the top of the file" -- хммм. пойди разберись что имеется в виду: в начале файла или на внешнем уровне кода?! или может быть и то и другое? ))))

Это сообщение отредактировал(а) setq - 22.10.2005, 21:34
  Вверх
setq
Дата 23.10.2005, 09:02 (ссылка)    |    (голосов: 0) Загрузка ... Загрузка ... Быстрая цитата Цитата


Unregistered











из Programming FAQ

1.2.5 Как передать дополнительные или именованные параметры (optional or keyword parameters) из одной функции в другую?

Получить такие параметры можно с помощью спецификаторов * и ** в списке аргументов функции; они возвращают кортеж позиционных аргументов и словарь именованых параметров. После этого Вы можете передать их в другую функцию используя в её вызове * и **:

Код
def f(x, *tup, **kwargs):
        ...
        kwargs['width']='14.3c'
        ...
        g(x, *tup, **kwargs)


В случае если Вас беспокоит совместимость с версиями ниже 2.0, используйте 'apply':

Код
def f(x, *tup, **kwargs):
        ...
        kwargs['width']='14.3c'
        ...
        apply(g, (x,)+tup, kwargs)


Это сообщение отредактировал(а) setq - 25.10.2005, 19:27
  Вверх
srd
Дата 23.10.2005, 10:06 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Нереварин
**


Профиль
Группа: Участник Клуба
Сообщений: 951
Регистрация: 30.8.2003
Где: Владивосток

Репутация: 7
Всего: 49



1.4.1. Почему в Питоне для группировки инструкций используется выравнивание?

Guido van Rossum считает, что использование выравнивания для группировки очень элегантно, и делает обычные программы на Питоне более ясными. Большинству людей через некоторое время начинает нравиться эта особенность.

Т.к. начальных/конечных скобок в языке нет, то нет и расхождений в восприятии кода между транслятором и человеком. Часто программисты на Си сталкиваются с кусками кода вида:
Код

if (x <= y)
        x++;
        y--;
z++;

Если условие истинно, то выполняется только инструкция x++, но выравнивание заставляет вас верить в обратное. Даже опытные программисты на Си иногда могут потратить много времени, разбираясь, почему y уменьшается на единицу даже если x > y.

Благодаря отсутствию начальных/конечных скобок Питон гораздо меньше способствует появлению конфликтов в выборе стиля кодирования. В Си можно размещать скобки самым разным образом. Если вы читаете и пишете код, использующий один стиль, вы будете испытывать неудобства в восприятии кода (или от требования писать код) с другим стилем.

Многие стили кодирования требуют для скобок отдельных строк кода. Это делает программы длиннее, тратит экранное пространство, затрудняет обзор программы. В идеальном случае функция должна помещать в экран (примерно 20-30 строк). 20 строк кода на Питоне могут выполнять гораздо больше работы, чем 20 строк кода на Си. Это не только благодаря отсутствию скобок, но и благодаря отсутствию объявлений и благодаря типам данных высокого уровня. Но синтаксис, основанный на выравнивании, здесь действительно помогает.

1.4.2. Почему вычисления с плавающей точкой такие неточные?

Люди часто удивляются результатам вида:
Код

>>> 1.2-1.0
0.199999999999999996

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

В десятичной математике существует много чисел, которые не могут быть представлены конечным числом десятичных чисел, например 1/3 = 0.3333333333.......

Если основание равно двум, то 1/2 = 0.1, 1/4 = 0.01, 1/8 = 0.001 и так далее. 0.2 = 2/10 = 1/5,
Получается двоичное дробное число 0.001100110011001…

Числа с плавающей точкой имеют только 32 или 64 бита точности. Т.е. цифры с некоторой позиции обрезаются, и конечное десятичное число будет выглядеть как 0.199999999999999996, а не 0.2

Функция repr() выводит такое количество цифр, которое необходимо для того, чтобы выражение eval(repr(f)) == f было истинным для любого f с плавающей точкой. Функция str() выводит меньше цифр, что приводит к менее осмысленным результатам, чем ожидалось:
Код

>>> 0.2
0.20000000000000001
>>> print 0.2
0.2

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

Следствием является опасность сравнивания результата некоторых вычислений с вещественным числом с помощью оператора ==! Малейшие расхождения приведут к тому, что оператор == не сработает. Вместо этого, вы должны проверять, что разность двух чисел меньше, чем некоторая пороговая величина.
Код

epsilon = 0.0000000000001 # Tiny allowed error
expected_result = 0.4

if expected_result-epsilon <= computation() <= expected_result+epsilon:
   ...

Пожалуйста, прочитайте раздел, посвящённый арифметике с плавающей точкой, в учебном пособии по Питону, для получения более подробной информации.

===
добавлено setq: в версии Питона 2.4 появился модуль Decimal, предназначеный для решения проблем, связаных с неточностью десятичных вычислений

Это сообщение отредактировал(а) setq - 23.10.2005, 11:39


--------------------
Не смей читать мою подпись!!!
PM MAIL Jabber   Вверх
setq
Дата 24.10.2005, 22:44 (ссылка)    |    (голосов: 0) Загрузка ... Загрузка ... Быстрая цитата Цитата


Unregistered











из Programminf FAQ

1.7.5 Когда я редактирую импортированный модуль а затем перезагружаю его, изменения невидны. Почему?

Из соображений эффективности а также стабильности (consistency) Питон прочитывает модуль только во время первого импорта. В противном случае, в программе состоящей из многих модулей, где каждый модуль подгружает один и тот же базовый модуль, базовый модуль разбирался бы (parsed and re-parsed) (*) много раз. Чтобы явно переимпортировать изменённый модуль, делайте так:

Код
import modname
reload(modname)


Осторожно: этот способ не на 100% fool-proof. В частности, модули, которые содержат утверждения:

Код
from modname import some_objects


продолжат работать со старыми версиями импортированных объектов. Если в модуле есть определение класса, существующие экземпляры этого класса не будут updated на использование нового определения класса. Это может привести к следующему парадоксальному поведению:

Код
>>> import cls
>>> c = cls.C()                # создать экземпляр класса C
>>> reload(cls)
<module 'cls' from 'cls.pyc'>
>>> isinstance(c, cls.C)       # не является экземпляром C?!?
False


Суть проблемы становится ясной, если Вы распечатаете класс объекта:

Код
>>> c.__class__
<class cls.C at 0x7352a0>
>>> cls.C
<class cls.C at 0x4198d0>




(*) "parsed and re-parsed" -- так и хотелось написать "парсился бы и перепарсивался бы" smilesmilesmile
  Вверх
setq
Дата 25.10.2005, 17:24 (ссылка)    |    (голосов: 0) Загрузка ... Загрузка ... Быстрая цитата Цитата


Unregistered











из Programming FAQ

1.3.5 Как изменить строку в памяти (in place)?

Никак, потому что строки неизменяемы. Если Вам нужен объект с таким свойством, попробуйте преобразовать строку в список или воспользуйтесь модулем array:

Код
>>> s = "Hello, world"
>>> a = list(s)
>>> print a
['H', 'e', 'l', 'l', 'o', ',', ' ', 'w', 'o', 'r', 'l', 'd']
>>> a[7:] = list("there!")
>>> ''.join(a)
'Hello, there!'

>>> import array
>>> a = array.array('c', s)
>>> print a
array('c', 'Hello, world')
>>> a[0] = 'y' ; print a
array('c', 'yello world')
>>> a.tostring()
'yello, world'


1.3.6 Как вызвать функцию/метод имя которого сохранено в строке?

Способов несколько.

Лучший из них - использование отображения (dictionary) строк в функции. Главным достоинством этой техники является то, что строкам не обязательно быть именами функций. Это также основной способ для имитации конструкции case:

Код
def a():
    pass

def b():
    pass

dispatch = {'go': a, 'stop': b}  # Внимание: имена функций записаны
                                 #  без завершающих круглых скобок

dispatch[get_input()]()  # Внимание: завершающие круглые скобки
                         #  вызывают функцию


Встроенная функция getattr():

Код
import foo
getattr(foo, 'bar')()


getattr() применима к любому объекту, включая классы, экземпляры классов, модули и т.д

В стандартной библиотеке можно найти нечто в этом роде:

Код
class Foo:
    def do_foo(self):
        ...

    def do_bar(self):
        ...

 f = getattr(foo_instance, 'do_' + opname)
 f()


Можно также использовать locals() или eval() для нахождения функции по имени:

Код
def myFunc():
    print "hello"

fname = "myFunc"

f = locals()[fname]
f()

f = eval(fname)
f()


Осторожно: eval() - медленная и опасная функция. Если Вы не проверяете строку, то кто-то манипулируя с вводом сможет запустить на исполнение любую функцию.

Это сообщение отредактировал(а) setq - 25.10.2005, 17:33
  Вверх
setq
Дата 25.10.2005, 23:17 (ссылка)    |    (голосов: 0) Загрузка ... Загрузка ... Быстрая цитата Цитата


Unregistered











из Programming FAQ

1.4.5 Как создать в Питоне массив?

Используйте список:

Код
["this", 1, "is", "an", "array"]


Списки эквивалентны по скорости (in their time complexity) массивам в C или Pascal (обсуждается здесь); основное различие в том, что питоновские списки могут содержать в себе объекты разных типов.

Модуль array позволяет создавать массивы определённого типа с компактным хранением (compact representations), но такие массивы индексируются медленнее, чем списки (*). Кроме того такие расширения как Numeric также определяют похожие на массивы структуры с разнообразными свойствами.

Чтобы получить списки в стиле Lisp можно эмулировать cons-ячейки с помощью кортежей:

Код
lisp_list = ("like",  ("this",  ("example", None) ) )


Если Вам требуется mutability - можете использовать списки вместо кортежей. Аналогом car в lisp будет lisp_list[0], а аналогом cdr - lisp_list[1]. Но используйте это только если Вам такие списки в самом деле нужны, потому что обычно это намного медленнее, чем using питоновские списки.

1.4.6 Как создать многомерный список (multidimensional list)?

Вы наверно пытались сделать многомерный массив как-то вроде этого:

Код
A = [[None] * 2] * 3


Если его распечатать, то кажется, будто всё в порядке:

Код
>>> A
[[None, None], [None, None], [None, None]]


Но если Вы добавляете в него значение, оно появляется в нескольких местах:

Код
>>> A[0][0] = 5
>>> A
[[5, None], [5, None], [5, None]]


Дело в том, что повторение списка с помощью * не создаёт копий, оно создаёт только ссылки на уже существующие объекты. *3 создаст список, содержащий 3 ссылки на один и тот же список длиной в 2 элемента. Изменения произведённые над одной строкой затронут все строки, а это почти наверняка не то что Вы хотели.

Предлагаемое решение - сначала создать список нужной длинны, а затем заполнить его списками (создаваемыми заново):

Код
A = [None]*3
for i in range(3):
     A[i] = [None] * 2


Этот код сгенерирует список из 3 различных списков длиной в 2 элемента. Вы можете также использовать list comprehension:

Код
w,h = 2,3
A = [ [None]*w for i in range(h) ]


Или воспользоваться расширением, предоставляющим такой тип как matrix; самое известное: Numeric Python.


(*) "но такие массивы индексируются медленнее, чем списки" -- что, правда? интересно, засчёт чего?

Это сообщение отредактировал(а) setq - 26.10.2005, 09:23
  Вверх
setq
Дата 27.10.2005, 12:15 (ссылка)    |    (голосов: 0) Загрузка ... Загрузка ... Быстрая цитата Цитата


Unregistered











1.2.12 Можно ли на Питоне составить выражение, которое трудно прочитать (obfuscated one-liners)?

Да. Обычно, это делается вкладыванием lambda-функций в lambda-функции. Вот 3 примера due to Ulf Bartelt:

Код
# Простые числа < 1000
print filter(None,map(lambda y:y*reduce(lambda x,y:x*y!=0,
map(lambda x,y=y:y%x,range(2,int(pow(y,0.5)+1))),1),range(2,1000)))

# Первые 10 чисел Фибоначчи
print map(lambda x,f=lambda x,f:(x<=1) or (f(x-1,f)+f(x-2,f)): f(x,f),
range(10))

# Множество Мандельброта
print (lambda Ru,Ro,Iu,Io,IM,Sx,Sy:reduce(lambda x,y:x+y,map(lambda y,
Iu=Iu,Io=Io,Ru=Ru,Ro=Ro,Sy=Sy,L=lambda yc,Iu=Iu,Io=Io,Ru=Ru,Ro=Ro,i=IM,
Sx=Sx,Sy=Sy:reduce(lambda x,y:x+y,map(lambda x,xc=Ru,yc=yc,Ru=Ru,Ro=Ro,
i=i,Sx=Sx,F=lambda xc,yc,x,y,k,f=lambda xc,yc,x,y,k,f:(k<=0)or (x*x+y*y
>=4.0) or 1+f(xc,yc,x*x-y*y+xc,2.0*x*y+yc,k-1,f):f(xc,yc,x,y,k,f):chr(
64+F(Ru+x*(Ro-Ru)/Sx,yc,0,0,i)),range(Sx))):L(Iu+y*(Io-Iu)/Sy),range(Sy
))))(-2.1, 0.7, -1.2, 1.2, 30, 80, 24)
#    \___ ___/  \___ ___/  |   |   |__ строк на экране
#        V          V      |   |______ колонок на экране
#        |          |      |__________ максимум "итераций"
#        |          |_________________ range on y axis
#        |____________________________ range on x axis


Don't try this at home, kids! (*)


1.3 Числа и строки

1.3.1 Как определять шестнадцатиричные и восьмиричные целые?

Чтобы задать восьмеричное целое поставьте перед числом 0. Например, чтобы присвоить в "a" восьмеричное значение "10" (8 в десятичном счислении), введите:

Код
>>> a = 010
>>> a
8


Шестнадцатиричные числа задаются так же просто. Поставьте перед значением 0, а затем строчную или прописную "x". Шестнадцатиричные цифры могут быть как в нижнем так и в верхнем регистре. Например, наберите в интерпретаторе:

Код
>>> a = 0xa5
>>> a
165
>>> b = 0XB2
>>> b
178


1.3.2 Почему -22 / 10 возвращает -3?

В первую очередь это продиктовано желанием иметь для i%j тот же знак что и у j. Если Вам нужно именно такое поведение % и в то же время Вы хотите чтобы соблюдалось:

Код
i == (i/j)*j + (i%j)


в таком случае целочисленное деление должно возвращать наименьшее целое (floor). Язык C также предполагает истинность этого равенства, и поэтому компиляторы, которые truncate i/j (**) должны сохранить для i%j тот же знак что и у числа i.

В действительности, существует не так много случаев, когда нужно вычислить i%j при отрицательном j. Когда j положительное, такие случаи есть и фактически в каждом из них выгоднее чтобы i%j было >= 0. Допустим, если на часах 10, то сколько на них было 200 часов назад? -190 % 12 == 2 даёт полезный результат, а -190 % 12 == -10 - притаившийся в засаде баг.

1.3.3 Как преобразовать строку в число?

Для целых чисел используйте встроенный конструктор int(), например int('144') == 144. Аналогично, float() осуществляет преобразование в число с плавающей запятой, например float('144') == 144.0.

По умолчанию, эти конструкторы интерпретируют числа в десятичной системе, поэтому int('0144') == 144, а int('0x144', 16) возбуждает исключение ValueError. int(string, base) использует второй необязательный аргумент как базу счисления, поэтому int('0x144', 16) == 324 (***). Если аргумент base равен нулю, число интерпретируется исходя из правил Питона: ведущий '0' означает восьмеричную, а '0x' шестнадцатиричную константу.

Не используйте встроенную функцию eval() если всё что Вам нужно это преобразовать строку в число. потому что eval() выполняется значительно медленнее и может представлять проблему безопасности: кто-то может передать Вам питоновское выражение с нежелательным побочным действием (unwanted side effects). Например, выполнение __import__('os').system("rm -rf $HOME") удалит всё в вашей домашней директории.

eval() интерпретирует числа как выражения Питона, поэтому например eval('09') выдаёт синтаксическую ошибку так как Питон считает числа начинающиеся c '0' восьмеричными (база == 8).

1.3.4 Как преобразовать число в строку?

Чтобы преобразовать например число 144 к строке '144', используйте встроенную функцию str(). Если Вы хотите шестнадцатиричное или восьмеричное представление, используйте встроенные функции hex() и oct(). Для продвинутого (fancy) форматирования используйте строковую операцию %, например "%04d" % 144 вычислится в '0144', а "%.3f" % (1/3.0) - в '0.333'. Загляните в руководство по стандартной библиотеке чтобы почитать об этом подробнее.


(*) вот что получилось у меня:
Код
BBBBBBBBBBBBBBBCCCCCCCCCCCCCDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDCCCCCCCCCCCCCCC
BBBBBBBBBBBBBCCCCCCCCCDDDDDDDDDDDDDDDDDDDDDDDDEEEEEEFGJJHFFFEEEEEDDDDDCCCCCCCCCC
BBBBBBBBBBBCCCCCCCDDDDDDDDDDDDDDDDDDDDDDDEEEEEEEEEFFFGHJPJKL_FEEEEEEDDDDDDDCCCCC
BBBBBBBBBCCCCCCDDDDDDDDDDDDDDDDDDDDDDEEEEEEEEEEFFFFGHIJZR_QJIGFFFEEEEEEDDDDDDDCC
BBBBBBBBCCCCDDDDDDDDDDDDDDDDDDDDDDEEEEEEEEEEFFFGGGHIKP______SKHGFFFFFEEEEDDDDDDD
BBBBBBBCCCDDDDDDDDDDDDDDDDDDDDEEEEEEEEEFFFHHIXIIIIJKLO______NKJJIHGGGHSGFEEDDDDD
BBBBBBCCDDDDDDDDDDDDDDDDDDDEEEEEFFFFFFFGGHIM___R_________________PLN[SQXIFEEDDDD
BBBBBCDDDDDDDDDDDDDDDDEEEFFFFFFFFFFFGGGHIKMNS_________________________UIGGFEEDDD
BBBBBDDDDDDDDDDEEEEEFFGHOIHHHHHHHHHHHHIJLP____________________________RKJPGFEEDD
BBBBDDDDEEEEEEEEEFFFFGGHJM___LNW_ONKJJKNY______________________________SKHGFEEED
BBBBDEEEEEEEEEFFFFFFGHHJLOT__________QPZ_________________________________HFFEEEE
BBBDEEEEEEEFGGGGHHHJM_QNS______________________________________________[HGFFEEEE
BBB_________________________________________________________________QLIHGFFFEEEE
BBBDEEEEEEEFGGGGHHHJM_QNS______________________________________________[HGFFEEEE
BBBBDEEEEEEEEEFFFFFFGHHJLOT__________QPZ_________________________________HFFEEEE
BBBBDDDDEEEEEEEEEFFFFGGHJM___LNW_ONKJJKNY______________________________SKHGFEEED
BBBBBDDDDDDDDDDEEEEEFFGHOIHHHHHHHHHHHHIJLP____________________________RKJPGFEEDD
BBBBBCDDDDDDDDDDDDDDDDEEEFFFFFFFFFFFGGGHIKMNS_________________________UIGGFEEDDD
BBBBBBCCDDDDDDDDDDDDDDDDDDDEEEEEFFFFFFFGGHIM___R_________________PLN[SQXIFEEDDDD
BBBBBBBCCCDDDDDDDDDDDDDDDDDDDDEEEEEEEEEFFFHHIXIIIIJKLO______NKJJIHGGGHSGFEEDDDDD
BBBBBBBBCCCCDDDDDDDDDDDDDDDDDDDDDDEEEEEEEEEEFFFGGGHIKP______SKHGFFFFFEEEEDDDDDDD
BBBBBBBBBCCCCCCDDDDDDDDDDDDDDDDDDDDDDEEEEEEEEEEFFFFGHIJZR_QJIGFFFEEEEEEDDDDDDDCC
BBBBBBBBBBBCCCCCCCDDDDDDDDDDDDDDDDDDDDDDDEEEEEEEEEFFFGHJPJKL_FEEEEEEDDDDDDDCCCCC
BBBBBBBBBBBBBCCCCCCCCCDDDDDDDDDDDDDDDDDDDDDDDDEEEEEEFGJJHFFFEEEEEDDDDDCCCCCCCCCC

красота ))

(**) "truncate i/j" -- я так понял это означает "берут у i/j все цифры до десятичной точки", советовался у нас на работе с математиками - они вроде подтверждают. но я не на 100% уверен.

(***) "int('0x144', 16) == 324" -- равно как и int('144', 16)

Это сообщение отредактировал(а) setq - 27.10.2005, 12:39
  Вверх
srd
Дата 27.10.2005, 16:49 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Нереварин
**


Профиль
Группа: Участник Клуба
Сообщений: 951
Регистрация: 30.8.2003
Где: Владивосток

Репутация: 7
Всего: 49



1.4.3. Почему строки в Питоне не изменяемы?

Тому есть несколько причин.

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

Во-вторых, в Питоне строка считается таким же простейшим типом, как и число. Ничто не может превратить значение 8 во что-то другое. И в Питоне ничто не может превратить строку «восемь» во что-то ещё.

1.4.4. Почему использование self должно быть явным в определениях и вызовах методов?

Эта идея была заимствована из Модулы-3, и она оказалась очень полезной по нескольким причинам:

Во-первых, это делает более понятным то, что вы используете метод или атрибут экземпляра, а не локальную переменную. При чтении self.x и self.meth() становится абсолютно понятно, что это переменная экземпляра и метод, даже если вы не знаете определение класса наизусть. В Си++ вы можете это понять по отсутствию объявления локальной переменной (предположим, что глобальные переменный малочисленны и легко узнаваемы), но в Питоне объявлений локальных определений не существует, потому для уверенности вы должны были бы искать определение класса. Некоторые стандарты кодирования для Си++ или Явы требуют использования префикса m_ для атрибутов экземпляра, т.е. подобная ясность полезна и в этих языках.

Во-вторых, это означает, что для ссылки или вызова метода из конкретного класса не нужен специальный синтаксис. В Си++ для использования метода базового класса, переопределённого в производном классе, используется оператор ::, а в Питоне вы можете написать baseclass.methodname(self, <список аргументов>). Это особенно полезно для вызова метода __init__() и в случае, если метод производного класса хочет расширить метод базового класса с тем же именем, и для этого каким-либо образом его вызывает.

Наконец, это решает синтаксическую проблему с присваиванием переменным экземпляра. Т.к. в Питоне локальные переменные – это переменные, которым присвоено значение в теле функции, и которые не объявлены глобальными явно, то должен быть аналогичный способ указать интерпретатору, что инструкция присваивания означает присваивание переменной экземпляра, а не локальной переменной, и способ должен быть синтаксическим (по соображениям эффективности). В Си++ используются объявления, а в Питоне объявлений нет, и было бы нежелательно их вводить только ради этой цели. Явное использование self.var прекрасно с этим справляется. Также явное написание «self.var» для переменных экземпляра означает, что для ссылки на неквалифицированные имена внутри метода не нужен поиск в instance’s directories (директориях экземпляра?). Другими словами, локальные переменные и переменные экземпляра живут в двух разных пространствах имён, и вы должны указать Питону, какое пространство имён использовать.

1.4.5. Почему я не могу в выражениях использовать присваивание?

Многие люди, работавшие с Си или Perl, жалуются на то, что они хотели бы использовать идиому Си:
Код

while (line = readline(f)) {
    … делаем что-то…
}

но в Питоне вынуждены писать так:
Код

while True:
    line = f.readline()
    if not line:
        break
    …делаем что-то…

Причиной запрета присваивания в выражениях является распространённая и плохо обнаруживаемая в других языках ошибка, к которой приводит следующая инструкция:
Код

if (x = 0) {
    ...обработка ошибок...
}
else {
    ...код, работающий только с ненулевым значением x...
}

Это обычная опечатка: было написано x = 0, присваивание 0 переменной x, когда хотели сравнение x == 0.

Было предложено множество вариантов, большинство из которых использовало произвольный или загадочный синтаксис или ключевые слова, что нарушало простое требование к предложениям по изменению языка: конструкция должна быть интуитивно понятной для человека, ещё с ней не знакомой.

Интересно, что наиболее опытные программисты на Питоне распознают идиому «while True» и не особо скучают по отсутствию присваивания в выражениях. Только новички испытывают сильное желание добавить эту возможность в язык.

Есть другой вариант, выглядящий привлекательно, но менее ясный, чем решение «while True»:
Код

line = f.readline()
while line:
    ...здесь что-то делаем...
    line = f.readline()

Проблема в том, что если вы захотите изменить способ получения следующей строки (например, захотите использовать sys.stdin.readline()), то вам потребуется внести изменения в двух участках вашей программы, и второе вхождение скрыто в конце цикла.

Лучшим подходом будет использование итераторов, позволяющих перебирать объекты с помощью инструкции for. Например, в текущей версии Питона файловые объекты поддерживают итераторы, и вы можете теперь просто писать:
Код

for line in f:
    ... здесь что-нибудь делаем...


1.4.6. Почему для одной функциональности используются методы (например list.index()), а для другой – функции (например len(list))?

В основном по историческим причинам. Функции используются для тех операций, которые являются общими для группы типов, и которые применимы к объектам, вообще не имеющим методов (например, кортежи). Если вы используете функциональные свойства Питона (map(), apply() и т.д.), то удобно иметь функцию, применимую к аморфным коллекциям объектов.

На самом деле, реализация len(), max(), min() как встроенных функций займёт меньше кода, чем реализация их как методов для каждого отдельного типа. Кто-то может спорить о частных случаях, но это часть Питона, и уже поздно делать такие фундаментальные изменения. Функции оставлены во избежание множества нарушений в коде.

Обратите внимание, что операции над строками в Питоне перемещены из внешних функций (модуль string) в методы. Но len() осталась функцией.



--------------------
Не смей читать мою подпись!!!
PM MAIL Jabber   Вверх
setq
Дата 28.10.2005, 14:02 (ссылка)    |    (голосов: 0) Загрузка ... Загрузка ... Быстрая цитата Цитата


Unregistered











1.2.1 Как из функции получить доступ к глобальной переменной?

Вы пытаетесь сделать нечто подобное?

Код
x = 1 # make a global

def f():
      print x # try to print the global
      ...
      for j in range(100):
           if q>3:
              x=4


Любая переменная, которой присваивается значение внутри функции считается локальной. Поскольку в последней строчке x связывается со значением, компилятор (*) полагает, что x локальная переменная. Следовательно print x пытается напечатать неинициализированную локальную переменную, что результируется в NameError (**).

Решение: вставить явное объявление global в начале функции:

Код
def f():
      global x
      print x # try to print the global
      ...
      for j in range(100):
           if q>3:
              x=4


Теперь любое упоминание x будет интерпретироваться как ссылка на x из пространства имён модуля.

1.2.2 Как определяются локальные и глобальные переменные в Питоне?

В Питоне переменные, которые упоминаются в теле функции [но им ничего не присваивается] - глобальные. Если переменной присваивается новое значение где-либо в функции, она считается локальной (***). Если Вы хотите изменить глобальную переменную, Вы должны объявить её явно с помощью 'global'.

Хотя это [выборочное объявление global] сначала кажется странным, всё проясняется если немного поразмыслить. С одной стороны, требование явного объявления global для всех имён, которым присваиваются значения, позволяет защититься от нежелательного побочного эффекта. С другой - если бы global был нужен для всех ссылок на глобальные имена, Вам пришлось бы использовать его всё время. Вам пришлось бы объявлять как global все встроенные функции и компоненты (component) импортированных модулей. Подобный хаос свёл бы на нет всю пользу от использования global как средства для защиты от побочных эффектов.

1.2.3 Как организовать совместный доступ к глобальным переменным для нескольких модулей?

Канонический способ организовать подобный доступ - это создать отдельный модуль (часто называемый config или cfg). Просто добавьте import config в каждый модуль Вашего приложения; при этом модуль становится доступен через глобальное имя. Поскольку существует только один экземпляр модуля, любые изменения произведённые в модуле отражаются везде. Например:


config.py:

Код
x = 0   # Default value of the 'x' configuration setting


mod.py:

Код
import config
config.x = 1


main.py:

Код
import config
import mod
print config.x


По тем же соображениям, модули можно использовать как основу для имплементации Singleton design pattern.


(*) "компилятор" -- компилятор?!!
(**) "результируется в NameError" -- в моём случае выбрасывается UnboundLocalError (python 2.4.2)
(***) вероятно чтобы подчеркнуть всю важность этого утверждения, автор решил повторить его дважды. )) думаю, это лишнее.

Это сообщение отредактировал(а) setq - 28.10.2005, 14:08
  Вверх
setq
Дата 28.10.2005, 22:17 (ссылка)    |    (голосов: 0) Загрузка ... Загрузка ... Быстрая цитата Цитата


Unregistered











1.2.8 Как в Питоне получить копию объекта?

В большинстве случаев подойдёт copy.copy() или copy.deepcopy(). Не любой объект можно скопировать, но большинство - можно.

Некторые объекты копируются проще. У словарей есть метод copy():

Код
newdict = olddict.copy()


Последовательности можно копировать взятием среза:

Код
new_l = l[:]


1.2.9 Как узнать методы и атрибуты объекта?

Для x - экземпляра пользовательского класса - вызов dir(x) возвращает отсортированный в алфавитном порядке список аттрибутов x а также методов и атрибутов, принадлежащих классу.
  Вверх
srd
Дата 31.10.2005, 11:50 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Нереварин
**


Профиль
Группа: Участник Клуба
Сообщений: 951
Регистрация: 30.8.2003
Где: Владивосток

Репутация: 7
Всего: 49



1.4.7. Почему join() является методом строки, а не списка или кортежа?

В Питоне версии 1.6 для строк были добавлены методы, предоставляющие ту же функциональность, что и функции в модуле string. Теперь строки на много более похожи на другие стандартные типы. Использование большинства этих методов стало широко распространённым. Но один из них заставляет некоторых программистов чувствовать себя некомфортно:
Код

", ".join(['1', '2', '4', '8', '16'])

Результатом выполнения строки кода выше будет:
Код

"1, 2, 4, 8, 16"

Против подобного кода обычно приводят два аргумента.

Первый звучит так: «Это действительно странно применять метод к строковому литералу (строковой константе)». На что можно ответить, что строковой литерал – это просто постоянное значение. Не существует логичного объяснения, почему можно применять методы к идентификаторам, связанными со строками, но нельзя делать тоже с литералами.

Второе возражение обычно звучит так: «Операция объединения членов последовательности в строковую константу должна применяться к ПОСЛЕДОВАТЕЛЬНОСТИ». На самом деле нет. По некоторым причинам гораздо меньше трудностей возникаем с использованием split() как строковым методом. Здесь легче увидеть, что
Код

"1, 2, 4, 8, 16".split(", ")

предписывает символьному литералу вернуть список подстрок, полученный с использованием указанного разделителя (по умолчанию – пробел). Тогда строка в UNICODE вернёт список строк в UNICODE, а строка в ASCII вернёт список строк в ASCII, и все будут счастливы.

join() является строковым методом, потому что этот метод предписывает строке-разделителю перебрать элементы последовательности, получить символьное представление каждого элемента, и между ними вставить себя. Этот метод может быть использован с любыми аргументами, которые удовлетворяют требованиям к объектам-последовательностям, включая любые новые классы, определёнными вами.

Т.к. join() – это строковой метод, то он может работать как со строками в UNICODE, так и с простыми строками в ASCII. Если бы join() был бы методом последовательности, то последовательность должна была бы решать на основе типа строки-разделителя, какой тип строки использовать.

Если ни один из этих аргументов вас не убедил, то вы можете продолжать использовать функцию join() из модуля string:
Код

string.join(['1', '2', '4', '8', '16'], ", ")




--------------------
Не смей читать мою подпись!!!
PM MAIL Jabber   Вверх
srd
Дата 1.11.2005, 08:26 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Нереварин
**


Профиль
Группа: Участник Клуба
Сообщений: 951
Регистрация: 30.8.2003
Где: Владивосток

Репутация: 7
Всего: 49



1.4.8. Как быстры исключения?

Сам по себе блок try/except очень эффективен. Но обработка исключения обходится дорого. В версиях Питона младше 2.0 часто использовалась следующая идиома:
Код

try:
    value = dict[key]
except KeyError:
    dict[key] = getvalue(key)
    value = dict[key]

Это имело смысл только в том случае, если dict почти всегда содержал нужный ключ. В противном случае вы писали бы что-то вроде:
Код

if dict.has_key(key):
    value = dict[key]
else:
    dict[key] = getvalue(key)
    value = dict[key]

(В Питоне 2.0 и выше вы можете написать value = dict.setdefault(key, getvalue(key)).)

1.4.9. Почему в Питоне нет инструкции switch или case?

Вы достаточно легко можете обойтись последовательностью if… elif… elif… else. Существует несколько предложений по поводу синтаксиса инструкции switch, но пока нет согласия, где и как задавать диапазоны тестов. Обратитесь к документу PEP 275 (http://www.python.org/peps/pep-0275.html), что бы узнать текущий статус или получить подробности.
Если вам требуется осуществить выбор из очень большого количества вариантов, вы vожете создать словарь, проецирующий варианты в вызовы функций. Например:
Код

def function_1 (...):
    ...

functions = {'a': function_1,
             'b': function_2, 
             'c': self.method_1, ...}

func = functions[value]
func()

Кроме того, для вызова методов объекта, вы можете воспользоваться встроенной функцией getattr() для получения метода по его имени.
Код

def visit_a (self, ...):
    ...
...

def dispatch (self, value):
    method_name = 'visit_' + str(value)
    method = getattr(self, method_name)
    method()

Здесь предполагается, что вы для именования методов используете некоторый префикс, например visit_, как в примере. Без префикса, если значения аргументов приходят из сомнительного источника, атакующий получает возможность вызвать любой метод вашего объекта.

1.4.10. Не лучше было бы эмулировать потоки в интерпретаторе, а не надеяться на реализацию потоков, зависящую от операционной системы?

Ответ 1: К сожалению, интерпретатор проталкивает по крайней мере один кадр стека Си для каждого кадра стека Питона. Кроме того, исключения могут обратно вызвать Питон практически в произвольный момент времени. Поэтому полная реализация многопоточности требует поддержки со стороны Си.
Ответ 2: К счастью, существует Stackless Python (http://www.stackless.com/), представляющий из себя полностью перепроектированный цикл интерпретатора, не затрагивающий стека Си. Он всё ещё экспериментальный, но выглядит очень многообещающе. Хотя существует бинарная совместимость со стандартным Питоном, пока неясно, станет ли Stackless частью ядра – возможно, это слишком революционно.

1.4.11 Почему лямбда-форма не может содержать инструкции?

В Питоне лямбда-формы не могут содержать инструкции, потому что в Питоне синтаксический фреймворк не может управляться с инструкциями, вложенными в выражения. Однако это не такая уж серьёзная проблема. В отличие от лямбды в других языках программирования, лямбда в Питоне – это только короткая форма записи для случая, когда вам лень определить функцию.
В Питоне функции всегда являются объектами первого класса, и могут быть объявлены в локальной области действия. Единственное преимущество использования лямбды вместо объявленной локально функции, это то, что вам не требуется вводить имя для функции – но ведь это просто локальная переменная, которой присвоен объект-функция, имеющий тот же тип, что и лямбда.

Это сообщение отредактировал(а) srd - 1.11.2005, 09:36


--------------------
Не смей читать мою подпись!!!
PM MAIL Jabber   Вверх
srd
Дата 4.11.2005, 11:17 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Нереварин
**


Профиль
Группа: Участник Клуба
Сообщений: 951
Регистрация: 30.8.2003
Где: Владивосток

Репутация: 7
Всего: 49



1.4.12. Можно ли скомпилировать в машинный код, Си или любой другой язык программу на Питоне?

Не всё так просто. Высокоуровневые типы данных, динамическая типизация объектов и вызовы интерпретатора (с помощью eval() или exec()) во время исполнения – всё это вместе приводит к тому, что «скомпилированная» программа на Питоне будет состоять в основном из вызовов питоновской библиотеки времени выполнения, даже для выглядящих простыми операций вида x+1.

Существует несколько проектов, обсуждавшихся в питоновской группе новостей и на прошедших конференциях, посвящённых Питону, которые показали, что подобная реализация возможна, но увеличение (например, двукратное) скорости выполнения очень незначительно. Jython использует похожий принцип для компиляции в байт-код Java. (Jim Hugunin продемонстрировал это совместно с анализом всей программы, тысячекратное увеличение скорости достижимо для маленьких демонстрационных программ. За подробностями обратитесь к протоколам конференции по Питону 1997 года).

Исходный код на Питоне всегда транслируется в байт-код, и этот байт-код исполняется питоновской виртуальной машиной. Для того, чтобы избежать накладных расходов при повторяющемся разборе и транслировании редко изменяющихся модулей, байт-код записывается в файл с расширением «.pyc». Если соответствующий файл «.py» был изменён, то он снова разбирается и транслируется, а «.pyc» файл перезаписывается.

Здесь нет никой разницы в производительности, т.к. байт-код, прочитанный из «.pyc» файла, точно такой же, как полученный путём прямой трансляции. Единственная разница в том, что загрузка кода из «.pyc» файла выполняется быстрее, чем разбор и трансляция «.py» файла. Таким образом, существование «.pyc» файла уменьшает время запуска скриптов на Питоне. Вы можете использовать модуль Lib/compileall.py для того, чтобы создать соответствующие «.pyc» файлы для данного набора модулей.

Обратите внимание, что главный скрипт, исполняемый Питоном, даже если его файл имеет расширение .py, не компилируется в «.pyc» файл. Он компилируется в байт-код, но этот байт-код не сохраняется в файл. Обычно главные скрипты довольно короткие, потому здесь нет потерь в скорости.

Существует несколько программ, которые облегчают смешивание кода на Питоне и Си для увеличения производительности. Например, Psyco, Pyrex, PyInline, Py2Cmod и Weave.

1.4.13. Как Питон управляет памятью?

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

Jython полагается на среду времени выполнения Java и использует сборщик мусора из JVM. Эта особенность может привести к некоторым проблемам при портировании кода, зависящего от реализации с подсчётом ссылок.

Иногда объекты временно попадают в traceback, и не разрушаются тогда, когда вы могли этого ожидать. Для очистки traceback выполните такой код:
Код

import sys
sys.exc_clear()
sys.exc_traceback = sys.last_traceback = None

Traceback используется для отчётов об ошибках, реализации отладчиков и т.п. Он может содержать кусок состояния программы, полученный во время обработки исключения (обычно, самого последнего исключения).

Если нет ни цикличных ссылок, ни tracebacks, то программа не нуждается в явном управлении памятью.

Почему Питон не использует традиционную стратегию со сборщиком мусора? В Си нет стандартного и переносимого способа реализовать её. (Да, мы знаем о библиотеке Boehm GC. Она содержит куски ассемблерного кода для большинства распространённых платформ, но не для всёх, не совсем прозрачна и нуждается в патчах для совместной работы с Питоном).

Традиционный сборщик мусора также становится проблемой, если Питон встраивается в другие приложения. Пока Питон работает сам по себе, можно свободно заменить стандартные вызовы malloc() и free() версиями, предоставляемыми библиотекой сборщика мусора. Но приложение с интегрированным Питоном может иметь собственную замену для malloc() и free(). Сейчас Питон работает со всем, что имеет правильную реализацию malloc() и free().

В Jython следующий код (который прекрасно работает в CPython) приведёт к нехватке файловых дескрипторов до того, как случится нехватка памяти:
Код

for file in <very long list of files>:
    f = open(file)
    c = f.read(1)

Если используется стратегия с подсчётом ссылок и деструкторами, каждое новое присваивание f закрывает предыдущий файл. Если используется сборщик мусора, то это не гарантируется. Если вы хотите писать код, который будет работать с любой реализацией Питона, вы должны явно закрыть файл.
Код

for file in <very long list of files>:
    f = open(file)
    c = f.read(1)
    f.close()




--------------------
Не смей читать мою подпись!!!
PM MAIL Jabber   Вверх
setq
Дата 10.11.2005, 14:45 (ссылка)    |    (голосов: 0) Загрузка ... Загрузка ... Быстрая цитата Цитата


Unregistered











1.1.1 Существует ли для Питона отладчик кода с точками останова, пошаговым выполнением и т.д?

Да.

Модуль pdb -- простой, но отвечающий большинству требований консольный отладчик для Питона. Он является частью стандартной библиотеки и описан в руководстве. Вы можете самостоятельно написать свой собственный отладчик, используя код pdb в качестве примера.

Интерактивная среда разработки IDLE, являющаяся частью стандартной поставки языка Питон (обычно доступная как Tools/scripts/idle (*)), включает графический отладчик. Документация по отладчику IDLE доступна по адресу http://www.python.org/idle/doc/idle2.html#Debugger .

Другая IDE для Питона - PythonWin - включает в себя GUI отладчик на базе pdb. PythonWin подсвечивает точки останова а также имеет несколько cool features such as debugging non-Pythonwin programs. Описание можно найти здесь: http://www.python.org/windows/pythonwin/ . Последние версии PythonWin доступны как часть поставки ActivePython (http://www.activestate.com/Products/ActivePython/index.html).

Boa Constructor - это IDE и среда для разработки GUI приложений, использующая wxPython. It offers visual frame creation and manipulation, an object inspector, many views on the source like object browsers, inheritance hierarchies, doc string generated html documentation, an advanced debugger, integrated help, and Zope support.

Eric3 - среда разработки построенная на PyQt и Scintilla editing component.

Pydb -- версия стандартного питоновского отладчика pdb, модифицированного под использование с DDD (Data Display Debugger) - популярного графического интерфейса для отладчиков (debugger front end). Pydb можно найти здесь: http://packages.debian.org/unstable/devel/pydb.html . DDD можно найти здесь: http://www.gnu.org/software/ddd .

Существует несколько коммерческих IDE для Питона, в которых есть графические отладчики. Например:
Wing IDE (http://wingide.com)
Komodo IDE (http://www.activestate.com/Products/Komodo)


(*) "обычно доступная как Tools/scripts/idle" -- у меня под WindowsXP в этой папке нет такого файла.
  Вверх
setq
Дата 11.11.2005, 17:08 (ссылка)    |    (голосов: 0) Загрузка ... Загрузка ... Быстрая цитата Цитата


Unregistered











из Programming FAQ

1.1.2 Есть ли инструменты, помогающие находить баги и проводить статический анализ?

Да.

PyChecker - это инструмент статического анализа, который находит ошибки в исходном коде а также проверяет стиль и сложность программ (code complexity). Вы можете загрузить PyChecker с http://pychecker.sf.net .

Pylint - другая утилита, проверяющая отвечает ли модуль стандартам написания кода и позволяющая писать собственные plug-in'ы. Кроме проверки на наличие ошибок, которую выполняет PyChecker, Pylint имеет несколько дополнительных возможностей, таких как проверка длины строк, проверка того отвечают ли переменные формату именования, установленному Вашим стандартом кодирования, а также реализованы ли все объявленные интерфейсы, и прочее. http://www.logilab.org/projects/pylint/documentation описывает полный список возможностей Pylint.

1.1.3 Как создать самостоятельную программу (stand-alone binary) из скрипта на Питоне?

Вам не обязательно компилировать код на Питоне в Си, если всё что Вы хотите это получить самостоятельную программу, которую пользователи могли бы загружать и исполнять без установленного интерпретатора Питона. Есть несколько утилит, которые определяют какие модули использует Ваша программа и связывают их с бинарниками Питона, создавая один исполняемый файл.

Во-первых, это утилита freeze из каталога исходников Питона (Tools/freeze). Она конвертирует питоновский байт-код в C arrays; a C compiler you can embed all your modules into a new program, which is then linked with the standard Python modules. (*)

Ваш код сканируется по рекурсивному алгоритму в поисках инструкций импорта (в обоих формах) и соответствующие модули ищутся в стандартных путях Питона или в директории исходников (для встроенных модулей). Затем модули, содержащие питоновский байт-код, переводятся в Си (array initializers, из которых можно восстановить code-объекты с помощью модуля marshal) (**) и создаётся custom-made конфигурационный файл, который содержит только те встроенные модули, которые используются Вашей программой. Затем сгенерированный код Си компилируется и линкуется с питоновским интерпретатором, образуя self-contained binary, делающий то же самое, что и Ваш скрипт.

Очевидно, для утилиты freeze нужен компилятор Си. Существуют другие инструменты, которые его не требуют. Первый - Gordon McMillan's installer по адресу

http://www.mcmillan-inc.com/install1.html (***)

который работает под Windows, Linux и по крайней мере на нескольких Unix'ах.

Другой - Thomas Heller's py2exe (только под Windows) по адресу

http://starship.python.net/crew/theller/py2exe

Третий - Christian Tismer's SQFREEZE, дописывающий байт-код в "специально приготовленный" питоновский интерпретатор, умеющий находить этот байт-код в своём исполняемом файле. Возможно подобный подход будет реализован в версии 2.4, due out some time in 2004.

Среди прочих стоит упомянуть Fredrik Lundh's Squeeze (****) и Anthony Tuininga's cx_Freeze.

---
кстати, тема уже обсуждалась у нас на форуме и вроде бы продуктивно: читать


1.1.4 Есть ли стандарт или единый стиль для написания кода в Питоне?

Да. Стиль кодирования, который соблюдается при написании модулей стандартной библиотеки описан как PEP 8.


(*) ниасилил
(***) сдох?
(****) "The Squeeze utility is no longer available"


(**) откровенно говоря, не понимаю, зачем переводить скомпилированный питоновский байт-код в Си, если и так интерпретатор зашивается внутрь executable. если кто-то в курсе, как всё это работает - прокомментируйте.

ответ Void:
Если я правильно понял, то речь идет всего лишь о способе записи байт-кода непосредственно в исходниках Си, допустим есть у меня объект:

Код

>>> x = 2
>>> marshal.dumps(x)
'i\x02\x00\x00\x00'


freeze его превратит во что-то вроде:

Код

char obj_d[] = {'i', 2, 0, 0};


Вероятно, это сделано, чтобы переложить все заботы о генерации исполняемого файла на плечи компилятора Си.

Это сообщение отредактировал(а) setq - 11.11.2005, 19:05
  Вверх
srd
Дата 19.3.2006, 11:23 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Нереварин
**


Профиль
Группа: Участник Клуба
Сообщений: 951
Регистрация: 30.8.2003
Где: Владивосток

Репутация: 7
Всего: 49



1.1 Общие вопросы о GUI
1.1.1 Какие независимые от платформы инструментарии GUI доступны в Питоне?
Это зависит от того, на какие платформы вы ориентируетесь. Есть несколько.
1.1.1.1 Tkinter
Стандартные сборки Питона включают объектно-ориентированный интерфейс к библиотеке виджетов Tcl/Tk, называющейся Tkinter. Эта библиотека, возможно, самая легкая в установке и использовании. За подробностями обратитесь к домашней странице Tcl/Tk (http://www.tcl.tk). Tcl/Tk полностью переносима на платформы MacOS, Windows и UNIX.
1.1.1.2 wxWindows
wxWindows – это написанная на Си++ переносимая библиотека классов для GUI, представляющая собой интерфейс для разнообразных библиотек, специфичных для платформы. wxWindows поддерживает Windows и MacOS. На UNIX поддерживается как GTK+, так и Motif. wxWindows сохраняет облик используемой графической библиотеки, содержит очень богатую коллекцию виджетов и классов GDI. Обратитесь к странице http://www.wxwindows.org/ за подробностями.
wxWidgets – это расширение, оборачивающее многие C++ - классы из wxWindows и быстро получившее популярность среди разработчиков на Питоне. Вы можете получить wxWidgets как часть дистрибутива wxWindows с исходными кодами или из CVS, или непосредственно с их домашней страницы.
1.1.1.3 Qt
Существуют связки для Qt (PyQt) или для KDE (PyKDE). Если вы пишете программное обеспечение с открытыми исходными кодами, то вам не надо платить за PyQt, но если вы хотите писать проприетарное программное обеспечение, то вы должны купить лицензию для PyQt у http://www.riverbankcomputing.co.uk/ и лицензию на Qt от http://www.trolltech.com.
1.1.1.4 GTk+
James Henstridge создал PyGTk, связку для библиотеки GTk+. Обратитесь к ftp://ftp.gtk.org/pub/gtk/python/.
1.1.1.5 FLTK
Связка Питона с библиотекой FLTK (http://www.fltk.org/), простой, но мощной и зрелой кросс-платформенной оконной системой, доступна благодаря проекту http://pyfltk.sourceforge.net.
1.1.1.6 FOX
Для библиотеки FOX (http://www.fox-toolkit.org/) существует обёртка, называемая FXpy (http://fxpy.sourceforge.net/). Поддерживаются как UNIX, так и Windows.
1.1.1.7 OpenGL
Связку для OpenGL можно найти на http://pyopengl.sourceforge.net.
1.1.2 Какие платформенно-специфичные инструментарии для GUI доступны в Питоне?
Порт для Mac (http://www.python.org/download/mac), созданный Jack Jansen, имеет богатый и продолжающий увеличиваться набор модулей для поддержки «родных» для Mac вызовов. Этот порт включает в себя поддержку библиотек Carbon для MacOS9 и MacOS X. После установки расширения PyObjc Objective-C bridge (http://pyobjc.sourceforge.net/) у программ на Питоне появляется возможность использовать библиотеки Cocoa. Обратитесь за подробностями к документации, поставляемой вместе с портом на Mac.
Pythonwin (http://www.python.org/doc/faq/windows/), созданный Mark Hammond, содержит интерфейс к MFC и среду программирования, использующую этот интерфейс и в основном написанную на Питоне.


--------------------
Не смей читать мою подпись!!!
PM MAIL Jabber   Вверх
srd
Дата 27.3.2006, 12:47 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Нереварин
**


Профиль
Группа: Участник Клуба
Сообщений: 951
Регистрация: 30.8.2003
Где: Владивосток

Репутация: 7
Всего: 49



1. Extending/Embedding FAQ
1.1 Могу ли я создавать свои собственные функции на Си?
Да, вы можете создавать встроенные модули, содержащие функции, переменные, исключения и даже новые типы данных на Си. Это объясняется в документе «Расширение и встраивание интерпретатор Питона», находящегося по адресу http://docs.python.org/ext/ext.html.
Большинство книг о Питоне для пользователей среднего и высокого уровня также затрагивают эту тему.
1.2 Могу ли я создавать свои собственные фунции на Си++?
Да, если использовать свойства Си++, совместимые с Си. Заключите заголовочные файлы Питона в extern “C” {…} и добавляйте extern “C” перед каждой функцией, которая будет вызываться интерпретатором. Но использование глобальных или статических объектов Си++, имеющих конструкторы - это, возможно, не очень хорошая идея.
1.3 Писать на Си – это сложно. Существуют ли какие-нибудь другие варианты?
Есть несколько способов для написания ваших собственных Си-расширений. Это зависит от того, что вы хотите сделать.
Для достижения более высокой скорости можно использовать Psyco (http://psyco.sourceforge.net/), генерирующий ассемблерный код для x86 на основе питоновского байт-кода. Если вы работаете на машине с процессором, совместимым с архитектурой x86, то вы можете использовать Psyco для компиляции наиболее критичных по времени функций в вашем коде и для получения значительных улучшений с наименьшими усилиями
Pyrex (http://www.cosc.canterbury.ac.nz/%7Egreg/python/Pyrex/) – это компилятор, генерирующий код на Си на основе незначительно модифицированного кода на Питоне. Pyrex позволяет создавать расширения без изучения питоновского C API.
Если вы нуждаетесь в интерфейсе к некоторой Си-библиотеке, для которой пока не существует питоновского расширения, то с помощью такого инструмента, как SWIG (http://www.swig.org/ ), вы можете попытаться создать обёртки для библиотечных функций и типов. Для Си++ могут быть использованы SIP (http://www.riverbankcomputing.co.uk/sip/), CXX (http://cxx.sourceforge.net/), Boost (http://www.boost.org/libs/python/doc/index.html ) и Weave (http://www.scipy.org/site_content/weave).
1.4 Как я могу из Си выполнить некоторые инструкции Питона?
Это можно сделать с помощью высокоуровневой функция PyRun_SimpleString(), которая принимает простую строку в качестве параметра и выполняет её в контексте модуля __main__. Функция возвращает 0 в случае успешного завершения и -1, если во время выполнения случилась исключительная ситуация (включая SyntaxError). Если вам нужны дополнительные возможности, то обратитесь к функции PyRun_String() и исходному коду функции PyRun_SimpleString() в файле Python/pythonrun.c.
1.5 Как я могу из Си вычилсить некоторое выражения Питона?
Вызовите функцию PyRun_String(), упоминающуюся в предыдущем вопросе, с стартовым символом Py_eval_input. Функция выполнит разбор выражения, вычислит его и вернёт значение этого выражения.
1.6 Как мне в Си получить значения из питоновского объекта?
Это зависит от типа объекта. Для кортежа функция PyTupleSize(o) возвращает его длину, а PyTuple_GetItem(o, i) – его i-ый элемент. Для списков существую аналогичные функции PyListSize(o) и PyList_GetItem(o, i).
Для строки функция PyString_Size(o) возвращет её длину, а PyString_AsString(o) – указатель на её значение. Обратите внимание на то, что питоновские строки могут содержать нулевые байты, потому не используйте с ними функцию strlen().
Для определения типа объекта сперва убедитесь, что он не NULL, а потом воспользуйтесь функциями PyString_Check(o), PyTuple_Check(o), PyList_Check(o) и т.п.
Также существует высокоуровневый API к питоновским объектам, предоставляющий так называемый «абстрактный» интерфейс. Изучите файл Include/abstract.h, чтобы узнать подробности. Этот интерфейс обеспечивает взаимодействие с любой питоновской последовательностью с помощью как таких функций, как PySequence_Length(), PySequence_GetItem() и многие другие полезные возможности.




--------------------
Не смей читать мою подпись!!!
PM MAIL Jabber   Вверх
allexdav
Дата 15.4.2006, 23:18 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


лоботомированное тело тиклского питоноида



Профиль
Группа: Участник
Сообщений: 43
Регистрация: 19.3.2006
Где: Россия, Нижний Но вгород

Репутация: 3
Всего: 3



1.4.15 Почему при выходе из питона освобождается не вся память?
Ссылки на объекты из глобального пространства имен модулей питона не всегда уничтожаются при выходе из питона. Это может происходить, если существуют круговые ссылки. Также существует некоторая память, выделяемая библиотекой С, которую невозможно очистить (пер. средствами питона) ( утилиты, как Purify могут позаботиться об этом ). Но питон, тем не менее, старается очистить всю память при выходе и удалить каждый несвязанный объект.
Если вы хотите заставить питон удалить конкретные объекты при освобождении памяти – используйте функцию sys.exitfunc().

1.14.16 Почему типы кортеж (tuple) и список (list) разделены?
Списки и кортежи одинаковы во многих отношения, но используются фундаментально разными способами. Кортежи –это аналог записей ( пер. record ) Паскаля или структур ( пер. struct ) Си. Это небольшие наборы связанных данных, которые могут быть разных типов и все операции над ними производятся как над группой. Например, декартова (Cartesian) координата соответствует кортежу из двух или трех чисел.
Списки, с другой стороны, аналоги массивов в других языках. Они хранят некоторое количество объектов одного типа, и операции над ними производятся отдельно. Например, os.listdir('.') возвратит список строк, соответствующих файлам в текущем каталоге. Функции, которые работают с этим выводом обычно работают нормально. Если вы добавите несколько файлов в каталог.
Кортежи – неизменны. Это значит, что если кортеж был создан, то вы не можете изменить какой-нибудь элемент. Списки – изменяемы. Только неизменяемые элементы могут быть использованы как ключи словарей ( пер. dictionary ), следовательно только кортежи могут быть использованы как ключи.

Это сообщение отредактировал(а) allexdav - 15.4.2006, 23:21
PM MAIL ICQ   Вверх
allexdav
Дата 15.4.2006, 23:57 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


лоботомированное тело тиклского питоноида



Профиль
Группа: Участник
Сообщений: 43
Регистрация: 19.3.2006
Где: Россия, Нижний Но вгород

Репутация: 3
Всего: 3



1.14.17 Как реализованы списки?
Списки питона на самом деле являются массивами переменной длины, не так, как в Лиспе (пер.  Лисп. Бивис, он сказал Лисп ). В реализации используются последовательный массив ссылок на другие объекты, в заголовке массива храниться длина и указатель на элемент массива. Это позволяет сделать индексацию как a[i] операцией, не зависящей от размера списка и значения индекса.
Когда элементы добавляются или присоединяются ( пер. append ) – массив ссылок изменяет размеры. Для улучшения производительности при росте размера массива он увеличивается с запасом, то есть добавление следующего элемента занимает меньше времени, так как не требуется дополнительного выделения памяти.

1.14.18 Как реализованы словари?
Словари в питоне реализованы как изменяемые хеш таблицы. Это дает лучшую производительность по сравнению с бинарными деревьями при поиске ( наиболее часто используемой операции) во многих случаях, и реализация этого проще.
Каждый элемент словаря – это хеш, возвращаемый встроенной функцией hash(). Хеш код сильно варьируется в зависимости от ключа. Например "Python" хешируется в -539294296, а "python" в 1142331976 ( пер. вроде обычный хеш. Зачем на этом внимание заострять? ). Хеш код используется для вычисления места во внутреннем массиве, где записано значение ключа. Если все ваши хранимые ключи имеют разные хеши, то извлечение элемента из словаря занимает фиксированное время ( сложность алгоритма О (1) ). Также это значит что элементы словаря не сортированы, и вывод элементов словаря по .keys() и .items() будет производиться в некотором произвольном порядке.

PM MAIL ICQ   Вверх
allexdav
Дата 17.4.2006, 13:34 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


лоботомированное тело тиклского питоноида



Профиль
Группа: Участник
Сообщений: 43
Регистрация: 19.3.2006
Где: Россия, Нижний Но вгород

Репутация: 3
Всего: 3



1.2.3 Есть ли какие – нибудь важные проекты, сделанные на питоне?
На  http://www.pythonology.org/success есть список проектов, использующих питон. Протоколы консультаций на официальном сайте содержат требования многих компаний и организаций.
Заметные питоновские проекты это Mailman – менеджер списков рассылки и Zope – сервер приложений В некоторых  дистрибутивах Линукса, например Red Hat, часть инсталлятора и приложений для системного администрирования написаны на Питоне. Компании, которые используют Питон – это Google, Yahoo, и Industrial Light & Magic

  

Это сообщение отредактировал(а) allexdav - 17.4.2006, 14:16
PM MAIL ICQ   Вверх
allexdav
Дата 17.4.2006, 14:16 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


лоботомированное тело тиклского питоноида



Профиль
Группа: Участник
Сообщений: 43
Регистрация: 19.3.2006
Где: Россия, Нижний Но вгород

Репутация: 3
Всего: 3



1.2.7 Питон и проблема Y2K ( 2000 год)
С августа 2003 не было заметных проблем и проблема Y2K  уже не существенна.
Питон производит очень мало вычислений дат и они производяться с помощью функций Си библиотеки. Питон как правило представляет время как количество секунд, прошедших с 1970 года или как ( год, месяц, число ) кортеж, где год – это число, состоящее из 4 чисел, что решает проблему 2000. Итак, если ваша библиотека С в порядке, то и Питон – в порядке. Конечно, возможно что отдельные приложения написанные на Питоне делают преобразование к числу из двух цифр.
Так как Питон доступен для изменения – абсолютной гарантии нет. Если происходят непредвиденные проблемы, то это больше  проблема пользователя, а не разработчиков, и вы никого не можите преследовать в судебном порядке. Авторское право Питона содержит следующее: 
4. PSF is making Python 2.3 available to Licensee on an "AS IS" basis. PSF MAKES NO REPRESENTATIONS OR WARRANTIES, EXPRESS OR IMPLIED. BY WAY OF EXAMPLE, BUT NOT LIMITATION, PSF MAKES NO AND DISCLAIMS ANY REPRESENTATION OR WARRANTY OF MERCHANTABILITY OR FITNESS FOR ANY PARTICULAR PURPOSE OR THAT THE USE OF PYTHON 2.3 WILL NOT INFRINGE ANY THIRD PARTY RIGHTS.
5. PSF SHALL NOT BE LIABLE TO LICENSEE OR ANY OTHER USERS OF PYTHON 2.3 FOR ANY INCIDENTAL, SPECIAL, OR CONSEQUENTIAL DAMAGES OR LOSS AS A RESULT OF MODIFYING, DISTRIBUTING, OR OTHERWISE USING PYTHON 2.3, OR ANY DERIVATIVE THEREOF, EVEN IF ADVISED OF THE POSSIBILITY THEREOF.
(пер. здесь про отсутствие гарантий на что – либо )
Хорошие новости – это то, что если вы нашли проблему, то у вас есть полные исходники Питона для того, чтобы найти ее и устранить. Это – преимущество приложений с открытым исходным кодом
  

Это сообщение отредактировал(а) allexdav - 17.4.2006, 14:17
PM MAIL ICQ   Вверх
allexdav
Дата 24.4.2006, 21:13 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


лоботомированное тело тиклского питоноида



Профиль
Группа: Участник
Сообщений: 43
Регистрация: 19.3.2006
Где: Россия, Нижний Но вгород

Репутация: 3
Всего: 3



1.3.1 Что за модуль bsddb185, и почему мое приложение жалуется на него?
Начиная с версии Питона 2.3, установщик содержал в себе модуль PyBSDDB http://pybsddb.sf.net/ как замену старого модуля bsddb. Он включает в себя функции, обеспечивающие обратную совместимость на уровне API, но требует более новую версию библиотеки Berkeley DB . Файлы, которые были созданы с помощью старого модуля bsddb не могут быть открыты с помощью нового модуля.

Используя вашу старую версию Питона и пару скриптов,  которые являются частью версии 2.3  (db2pickle.py и pickle2db.py, в каталоге Tools/scripts) вы сможете преобразовать ваши старые файлы к новому формату. Используя вашу старую версию Питона, запустите файл db2pickle.py, чтобы сделать копию.
python2.2 <pathto>/db2pickley.py database.db database.pck
Затем переименуйте ваш файл базы данных
mv database.db olddatabase.db
Теперь преобразуйте копию в новый формат
python2.3 <pathto>/pickle2db.py database.db database.pck
Команды могут отличатся от указанных, в зависимости от вашей установки питона (путей). Для получения полной информации о этих операциях с этими скриптами посмотрите в прилагаемую справку (докстринги )

 
PM MAIL ICQ   Вверх
bilbobagginz
Дата 6.6.2007, 01:18 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Naughtius Maximus
****


Профиль
Группа: Экс. модератор
Сообщений: 8813
Регистрация: 2.3.2004
Где: Israel

Репутация: 6
Всего: 317



1.4.22 (в настоящем FAQ-е - уже 1.4.23)   Почему в языке python нет ключевого слова goto?
Для создания "структурного goto" можно использовать исключения. Этот механизм сработает и между различными функциями. Многие солгасятся что исключения удобно эмулируют все целесообразные приложения механизма "go" или "goto" как в языках Си, Фортран и др. языков. 
Например:
Код

class ярлык: pass # объявляем ярлык

try:
     ...
     if (условие): raise ярлык() # эквивалентно "goto ярлык"
     ...
except ярлык: # куда делать goto
     pass
...

Да, это не позволит вам запрыгнуть в бегущий цикл, но такое желание само по себе неестественно, и считается злоупотреблением goto, поэтому используйте его умеренно.


--------------------
Я ещё не демон. Я только учусь.
PM WWW   Вверх
Ypiii
Дата 18.12.2017, 10:14 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 1
Регистрация: 18.12.2017

Репутация: нет
Всего: нет



Курсы программирования на pyhton с нуля https://imprium.ru/courses/kursy-python-online
Рекомендую!
PM MAIL   Вверх
Страницы: (3) [Все] 1 2 3 
Ответ в темуСоздание новой темы Создание опроса
0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | Python: Общие вопросы | Следующая тема »


 




[ Время генерации скрипта: 0.3294 ]   [ Использовано запросов: 22 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.