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

Поиск:

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


Опытный
**


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

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



 давайте переводить питоновский 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
PM MAIL   Вверх
setq
Дата 15.10.2005, 09:14 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


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

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



из 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
PM MAIL   Вверх
setq
Дата 15.10.2005, 18:18 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


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

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



 из 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
PM MAIL   Вверх
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 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


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

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



из 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 как по отношению к классам, так и к экземплярам. самое интересное, что по-английский всё было понятно ))

PM MAIL   Вверх
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 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


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

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



из 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
PM MAIL   Вверх
setq
Дата 17.10.2005, 17:38 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


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

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



из 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
PM MAIL   Вверх
setq
Дата 17.10.2005, 23:28 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


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

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



из 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
PM MAIL   Вверх
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 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


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

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



из 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
PM MAIL   Вверх
setq
Дата 20.10.2005, 22:33 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


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

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



из 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
PM MAIL   Вверх
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 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


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

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



из 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
PM MAIL   Вверх
Google
  Дата 16.7.2018, 07:33 (ссылка)  





  Вверх
Страницы: (3) Все [1] 2 3 
Ответ в темуСоздание новой темы Создание опроса
1 Пользователей читают эту тему (1 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | Python: Общие вопросы | Следующая тема »


 




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


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

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