Просмотр отдельных изменений

Фильтры правок (обсуждение) — это автоматизированный механизм проверок правок участников.
(Список | Последние изменения фильтров | Изучение правок | Журнал срабатываний)
Перейти к навигации Перейти к поиску

Эта страница позволяет вам проверить переменные, сгенерированные фильтром злоупотреблений, на предмет отдельного изменения.

Переменные, созданные для этого изменения

ПеременнаяЗначение
Число правок участника (user_editcount)
null
Имя учётной записи (user_name)
'2.75.113.248'
Время подтверждения адреса эл. почты (user_emailconfirm)
null
Возраст учётной записи (user_age)
0
Группы (включая неявные) в которых состоит участник (user_groups)
[ 0 => '*' ]
Права, которые есть у участника (user_rights)
[ 0 => 'createaccount', 1 => 'read', 2 => 'edit', 3 => 'createpage', 4 => 'createtalk', 5 => 'writeapi', 6 => 'viewmyprivateinfo', 7 => 'editmyprivateinfo', 8 => 'editmyoptions', 9 => 'abusefilter-log-detail', 10 => 'urlshortener-create-url', 11 => 'centralauth-merge', 12 => 'abusefilter-view', 13 => 'abusefilter-log', 14 => 'vipsscaler-test' ]
Редактирует ли пользователь через мобильное приложение (user_app)
false
Редактирует ли участник через мобильный интерфейс (user_mobile)
true
Глобальные группы участника (global_user_groups)
[]
Global edit count of the user (global_user_editcount)
0
ID страницы (page_id)
2705
Пространство имён страницы (page_namespace)
0
Название страницы (без пространства имён) (page_title)
'Python'
Полное название страницы (page_prefixedtitle)
'Python'
Последние десять редакторов страницы (page_recent_contributors)
[ 0 => 'Drakosh', 1 => 'Наука информатика', 2 => 'InternetArchiveBot', 3 => 'Vbif-routine', 4 => 'Bruto21', 5 => 'D6194c-1cc', 6 => '173.54.219.60', 7 => 'QBA-bot', 8 => 'Sigwald', 9 => '213.230.87.160' ]
Возраст страницы (в секундах) (page_age)
634604078
Действие (action)
'edit'
Описание правки/причина (summary)
'вор в законе деее'
Старая модель содержимого (old_content_model)
'wikitext'
Новая модель содержимого (new_content_model)
'wikitext'
Вики-текст старой страницы до правки (old_wikitext)
'{{Другие значения}} {{Карточка языка программирования | испытал влияние = [[ABC (язык программирования)|ABC]],<ref name="faq-created">{{cite web |url=https://docs.python.org/faq/general.html#why-was-python-created-in-the-first-place |title=Why was Python created in the first place? |work=General Python FAQ |publisher=Python Software Foundation |access-date=2007-03-22 |archive-date=2012-10-24 |archive-url=https://web.archive.org/web/20121024164224/http://docs.python.org/faq/general.html#why-was-python-created-in-the-first-place |url-status=live }}</ref> [[Ада (язык программирования)|Ada]],<ref>{{cite web|lang=en | url=http://archive.adaic.com/standards/83lrm/html/lrm-11-03.html#11.3 | title=Ada 83 Reference Manual (raise statement) | access-date=2020-01-07 | archive-date=2019-10-22 | archive-url=https://web.archive.org/web/20191022155758/http://archive.adaic.com/standards/83lrm/html/lrm-11-03.html#11.3 | url-status=live }}</ref> [[Алгол 68]],<ref name="98-interview">{{cite web |url=http://www.amk.ca/python/writing/gvr-interview |title=Interview with Guido van Rossum (July 1998) |last=Kuchling |first=Andrew M. |work=amk.ca |date=2006-12-22 |access-date=2012-03-12 |url-status=dead |archive-url=https://web.archive.org/web/20070501105422/http://www.amk.ca/python/writing/gvr-interview |archive-date=2007-05-01}}</ref> [[APL (язык программирования)|APL]],<ref name="python.org">{{cite web|url=https://docs.python.org/3/library/itertools.html|title=itertools — Functions creating iterators for efficient looping — Python 3.7.1 documentation|website=docs.python.org|access-date=2016-11-22|archive-date=2020-06-14|archive-url=https://web.archive.org/web/20200614153629/https://docs.python.org/3/library/itertools.html|url-status=live}}</ref> [[Си (язык программирования)|C]],<ref name="AutoNT-1">{{ cite journal |last=van Rossum |first=Guido |year=1993 |title=An Introduction to Python for UNIX/C Programmers |journal=Proceedings of the NLUUG Najaarsconferentie (Dutch UNIX Users Group) |quote=even though the design of C is far from ideal, its influence on Python is considerable. |citeseerx=10.1.1.38.2023 }}</ref> [[C++]],<ref name="classmix">{{cite web |url=https://docs.python.org/tutorial/classes.html |title=Classes |work=The Python Tutorial |publisher=Python Software Foundation |access-date=2012-02-20 |quote=It is a mixture of the class mechanisms found in C++ and Modula-3 |archive-date=2012-10-23 |archive-url=https://web.archive.org/web/20121023030209/http://docs.python.org/tutorial/classes.html |url-status=live }}</ref> [[Клу]],<ref name="effbot-call-by-object">{{cite web |url=http://effbot.org/zone/call-by-object.htm |title=Call By Object |work=effbot.org |last=Lundh |first=Fredrik |quote=replace "CLU" with "Python", "record" with "instance", and "procedure" with "function or method", and you get a pretty accurate description of Python's object model. |access-date=2017-11-21 |archive-date=2019-11-23 |archive-url=https://web.archive.org/web/20191123043655/http://effbot.org/zone/call-by-object.htm |url-status=live }}</ref> [[Dylan (язык программирования)|Dylan]],<ref name="AutoNT-2">{{cite web |url=https://www.python.org/download/releases/2.3/mro/ |title=The Python 2.3 Method Resolution Order |last=Simionato |first=Michele |publisher=Python Software Foundation |quote=The C3 method itself has nothing to do with Python, since it was invented by people working on Dylan and it is described in a paper intended for lispers |access-date=2014-07-29 |archive-date=2020-08-20 |archive-url=https://web.archive.org/web/20200820231854/https://www.python.org/download/releases/2.3/mro/ |url-status=live }}</ref> [[Haskell]],<ref name="AutoNT-3">{{cite web |url=https://docs.python.org/howto/functional.html |title=Functional Programming HOWTO |last=Kuchling |first=A. M. |work=Python v2.7.2 documentation |publisher=Python Software Foundation |access-date=2012-02-09 |archive-date=2012-10-24 |archive-url=https://web.archive.org/web/20121024163217/http://docs.python.org/howto/functional.html |url-status=live }}</ref> [[Icon (язык программирования)|Icon]],<ref name="AutoNT-4">{{cite web |url=https://www.python.org/dev/peps/pep-0255/ |title=PEP 255&nbsp;– Simple Generators |first1=Neil |last1=Schemenauer |first2=Tim |last2=Peters |first3=Magnus Lie |last3=Hetland |date=2001-05-18 |work=Python Enhancement Proposals |publisher=Python Software Foundation |access-date=2012-02-09 |archive-date=2020-06-05 |archive-url=https://web.archive.org/web/20200605012926/https://www.python.org/dev/peps/pep-0255/ |url-status=live }}</ref> [[Java]],<ref name="AutoNT-5">{{cite web |url=https://www.python.org/dev/peps/pep-0318/ |title=PEP 318&nbsp;– Decorators for Functions and Methods |first1=Kevin D. |last1=Smith |first2=Jim J. |last2=Jewett |first3=Skip |last3=Montanaro |first4=Anthony |last4=Baxter |date=2004-09-02 |work=Python Enhancement Proposals |publisher=Python Software Foundation |access-date=2012-02-24 |archive-date=2020-06-03 |archive-url=https://web.archive.org/web/20200603133734/https://www.python.org/dev/peps/pep-0318/ |url-status=live }}</ref>[[Лисп]],<ref name="AutoNT-6">{{cite web |url=https://docs.python.org/3.2/tutorial/controlflow.html |title=More Control Flow Tools |work=Python 3 documentation |publisher=Python Software Foundation |access-date=2015-07-24 |archive-date=2016-06-04 |archive-url=https://web.archive.org/web/20160604080843/https://docs.python.org/3.2/tutorial/controlflow.html |url-status=live }}</ref> [[Модула-3]],<ref name="classmix" /> [[Perl]], [[Standard ML]]<ref name="python.org"/> | повлиял на = [[Mojo (язык программирования)|Mojo]]<ref>{{Cite web |last=Krill |first=Paul |date=2023-05-04 |title=Mojo language marries Python and MLIR for AI development |url=https://www.infoworld.com/article/3695588/mojo-language-marries-python-and-mlir-for-ai-development.html |access-date=2023-05-05 |website=InfoWorld |language=en |archive-date=5 May 2023 |archive-url=https://web.archive.org/web/20230505064554/https://www.infoworld.com/article/3695588/mojo-language-marries-python-and-mlir-for-ai-development.html |url-status=live }}</ref> }} '''Python''' (<small>[[МФА]]:</small> {{IPA|[ˈpʌɪθ(ə)n]}}; в русском языке встречаются названия '''пито́н'''<ref>{{Cite web |url=http://www.xakep.ru/magazine/xa/117/088/1.asp |title=Мария «Mifrill» Нефёдова, Создатели языков программирования: Они такие разные, но кодинг их объединяет, Хакер № 09/08 (117) |access-date=2012-12-01 |archive-date=2013-07-02 |archive-url=https://web.archive.org/web/20130702190922/http://www.xakep.ru/magazine/xa/117/088/1.asp |url-status=live }}</ref> или '''па́йтон'''<ref>{{книга|автор=Прохоренок Н., Дронов В.|часть=Введение|заглавие=Python 3. Самое необходимое, 2-е изд.|ссылка=https://books.google.ru/books?id=k_6MDwAAQBAJ&lpg=PA11&hl=ru&pg=PA11#v=onepage&q&f=false|издательство=БХВ-Петербург|год=2019|страницы=11|страниц=608|isbn=9785977539944|archivedate=2021-02-12|archiveurl=https://web.archive.org/web/20210212044851/https://books.google.ru/books?id=k_6MDwAAQBAJ&lpg=PA11&hl=ru&pg=PA11#v=onepage&q&f=false}}</ref>) — [[высокоуровневый язык программирования]] общего назначения с [[Динамическая типизация|динамической]] [[Строгая типизация|строгой]] типизацией и автоматическим управлением памятью<ref name=":2">{{Статья|ссылка=https://www.irjet.net/archives/V6/i2/IRJET-V6I2367.pdf|автор=Yogesh Rana|заглавие=Python: Simple though an Important Programming language|год=2019|язык=en|издание=International Research Journal of Engineering and Technology (IRJET)|месяц=02|число=02|том=06|выпуск=2|страницы=1856—1858|issn=2395-0056|archiveurl=https://web.archive.org/web/20210211163417/https://www.irjet.net/archives/V6/i2/IRJET-V6I2367.pdf|archivedate=2021-02-11|access-date=2021-02-11|deadlink=no}}</ref><ref>{{Cite web|lang=en|url=https://wiki.python.org/moin/Why%20is%20Python%20a%20dynamic%20language%20and%20also%20a%20strongly%20typed%20language|title=Why is Python a dynamic language and also a strongly typed language - Python Wiki|author=SkipMontanaro|website=wiki.python.org|date=2012-02-24|archive-url=https://web.archive.org/web/20210314173706/https://wiki.python.org/moin/Why%20is%20Python%20a%20dynamic%20language%20and%20also%20a%20strongly%20typed%20language|archive-date=2021-03-14|access-date=2021-03-14|url-status=live}}</ref>, ориентированный на повышение производительности разработчика, читаемости [[Исходный код|кода]] и его качества, а также на обеспечение переносимости написанных на нём программ<ref name=":1">{{Cite web|lang=en|url=https://www.oreilly.com/library/view/learning-python-3rd/9780596513986/ch01.html|title=A Python Q&A Session|author=Mark Lutz|website=Learning Python, 3rd Edition [Book]|date=2007|publisher=O'Reilly Media, Inc.|archiveurl=https://web.archive.org/web/20210208175236/https://www.oreilly.com/library/view/learning-python-3rd/9780596513986/ch01.html|archivedate=2021-02-08|accessdate=2021-02-11|url-status=live}}</ref>. Язык является полностью [[Объектно-ориентированный язык программирования|объектно-ориентированным]] в том плане, что всё является [[Объект (программирование)|объектами]]<ref name=":2" />. Необычной особенностью языка является выделение [[Блок кода|блоков кода]] отступами<ref>{{Cite web|lang=en|url=https://developers.google.com/edu/python/introduction?hl=ru|title=Python Introduction {{!}}|website=Python Education|date=2018-08-20|publisher=Google Developers|archiveurl=https://web.archive.org/web/20201204155936/https://developers.google.com/edu/python/introduction|archivedate=2020-12-04|accessdate=2021-02-21|url-status=live}}</ref>. [[Синтаксис (программирование)|Синтаксис]] ядра языка минималистичен, за счёт чего на практике редко возникает необходимость обращаться к документации<ref name=":1" />. Сам же язык известен как [[Интерпретируемый язык программирования|интерпретируемый]] и используется в том числе для написания [[скрипт]]ов<ref name=":2" />. Недостатками языка являются зачастую более низкая скорость работы и более высокое потребление памяти написанных на нём программ по сравнению с аналогичным кодом, написанным на [[Компилируемый язык программирования|компилируемых языках]], таких как [[Си (язык программирования)|C]] или [[C++]]<ref name=":2" /><ref name=":1" />. Python является [[Мультипарадигменный язык программирования|мультипарадигменным языком программирования]], поддерживающим [[Императивное программирование|императивное]], [[Процедурное программирование|процедурное]], [[Структурное программирование|структурное]], [[Объектно-ориентированное программирование|объектно-ориентированное]] программирование<ref name=":2" />, [[метапрограммирование]]<ref name=":12">{{cite web|author=Satwik Kansal|url=https://developer.ibm.com/technologies/analytics/tutorials/ba-metaprogramming-python/|title=Metaprogramming in Python|lang=en|website=[[IBM]]|date=2018-04-05|accessdate=2021-04-14|url-status=live|archiveurl=https://web.archive.org/web/20210227132455/https://developer.ibm.com/technologies/analytics/tutorials/ba-metaprogramming-python/|archivedate=2021-02-27}}</ref>, [[Функциональное программирование|функциональное]] программирование<ref name=":2" /> и [[асинхронное программирование]]<ref name=":23">{{Cite web|url=https://docs.python.org/3/library/asyncio.html|title=asyncio — Asynchronous I/O|website=Python documentation|access-date=2023-10-09|archive-date=2019-05-05|archive-url=https://web.archive.org/web/20190505024126/https://docs.python.org/3/library/asyncio.html|url-status=live}}</ref>. Задачи [[Обобщённое программирование|обобщённого программирования]] решаются за счёт динамической типизации<ref name=":8" /><ref name=":9" />. [[Аспектно-ориентированное программирование]] частично поддерживается через [[Декоратор (шаблон проектирования)|декораторы]]<ref name=":13">{{Cite web|lang=en|url=https://www.oreilly.com/library/view/mastering-object-oriented-python/9781789531367/8cc23b01-44dd-4d1c-8993-f11107febf72.xhtml|title=Aspect-oriented programming|author=Steven F. Lott|website=Mastering Object-Oriented Python - Second Edition|date=2019|publisher=Packt Publishing|archiveurl=https://web.archive.org/web/20210221190643/https://www.oreilly.com/library/view/mastering-object-oriented-python/9781789531367/8cc23b01-44dd-4d1c-8993-f11107febf72.xhtml|archivedate=2021-02-21|accessdate=2021-02-21|url-status=live}}</ref>, более полноценная поддержка обеспечивается дополнительными [[фреймворк]]ами<ref>{{Статья|ссылка=https://core.ac.uk/download/pdf/230920601.pdf|автор=Arne Bachmann, Henning Bergmeyer, Andreas Schreiber|заглавие=Evaluation of aspect-oriented frameworks in Python for extending a project with provenance documentation features|год=2011|язык=en|издание=The Python Papers|том=6|выпуск=3|страницы=1–18|issn=1834-3147|archiveurl=https://web.archive.org/web/20180422011318/http://ojs.pythonpapers.org/index.php/tpp/article/download/218/202|archivedate=2018-04-22|access-date=2021-02-20|deadlink=no}}</ref>. Такие методики как [[Контрактное программирование|контрактное]] и [[логическое программирование]] можно реализовать с помощью библиотек или расширений<ref>{{Книга|язык=en|ссылка=https://books.google.ru/books?id=RkEAEAAAQBAJ&pg=PT47|автор=Steven Cooper|заглавие=Data Science from Scratch: The #1 Data Science Guide for Everything A Data Scientist Needs to Know: Python, Linear Algebra, Statistics, Coding, Applications, Neural Networks, and Decision Trees|год=2018|издательство=Roland Bind|страниц=126|access-date=2021-02-21|archive-date=2021-02-21|archive-url=https://web.archive.org/web/20210221110359/https://books.google.ru/books?id=RkEAEAAAQBAJ&pg=PT47|deadlink=no}}</ref>. Основные архитектурные черты — [[динамическая типизация]], [[сборка мусора (программирование)|автоматическое управление памятью]]<ref name=":2" />, [[Интроспекция в Python|полная интроспекция]], механизм [[обработка исключений|обработки исключений]], поддержка [[многопоточность|многопоточных вычислений]] с глобальной блокировкой интерпретатора ([[Global Interpreter Lock|GIL]])<ref>{{Cite web|lang=en|url=https://www.linuxjournal.com/content/multiprocessing-python|title=Multiprocessing in Python|author=Reuven M. Lerner|website=Linux Journal|date=2018-04-16|archiveurl=https://web.archive.org/web/20210214122407/https://www.linuxjournal.com/content/multiprocessing-python|archivedate=2021-02-14|accessdate=2021-02-14|url-status=live}}</ref>, высокоуровневые [[структура данных|структуры данных]]. Поддерживается разбиение программ на [[Модуль (программирование)|модули]], которые, в свою очередь, могут объединяться в пакеты<ref>{{Cite web|lang=en|url=https://www.oreilly.com/library/view/python-cookbook-3rd/9781449357337/ch10.html|title=10. Modules and Packages - Python Cookbook, 3rd Edition [Book]|author=David Beazley, Brian K. Jones|website=Python Cookbook, 3rd Edition|date=2013|publisher=O'Reilly Media, Inc.|archiveurl=https://web.archive.org/web/20210221072641/https://www.oreilly.com/library/view/python-cookbook-3rd/9781449357337/ch10.html|archivedate=2021-02-21|accessdate=2021-02-21|url-status=live}}</ref>. [[Эталонная реализация|Эталонной реализацией]] Python является интерпретатор [[CPython]], который поддерживает большинство активно используемых платформ<ref>{{Cite web |url=http://www.python.org/about/ |title=About Python |access-date=2007-08-07 |archive-date=2007-08-11 |archive-url=https://web.archive.org/web/20070811215819/http://www.python.org/about/ |url-status=live }}</ref>, являющийся [[Стандарт де-факто|стандартом де-факто]] языка<ref>{{Cite web|lang=en|url=https://wiki.python.org/moin/PythonImplementations|title=PythonImplementations - Python Wiki|website=wiki.python.org|date=2020-07-21|archiveurl=https://web.archive.org/web/20201111215017/https://wiki.python.org/moin/PythonImplementations|archivedate=2020-11-11|accessdate=2021-02-17|url-status=live}}</ref>. Он распространяется под [[свободное программное обеспечение|свободной лицензией]] [[Python Software Foundation License]], позволяющей использовать его без ограничений в любых приложениях, включая [[проприетарное ПО|проприетарные]]<ref>{{Cite web|lang=en|url=https://docs.python.org/3/license.html|title=History and License|website=Python|access-date=2021-05-21|archive-date=2016-12-05|archive-url=https://web.archive.org/web/20161205134352/https://docs.python.org/3/license.html|url-status=live}}</ref>. CPython компилирует исходные тексты в высокоуровневый [[байт-код]], который исполняется в стековой виртуальной машине<ref name=":18">{{Статья|ссылка=https://cs.ucsb.edu/sites/cs.ucsb.edu/files/docs/reports/2010-14.pdf|автор=Mostafa Chandra Krintz, C. Cascaval, D. Edelsohn, P. Nagpurkar, P. Wu|заглавие=Understanding the Potential of Interpreter-based Optimizations for Python|год=2010|язык=en|издание=UCSB Technical Report|месяц=08|число=11|archiveurl=https://web.archive.org/web/20210223142412/https://cs.ucsb.edu/sites/cs.ucsb.edu/files/docs/reports/2010-14.pdf|archivedate=2021-02-23|access-date=2021-02-23|deadlink=no}}</ref>. К другим трём основным реализациям языка относятся [[Jython]] (для [[JVM]]), [[IronPython]] (для [[CLR]]/[[.NET Framework|.NET]]) и [[PyPy]]<ref name=":2" /><ref name=":3" />. PyPy написан на подмножестве языка Python (RPython) и разрабатывался как альтернатива CPython с целью повышения скорости исполнения программ, в том числе за счёт использования [[JIT-компиляция|JIT-компиляции]]<ref name=":3" />. Поддержка версии Python 2 закончилась в 2020 году<ref name="python-8468">{{cite web|url=https://www.python.org/dev/peps/pep-0373/|title=PEP 373 -- Python 2.7 Release Schedule|lang=en|date=2014-03-23|accessdate=2021-03-07|url-status=live|archiveurl=https://web.archive.org/web/20210225041847/https://www.python.org/dev/peps/pep-0373/|archivedate=2021-02-25}}</ref>. На текущий момент активно развивается версия языка Python 3<ref name=":5">{{Статья|ссылка=https://journals.plos.org/ploscompbiol/article?id=10.1371/journal.pcbi.1004867|автор=Berk Ekmekci, Charles E. McAnany, Cameron Mura|заглавие=An Introduction to Programming for Bioscientists: A Python-Based Primer|год=2016|язык=en|издание=PLOS Computational Biology|месяц=07|число=06|том=12|выпуск=6|страницы=e1004867|issn=1553-7358|doi=10.1371/journal.pcbi.1004867|pmid=27271528|archiveurl=https://web.archive.org/web/20210216190549/https://www.ncbi.nlm.nih.gov/pmc/articles/PMC4896647/pdf/pcbi.1004867.pdf|archivedate=2021-02-16|access-date=2021-02-17|deadlink=no}}</ref>. Разработка языка ведётся через предложения по расширению языка '''PEP''' ({{Lang-en|Python Enhancement Proposal}}), в которых описываются нововведения, делаются корректировки согласно обратной связи от сообщества и документируются итоговые решения<ref name=":7">{{Статья|ссылка=http://ijaerd.com/papers/special_papers/IT032.pdf|автор=Kalyani Adawadkar|заглавие=Python Programming - Applications and Future|год=2017|язык=en|издание=International Journal of Advance Engineering and Research Development|месяц=04|выпуск=SIEICON-2017|страницы=1—4|issn=2348-447|archiveurl=https://web.archive.org/web/20200715080906/http://www.ijaerd.com/papers/special_papers/IT032.pdf|archivedate=2020-07-15|access-date=2021-02-20|deadlink=no}}</ref>. Стандартная библиотека включает большой набор полезных переносимых функций, начиная с возможностей для работы с текстом и заканчивая средствами для написания сетевых приложений. Дополнительные возможности, такие как математическое моделирование, работа с оборудованием, написание веб-приложений или разработка игр, могут реализовываться посредством обширного количества сторонних библиотек, а также интеграцией библиотек, написанных на Си или C++, при этом и сам интерпретатор Python может интегрироваться в проекты, написанные на этих языках<ref name=":2" />. Существует и специализированный [[репозиторий]] программного обеспечения, написанного на Python, — [[PyPI]]<ref name=":10">{{Статья|ссылка=https://papers.ssrn.com/abstract=3426281|автор=Ethan Bommarito, Michael James Bommarito|заглавие=An Empirical Analysis of the Python Package Index (PyPI)|год=2019|язык=en|место=Rochester, NY|издание=Social Science Research Network|издательство=Social Science Research Network|месяц=07|число=25|doi=10.2139/ssrn.3426281|arxiv=arXiv:1907.11073v2|access-date=2021-02-19|archive-date=2021-06-09|archive-url=https://web.archive.org/web/20210609072346/https://papers.ssrn.com/sol3/papers.cfm?abstract_id=3426281|deadlink=no|archivedate=2021-06-09|archiveurl=https://web.archive.org/web/20210609072346/https://papers.ssrn.com/sol3/papers.cfm?abstract_id=3426281}}</ref>. Данный репозиторий предоставляет средства для простой установки пакетов в операционную систему и стал стандартом де-факто для Python<ref>{{Книга|язык=en|ссылка=https://books.google.ru/books?id=O0PfBgAAQBAJ&pg=PA8&lpg=PA8|автор=Pratik Desai|заглавие=Python Programming for Arduino|год=2015|издательство=Packt Publishing Ltd|страницы=8|страниц=400|isbn=978-1-78328-594-5|access-date=2021-02-21|archive-date=2021-02-21|archive-url=https://web.archive.org/web/20210221201536/https://books.google.ru/books?id=O0PfBgAAQBAJ&pg=PA8&lpg=PA8|deadlink=no}}</ref>. По состоянию на 2019 год в нём содержалось более 175 тысяч пакетов<ref name=":10" />. Python стал одним из самых популярных языков, он используется в [[Анализ данных|анализе данных]], [[Машинное обучение|машинном обучении]], [[DevOps]] и [[Веб-разработка|веб-разработке]], а также в других сферах, включая [[Разработка компьютерных игр|разработку игр]]. За счёт читабельности, простого синтаксиса и отсутствия необходимости в компиляции язык хорошо подходит для обучения программированию, позволяя концентрироваться на изучении алгоритмов, концептов и парадигм. Отладка же и экспериментирование в значительной степени облегчаются тем фактом, что язык является интерпретируемым<ref name=":2" /><ref name=":14">{{Статья|ссылка=https://journals.plos.org/ploscompbiol/article?id=10.1371/journal.pcbi.0030199|автор=Sebastian Bassi|заглавие=A Primer on Python for Life Science Researchers|год=2007|язык=en|издание=PLOS Computational Biology|месяц=11|число=30|том=3|выпуск=11|страницы=e199|issn=1553-7358|doi=10.1371/journal.pcbi.0030199|archiveurl=https://web.archive.org/web/20210313132814/https://journals.plos.org/ploscompbiol/article?id=10.1371%2Fjournal.pcbi.0030199|archivedate=2021-03-13|access-date=2021-03-13|deadlink=no}}</ref>. Применяется язык многими крупными компаниями, такими как [[Google (компания)|Google]] или [[Facebook]]<ref name=":2" />. == История == {{main|История языка программирования Python}} [[Файл:Python logo 1990s.svg|мини|200px|Логотип, использовавшийся с 1990-х до 2006 года]] [[Файл:Guido van Rossum OSCON 2006.jpg|мини|200px|[[Ван Россум, Гвидо|Гвидо ван Россум]] в 2006 году на OSCON в Портленде (штат Орегон)]] Задумка по реализации языка появилась в конце [[1980-е|1980-х годов]], а разработка его реализации началась в 1989 году сотрудником голландского института [[Центр математики и информатики|CWI]] [[Гвидо ван Россум]]ом<ref name=":7" />. Для распределённой операционной системы [[Amoeba (операционная система)|Amoeba]] требовался расширяемый [[Сценарный язык|скриптовый язык]], и Гвидо начал разрабатывать Python на досуге, позаимствовав некоторые наработки для языка [[ABC (язык программирования)|ABC]] (Гвидо участвовал в разработке этого языка, ориентированного на обучение программированию). В феврале [[1991 год]]а Гвидо опубликовал исходный текст в [[Группа новостей|группе новостей]] alt.sources<ref>{{Cite web |url=http://svn.python.org/view/*checkout*/python/trunk/Misc/HISTORY |title=Архивированная копия |accessdate=2009-06-01 |archiveurl=https://web.archive.org/web/20160217132249/http://svn.python.org/view/*checkout*/python/trunk/Misc/HISTORY |archivedate=2016-02-17 |url-status=dead }}</ref>. С самого начала Python проектировался как [[объектно-ориентированный язык программирования|объектно-ориентированный язык]]. Гвидо ван Россум назвал язык в честь популярного британского комедийного телешоу [[1970-е|1970-х]] «[[Летающий цирк Монти Пайтона]]»<ref name="AutoNT-24" />, поскольку автор был поклонником этого телешоу, как и многие другие разработчики того времени, а в самом шоу прослеживалась некая параллель с миром компьютерной техники<ref name=":1" />. Наличие дружелюбного, отзывчивого сообщества пользователей считается, наряду с дизайнерской интуицией Гвидо, одним из факторов успеха Python. Развитие языка происходит согласно чётко регламентированному процессу создания, обсуждения, отбора и реализации документов PEP ({{lang-en|Python Enhancement Proposal}}) — предложений по развитию Python<ref>{{Cite web |url=http://www.python.org/dev/peps/ |title=Index of Python Enhancement Proposals (PEPs) |access-date=2007-01-28 |archive-date=2007-01-28 |archive-url=https://web.archive.org/web/20070128214511/http://www.python.org/dev/peps/ |url-status=live }}</ref>. [[3 декабря]] [[2008 год]]а<ref>{{Cite web |url=http://python.org/download/releases/3.0/ |title=Python 3.0 Release |access-date=2009-06-01 |archive-date=2009-06-02 |archive-url=https://web.archive.org/web/20090602015124/http://www.python.org/download/releases/3.0/ |url-status=live }}</ref>, после длительного тестирования, вышла первая версия Python 3000 (или Python 3.0, также используется [[Аббревиатура|сокращение]] Py3k). В Python 3 устранены многие недостатки архитектуры с максимально возможным (но не полным) сохранением совместимости со старыми версиями Python. Дата окончания срока поддержки Python 2.7 первоначально была установлена на 2015 год, а затем перенесена на 2020 год из опасения, что большая часть существующего кода не может быть легко перенесена на Python 3<ref>{{cite web |url=https://legacy.python.org/dev/peps/pep-0373/ |title=PEP 373 -- Python 2.7 Release Schedule |work=python.org |access-date=2017-01-09 |archive-date=2020-05-19 |archive-url=https://web.archive.org/web/20200519075520/https://legacy.python.org/dev/peps/pep-0373/ |url-status=live }}</ref><ref>{{cite web |url=https://www.python.org/dev/peps/pep-0466/ |title=PEP 466 -- Network Security Enhancements for Python 2.7.x |work=python.org |access-date=2017-01-09 |archive-date=2020-06-04 |archive-url=https://web.archive.org/web/20200604232833/https://www.python.org/dev/peps/pep-0466/ |url-status=live }}</ref>. Поддержка Python 2 была направлена лишь на уже существующие проекты, новые проекты должны были использовать Python 3<ref name=":5" />. Официально Python 2.7 не поддерживается с 1 января 2020 года, хотя последнее обновление вышло в апреле 2020. Больше никаких исправлений безопасности или других улучшений для Python 2.7 не будет выпущено<ref name="python-8468" /><ref>{{Cite web|url=https://www.python.org/doc/sunset-python-2/|title=Sunsetting Python 2|website=Python.org|language=en|access-date=2019-09-22|archive-date=2020-01-12|archive-url=https://web.archive.org/web/20200112080903/https://www.python.org/doc/sunset-python-2/|url-status=live}}</ref>. С окончанием срока службы Python 2.x поддерживаются только Python 3.6.x и более поздние версии<ref>{{Cite web|url=https://devguide.python.org/#status-of-python-branches|title=Python Developer's Guide — Python Developer's Guide|website=devguide.python.org|access-date=2019-12-17|archive-date=2020-11-09|archive-url=https://web.archive.org/web/20201109032501/https://devguide.python.org/#status-of-python-branches|url-status=live}}</ref>. == Концепция и философия == {{main|Дзен Пайтона}} [[Файл:Text-x-python.svg|thumb|left|100px|Пиктограмма для файлов .py]] Язык использует [[динамическая типизация|динамическую типизацию]] вместе с [[подсчёт ссылок|подсчётом ссылок]] и циклический [[сборщик мусора]] для [[Менеджер памяти|менеджмента памяти]]<ref name="Reference_counting">{{Cite web| url=https://docs.python.org/extending/extending.html#reference-counts| title=Extending and Embedding the Python Interpreter: Reference Counts| publisher=Docs.python.org| language=en| access-date=2020-06-05| quote=Since Python makes heavy use of <code>malloc()</code> and <code>free()</code>, it needs a strategy to avoid memory leaks as well as the use of freed memory. The chosen method is called ''reference counting''.| archive-date=2012-10-18| archive-url=https://web.archive.org/web/20121018063230/http://docs.python.org/extending/extending.html#reference-counts| url-status=live}}</ref>. Также есть динамические [[разрешения имён (программирование)|разрешения имён]] ([[Область видимости#Динамическое связывание|динамическое связывание]]), которые связывают имена методов и переменных во время выполнения программы. Python предлагает поддержку функционального программирования в традициях [[Лисп]]а. Так, в Python есть функции <code>filter</code>, <code>map</code> и <code>reduce</code> (Начиная с python 3, находится в библиотеке <code>itertools</code> <ref>{{Cite web |url=https://docs.python.org/3/whatsnew/3.0.html |title=What’s New In Python 3.0 — Python 3.12.0 documentation<!-- Заголовок добавлен ботом --> |access-date=2023-10-08 |archive-date=2012-11-02 |archive-url=https://web.archive.org/web/20121102053959/https://docs.python.org/3/whatsnew/3.0.html |url-status=live }}</ref>; также из Лиспа были заимствованы понятия [[Характеристика списка|характеристик списков]], [[Ассоциативный массив|ассоциативных массивов]] (словарей), [[Множество (тип данных)|множеств]] и генераторов списков<ref name="AutoNT-59">{{cite web |url=https://www.python.org/dev/peps/pep-0289/ |title=PEP 289&nbsp;– Generator Expressions |last=Hettinger |first=Raymond |date=2002-01-30 |work=Python Enhancement Proposals |publisher=Python Software Foundation |access-date=2012-02-19 |archive-date=2020-06-14 |archive-url=https://web.archive.org/web/20200614153717/https://www.python.org/dev/peps/pep-0289/ |url-status=live }}</ref>. Стандартная библиотека содержит два модуля (itertools и functools), реализующие инструменты, заимствованные из [[Haskell]] и [[Standard ML]]<ref name="AutoNT-18">{{cite web |url=https://docs.python.org/3/library/itertools.html |title=6.5 itertools&nbsp;– Functions creating iterators for efficient looping |publisher=Docs.python.org |access-date=2016-11-22 |archive-date=2020-06-14 |archive-url=https://web.archive.org/web/20200614153629/https://docs.python.org/3/library/itertools.html |url-status=live }}</ref>. {{Якорь|Философия}} Разработчики языка Python придерживаются определённой философии программирования, называемой «The Zen of Python» («[[Дзен]] Пито́на», или «Дзен Па́йтона»)<ref>{{Cite web |url=http://www.python.org/peps/pep-0020.html |title=PEP 20 — The Zen of Python |access-date=2005-09-23 |archive-date=2005-07-17 |archive-url=https://web.archive.org/web/20050717021621/http://www.python.org/peps/pep-0020.html |url-status=live }}</ref>. Её текст выдаётся [[интерпретатор]]ом Python по команде <code>import this</code> (работает один раз за сессию). Автором этой философии считается [[Петерс, Тим|Тим Петерс]] (Tim Peters). <div style="float:right"> {{начало цитаты|источник=Философия начинается так<ref>{{Книга|ссылка=https://books.google.ru/books?id=jLFjDwAAQBAJ&pg=PA64|автор=Бейдер Дэн|заглавие=Чистый Python. Тонкости программирования для профи|год=2018|издательство="Издательский дом ""Питер"""|страницы=64—65|страниц=288|isbn=978-5-4461-0803-9|access-date=2020-09-21|archive-date=2021-04-10|archive-url=https://web.archive.org/web/20210410140709/https://books.google.ru/books?id=jLFjDwAAQBAJ&pg=PA64|deadlink=no}}</ref>}} * Красивое лучше, чем уродливое. * Явное лучше, чем неявное. * Простое лучше, чем сложное. * Сложное лучше, чем запутанное. …. {{oq|en| * Beautiful is better than ugly. * Explicit is better than implicit. * Simple is better than complex. * Complex is better than complicated. ... }}{{конец цитаты}} </div> Вместо того, чтобы встроить в ядро Python всю функциональность языка, он был спроектирован таким образом, чтобы быть легко расширяемым. Это сделало язык популярным средством добавления программируемых интерфейсов к существующим приложениям. Видение Гвидо ван Россума маленького ядра с большой стандартной библиотекой и легко расширяемым интерпретатором проистекало из негативного опыта разработки языка [[ABC (язык программирования)|ABC]], который придерживался противоположного подхода<ref name="venners-interview-pt-1">{{cite web |url=http://www.artima.com/intv/pythonP.html |title=The Making of Python |last=Venners |first=Bill |date=2003-01-13 |work=Artima Developer |publisher=Artima |access-date=2007-03-22 |archive-date=2016-09-01 |archive-url=https://web.archive.org/web/20160901183332/http://www.artima.com/intv/pythonP.html |url-status=live }}</ref>. Python стремится к более простому, менее громоздкому синтаксису и грамматике, предоставляя разработчикам выбор в их методологии кодирования. В отличие от девиза [[Perl]] «[[There’s More Than One Way To Do It|есть несколько способов сделать это]]», Python придерживается философии «должен существовать один — и, желательно, только один — очевидный способ сделать это»<ref name="PEP20">{{cite web |url=https://www.python.org/dev/peps/pep-0020/ |title=PEP 20&nbsp;– The Zen of Python |last=Peters |first=Tim |date=2004-08-19 |work=Python Enhancement Proposals |publisher=Python Software Foundation |access-date=2008-11-24 |archive-date=2018-12-26 |archive-url=https://web.archive.org/web/20181226141127/https://www.python.org/dev/peps/pep-0020/ |url-status=live }}</ref>. {{Нп5|Мартелли, Алекс|Алекс Мартелли|en|Alex Martelli}}, член [[Python Software Foundation]], и автор книг по Python пишет, что «Описывать что-то как „умное“ не считается комплиментом в культуре Python»<ref name="AutoNT-19">{{cite book | url=http://shop.oreilly.com/product/9780596007973.do | title=Python Cookbook, 2nd Edition | publisher=[[O'Reilly Media]] | author=Alex Martelli, Anna Ravenscroft, David Ascher | year=2005 | page=230 | isbn=978-0-596-00797-3 }} {{Wayback|url=http://shop.oreilly.com/product/9780596007973.do |date=20200223171254 }} {{Cite web |url=http://shop.oreilly.com/product/9780596007973.do |title=Источник |access-date=2020-12-28 |archive-date=2020-02-23 |archive-url=https://web.archive.org/web/20200223171254/http://shop.oreilly.com/product/9780596007973.do |url-status=unfit }}</ref>. Разработчики Python стремятся избежать преждевременной оптимизации и отвергают патчи к некритическим частям эталонной реализации [[CPython]], которые могли бы предложить незначительное увеличение скорости за счёт понятности кода<ref name="AutoNT-20">{{cite web | title=Python Culture | website=ebeab | date=2014-01-21 | url=http://ebeab.com/2014/01/21/python-culture/ | archive-url=https://web.archive.org/web/20140130021902/http://ebeab.com/2014/01/21/python-culture/ | archive-date=2014-01-30 |url-status=dead}}</ref>. Однако есть способы повышения производительности. Если в программе есть узкие места, связанные с выполнением ресурсоёмких операций на центральном процессоре, но не связанные с использованием операций ввода-вывода, то повысить производительность возможно за счёт трансляции программы при помощи [[Cython]] в язык Си и последующей компиляции<ref>{{Книга|ссылка=https://books.google.ru/books?id=gdN5AAAAQBAJ&pg=PA201&lpg=PA201|автор=Mark Summerfield|заглавие=Python in Practice: Create Better Programs Using Concurrency, Libraries, and Patterns|год=2013-08-20|издательство=Addison-Wesley|страницы=201|страниц=326|isbn=978-0-13-337323-3|access-date=2021-01-28|archive-date=2021-06-09|archive-url=https://web.archive.org/web/20210609072351/https://books.google.ru/books?id=gdN5AAAAQBAJ&pg=PA201&lpg=PA201|deadlink=no}}</ref>. Требовательные к вычислительным ресурсам части программы также можно переписывать на язык Си и подключать как отдельные библиотеки с привязками к Python<ref name=":3">{{Статья|ссылка=https://www.sciencedirect.com/science/article/pii/S2213133714000687|автор=J. Akeret, L. Gamper, A. Amara, A. Refregier|заглавие=HOPE: A Python just-in-time compiler for astrophysical computations|год=2015|язык=en|издание=Astronomy and Computing|месяц=04|число=01|том=10|страницы=1–8|issn=2213-1337|doi=10.1016/j.ascom.2014.12.001|arxiv=1410.4345v2|archiveurl=https://web.archive.org/web/20210215210244/https://arxiv.org/pdf/1410.4345.pdf|archivedate=2021-02-15|access-date=2021-02-15|deadlink=no}}</ref>. Важная цель разработчиков Python — делать его забавным для использования. Это было отражено в названии языка, данном в честь [[Монти Пайтон]]а<ref name="AutoNT-24">{{cite web |url=https://docs.python.org/3/faq/general.html#why-is-it-called-python |title=General Python FAQ |work=Python v2.7.3 documentation |publisher=Docs.python.org |access-date=2020-06-04 |archive-date=2012-10-24 |archive-url=https://web.archive.org/web/20121024164224/http://docs.python.org/faq/general.html#why-is-it-called-python |url-status=live }}</ref>. Также это отражено в иногда игривом подходе к обучающим программам и справочным материалам, таким как примеры программ из документаций, которые используют названия spam и eggs вместо использующихся в документации множества других языков foo и bar<ref>{{Cite web|url=https://insidetech.monster.com/training/articles/8114-15-ways-python-is-a-powerful-force-on-the-web|title=15 Ways Python Is a Powerful Force on the Web|accessdate=2020-12-28|archive-date=2019-05-11|archive-url=https://web.archive.org/web/20190511065650/http://insidetech.monster.com/training/articles/8114-15-ways-python-is-a-powerful-force-on-the-web|url-status=dead}}</ref><ref>{{Cite web|url=https://docs.python.org/3/library/pprint.html|title=8.18. pprint — Data pretty printer — Python 3.8.3 documentation|website=docs.python.org|access-date=2020-12-28|archive-date=2021-01-22|archive-url=https://web.archive.org/web/20210122224848/https://docs.python.org/3/library/pprint.html|url-status=live}}</ref>. == Портируемость == Python [[Портирование программного обеспечения|портирован]] и работает почти на всех известных платформах — от [[Карманный персональный компьютер|КПК]] до [[мейнфрейм]]ов. Существуют порты под [[Microsoft Windows]], практически под все варианты [[UNIX]] (включая [[FreeBSD]] и [[Linux]]), [[Android]]<ref>{{cite web|url=http://www.damonkohler.com/2008/12/python-on-android.html|title=Python on Android|publisher=www.damonkohler.com|accessdate=2009-12-19|lang=en|archiveurl=https://www.webcitation.org/5w4n0S15k?url=http://www.damonkohler.com/2008/12/python-on-android.html|archivedate=2011-01-28}}</ref>, [[Plan 9]], [[Mac OS]] и [[macOS]], [[iOS|iPhone OS (iOS)]] 2.0 и выше, [[iPadOS]], [[Palm OS]], [[OS/2]], [[Amiga]], [[HaikuOS]], [[AS/400]], [[OS/390]], [[Windows Mobile]] и [[Symbian]]. По мере устаревания платформы её поддержка в основной ветви языка прекращается. Например, с версии 2.6 прекращена поддержка [[Windows 95]], [[Windows 98]] и [[Windows ME]]<ref>{{cite web|url=http://docs.python.org/whatsnew/2.6.html#port-specific-changes-windows|title=Port-Specific Changes: Windows|work=Python v2.6.1 documentation. What’s New in Python 2.6|publisher=Python Software Foundation|accessdate=2008-12-11|lang=en|archiveurl=https://www.webcitation.org/5w4n1Glim?url=http://docs.python.org/whatsnew/2.6.html#port-specific-changes-windows|archivedate=2011-01-28}}</ref>. В версии 3.5 перестала поддерживаться [[Windows XP]]<ref>{{Cite web|lang=en|url=https://docs.python.org/3.5/using/windows.html|title=3. Using Python on Windows — Python 3.5.9 documentation|author=|website=Python Documentation|date=|publisher=Python Software Foundation|accessdate=2020-06-08|archive-date=2020-10-15|archive-url=https://web.archive.org/web/20201015064442/https://docs.python.org/3.5/using/windows.html|url-status=live}}</ref> В версии 3.9 перестала поддерживаться [[Windows Vista]] и [[Windows 7]]<ref>{{Cite web|lang=en|url=https://bugs.python.org/issue32592|title=Drop support of Windows Vista and 7 in Python 3.9|access-date=2021-01-10|archive-date=2020-11-04|archive-url=https://web.archive.org/web/20201104213940/https://bugs.python.org/issue32592|url-status=live}}</ref>. При этом, в отличие от многих портируемых систем, для всех основных платформ Python имеет поддержку характерных для данной платформы технологий (например, Microsoft [[Microsoft Component Object Model|COM]]/[[Microsoft Distributed Component Object Model|DCOM]]). Более того, существует специальная версия Python для [[Виртуальная машина Java|виртуальной машины Java]] — [[Jython]], что позволяет интерпретатору выполняться на любой системе, поддерживающей [[Java]], при этом классы [[Java]] могут непосредственно использоваться из Python и даже быть написанными на Python. Также несколько проектов обеспечивают интеграцию с платформой [[Microsoft.NET]], основные из которых — [[IronPython]] и [[Python.NET]]. == Типы и структуры данных == [[Файл:Python 3. The standard type hierarchy.png|thumb]] Python поддерживает [[динамическая типизация|динамическую типизацию]], то есть тип переменной определяется только во время исполнения. Поэтому вместо «присваивания значения переменной» лучше говорить о «связывании значения с некоторым именем». Также Python поддерживает подсказки типов с помощью аннотаций, добавляющие поддержку [[Последовательная типизация|последовательной типизации]] и позволяющие использовать статический анализ кода<ref>{{Источник информации|ссылка=https://peps.python.org/pep-0484/|заглавие=PEP 484 - Type Hints|язык=en|издание=Python Enhancement Proposals|дата обращения=2023-10-09}}</ref>. Подсказки типов не используются во время компиляции и исполнения кода непосредственно [[CPython]]<ref>{{Источник информации|ссылка=https://books.google.com/books?id=JidnEAAAQBAJ&newbks=0&printsec=frontcover&pg=PT249&dq=python+static+analysis+Type+Hints&hl=ru|авторы=Luciano Ramalho|заглавие=Fluent Python|язык=en|дата=2022-03-31|издатель=O'Reilly Media, Inc.|страницы=253|страниц=972|isbn=978-1-4920-5630-0}}</ref>, но могут использоваться некоторыми библиотеками, например, [[FastAPI]]. К примитивным типам в Python относятся [[булевский тип|булевый]], целое число произвольной длины, число [[плавающая запятая|с плавающей запятой]] и [[комплексное число]]. Из контейнерных типов в Python встроены: [[строковый тип|строка]], [[список (информатика)|список]], [[кортеж (информатика)|кортеж]], [[ассоциативный массив|словарь]] и [[множество (тип данных)|множество]]<ref name=":14" />. Все значения являются объектами, в том числе функции, методы, модули, классы. Добавить новый тип можно либо написав [[класс (программирование)|класс]] (class), либо определив новый тип в модуле расширения (например, написанном на языке C). Система классов поддерживает [[наследование (программирование)|наследование]] (одиночное и [[множественное наследование|множественное]]) и [[метапрограммирование]]. Возможно наследование от большинства встроенных типов и типов расширений. {|class="wikitable" |+Типы, используемые в Python |- ! Тип ! [[Неизменяемый объект|Изменяемость]] ! Описание ! style="width: 23em;" | Примеры |- | <code>bool</code> | Неизменяемый | [[Логический тип]] | {{code|lang=python|True}}<br>{{code|lang=python|False}} |- | <code>bytearray</code> | Изменяемый | Массив байтов | {{code|lang=python|bytearray(b'Some ASCII')}}<br>{{code|lang=python|bytearray(b"Some ASCII")}}<br>{{code|lang=python|bytearray([119, 105, 107, 105])}} |- | <code>bytes</code> | Неизменяемый | Массив байтов | {{code|lang=python|b'Some ASCII'}}<br>{{code|lang=python|b"Some ASCII"}}<br>{{code|lang=python|bytes([119, 105, 107, 105])}} |- | <code>complex</code> | Неизменяемый | [[Комплексное число]] | {{code|lang=python|3+2.7j}} |- | <code>dict</code> | Изменяемый | Словарь ([[ассоциативный массив]]), представляет собой коллекцию пар «ключ—значение»; значение может быть любого типа, ключ должен иметь хешируемый тип | {{code|lang=python|{'key1': 1.0, 3: False} }}<br>{{code|lang=python|{} }} |- | <code>types.EllipsisType</code> | Неизменяемый | {{Не переведено 5|Многоточие (программирование)|Многоточие|en|Ellipsis (computer programming)}} (эллипсис). Используется в основном в [[NumPy]] для сокращённого задания среза многомерного массива. В самом Python присутствует для поддержки пользовательских типов и таких расширений, как NumPy{{Sfn|Рамальо|2016|p=61}} | {{code|lang=python|...}}<br>{{code|lang=python|Ellipsis}}<br>Для [[NumPy]]: <br>{{code|lang=python|x[i, ..., j]}},<br> что эквивалентно<br>{{code|lang=python|x[i, :, :, j]}}{{Sfn|Рамальо|2016|p=61}} |- | <code>float</code> | Неизменяемый | [[Число с плавающей запятой]]. Степень точности зависит от платформы, но на практике обычно реализуется в виде 64-битного 53-разрядного числа<ref>{{Cite web |title=15. Floating Point Arithmetic: Issues and Limitations — Python 3.8.3 documentation |url=https://docs.python.org/3.8/tutorial/floatingpoint.html#representation-error |access-date=2020-06-06 |website=docs.python.org |quote=Almost all machines today (November 2000) use IEEE-754 floating point arithmetic, and almost all platforms map Python floats to IEEE-754 “double precision”. |archive-date=2020-06-06 |archive-url=https://web.archive.org/web/20200606113842/https://docs.python.org/3.8/tutorial/floatingpoint.html#representation-error |url-status=live }}</ref> | {{code|lang=python|1.414}} |- | <code>frozenset</code> | Неизменяемый | Неупорядочное [[множество (тип данных)|множество]], не содержит дубликатов; может содержать внутри себя различные хешируемые типы данных | {{code|lang=python|frozenset([4.0, 'string', True])}} |- | <code>int</code> | Неизменяемый | [[Множество (тип данных)|Целое число]] неограниченного размера<ref name="pep0237">{{cite web |url=https://www.python.org/dev/peps/pep-0237/ |title=PEP 237&nbsp;– Unifying Long Integers and Integers |author=Moshe Zadka, Guido van Rossum |date=2001-03-11 |work=Python Enhancement Proposals |publisher=Python Software Foundation |access-date=2011-09-24 |archive-date=2020-05-28 |archive-url=https://web.archive.org/web/20200528063237/https://www.python.org/dev/peps/pep-0237/ |url-status=live }}</ref> | {{code|lang=python|42}} |- | <code>list</code> | Изменяемый | [[Список (информатика)|Список]], может содержать внутри себя различные типы данных | {{code|lang=python|[4.0, 'string', True]}}<br>{{code|lang=python|[]}} |- | <code>NoneType</code>{{ref+|Недоступно непосредственно по имени типа.|К|П}} | Неизменяемый | Объект, представляющий собой отсутствие значения, часто называемый {{Не переведено 5|Null pointer|Null|en|Null pointer}} в других языках. | {{code|lang=python|None}} |- | <code>NotImplementedType</code>{{ref+||К|П}} | Неизменяемый | Объект, который возвращается при [[Перегрузка операторов|перегрузке операторов]], когда типы операндов не поддерживаются. | {{code|lang=python|NotImplemented}} |- | <code>range</code> | Неизменяемый | Последовательность целых чисел от какого-то одного значения до другого, обычно используется для повторения операции несколько раз при помощи for<ref>{{cite web |title=Built-in Types |url=https://docs.python.org/3/library/stdtypes.html#typesseq-range |access-date=2019-10-03 |archive-date=2020-06-14 |archive-url=https://web.archive.org/web/20200614194325/https://docs.python.org/3/library/stdtypes.html#typesseq-range |url-status=live }}</ref> | {{code|lang=python|range(1, 10)}}<br>{{code|lang=python|range(10, -5, -2)}} |- | <code>set</code> | Изменяемый | Неупорядочное [[множество (тип данных)|множество]], не содержит дубликатов; может содержать внутри себя различные хешируемые типы данных | {{code|lang=python|{4.0, 'string', True} }}<br>{{code|lang=python|set()}} |- | <code>str</code> | Неизменяемый | [[Строковый тип]] | {{code|lang=python|'Wikipedia'}}<br>{{code|lang=python|"Wikipedia"}}<br><syntaxhighlight lang="python">"""Spanning multiple lines"""</syntaxhighlight> |- | <code>tuple</code> | Неизменяемый | [[Кортеж (информатика)|Кортеж]]. Может содержать внутри себя различные типы данных. Может использоваться в качестве неизменяемого списка и в качестве записей с неименованными полями{{Sfn|Рамальо|2016|pp=52—54}} | В качестве неизменяемого списка: <br>{{code|lang=python|(4.0, 'string', True)}}<br>{{code|lang=python|('single element',)}}<br>{{code|lang=python|()}}<br>В качестве записей:<br>{{code|lang=python|lax_coordinates {{=}} (33.9425, -118.408056)}} <br>{{code|lang=python|city, year, pop, chg, area {{=}} ('Tokyo', 2003, 32450, 0.66, 8014)}}{{Sfn|Рамальо|2016|pp=52—54}} |} == Синтаксис и семантика == {{Основная статья|Синтаксис и семантика Python}} === Операторы === Набор операторов достаточно традиционен. * Условный оператор <code>if</code> (если). При наличии нескольких условий и альтернатив применяется необязательный блок <code>elif</code>(сокращение от else if) который может повторяться в коде неограниченное число раз. Если ни одно из условий не было соблюдено, то выполняется необязательный блок <code>else</code> (иначе). * Оператор цикла <code>while</code>. * Оператор итерации <code>for</code>. * Операторы обработки исключений <code>try</code> — <code>except</code> — <code>else</code> — <code>finally</code>. * Оператор определения класса <code>class</code>. * Оператор определения функции, метода или генератора <code>def</code>. Внутри возможно применение <code>return</code> (возврат) для возврата из функции или метода, а в случае генератора — <code>yield</code> (давать). * Оператор [[Сопоставление с образцом|сопоставления с образцом]] (начиная с Python 3.10) <code>match</code> — <code>case</code>. * Операторы вызова исключений <code>raise</code> и <code>assert</code>. * Оператор <code>pass</code> ничего не делает. Используется для пустых блоков кода. === Система отступов === Одной из интересных синтаксических особенностей языка является выделение [[блок (программирование)|блоков]] кода с помощью отступов (пробелов или табуляций), поэтому в Python отсутствуют [[операторные скобки]] begin/end, как в языке [[Паскаль (язык программирования)|Паскаль]], или фигурные скобки, как в [[Си (язык программирования)|Си]]. Такой «трюк» позволяет сократить количество строк и символов в программе и приучает к «хорошему» стилю программирования. С другой стороны, поведение и даже корректность программы может зависеть от начальных пробелов в тексте. Тем, кто привык программировать на языках с явным выделением начала и конца блоков, такое поведение поначалу может показаться неинтуитивным и неудобным. Сам Гвидо писал<ref name="foreword" />: {{начало цитаты}} Наверное, самой спорной особенностью Python является использование отступов для группировки операторов, что взято непосредственно из [[ABC (язык программирования)|ABC]]. Это одна из особенностей языка, которая дорога моему сердцу. Это делает код Python более читабельным двумя способами. Во-первых, использование отступов уменьшает визуальное нагромождение и делает программы короче, тем самым сокращая объём внимания, необходимого для восприятия базовой единицы кода. Во-вторых, это даёт программисту меньше свободы в форматировании, тем самым делая возможным более единообразный стиль, что облегчает чтение чужого кода. (Сравните, например, [[Отступ (программирование)#Отступы в Си|три или четыре различных соглашения]] о размещении фигурных скобок в [[Си (язык программирования)|Си]], каждое из которых имеет сильных сторонников). {{оригинальный текст|en|Perhaps Python's most controversial feature is its use of indentation for statement grouping, which derives directly from ABC. It is one of the language's features that is dearest to my heart. It makes Python code more readable in two ways. First, the use of indentation reduces visual clutter and makes programs shorter, thus reducing the attention span needed to take in a basic unit of code. Second, it allows the programmer less freedom in formatting, thereby enabling a more uniform style, which makes it easier to read someone else's code. (Compare, for instance, the three or four different conventions for the placement of braces in C, each with strong proponents.)}} {{конец цитаты}} === Выражения === Состав, синтаксис, ассоциативность и приоритет операций достаточно привычны для языков программирования и призваны минимизировать употребление скобок. Если сравнивать с математикой, то приоритеты операторов зеркалируют соответствующие в математике, при этом оператор присвоения значения <code>=</code> соответствует типографскому <code>←</code>. Хотя приоритеты операций позволяют не использовать скобки во многих случаях, на анализ больших выражений может тратиться лишнее время, в результате чего в таких случаях выгоднее явно расставлять скобки<ref name=":5" />. Отдельно стоит упомянуть ''операцию форматирования'' для строк (работает по аналогии с функцией <code>printf()</code> из Си), которая использует тот же символ, что и взятие остатка от деления: <source lang="python"> >>> str_var = "world" >>> print("Hello, %s" % str_var) Hello, world </source> В версии 3.6 были добавлены ''форматированные строковые литералы'', или ''f-строки,'' которые делают код более читаемым и лаконичным:<syntaxhighlight lang="python3"> >>> str_var = "world" >>> print(f"Hello, {str_var}") # вывод с использованием f-строки Hello, world </syntaxhighlight>Python имеет удобные ''цепочечные сравнения'': <source lang="python"> 1 <= a < 10 and 1 <= b < 20 </source> Кроме того, логические операции (<code>or</code> и <code>and</code>) являются [[Ленивые вычисления|ленивыми]]: если для вычисления значения операции достаточно первого операнда, этот операнд и является результатом, в противном случае вычисляется второй операнд логической операции. Это основывается на свойствах [[Алгебра логики|алгебры логики]]: например, если один аргумент операции «ИЛИ» (<code>or</code>) является истиной, то и результат этой операции всегда является истиной. В случае, если второй операнд является сложным выражением, это позволяет сократить издержки на его вычисление. Этот факт широко использовался до версии 2.5 вместо условной конструкции: <source lang="python"> a < b and "меньше" or "больше или равно" </source> Встроенные типы данных, как правило, имеют особый синтаксис для своих литералов (записанных в исходном коде констант): <source lang="python"> "строка и Юникод-строка одновременно" 'строка и Юникод-строка одновременно' """тоже строка и Юникод-строка одновременно""" True or False # булевы литералы 3.14 # число с плавающей запятой 0b1010 + 0o12 + 0xA # числа в двоичной, восьмеричной и шестнадцатеричной системах счисления 1 + 2j # комплексное число [1, 2, "a"] # список (1, 2, "a") # кортеж {'a': 1, 'b': 'B'} # словарь {'a', 6, 8.8} # множество lambda x: x**2 # анонимная функция (i for i in range(10)) # генератор </source> Для списков (и других последовательностей) Python предлагает набор операций над срезами. Особенностью является индексация, которая может показаться новичку странной, но раскрывает свою согласованность по мере использования. Индексы элементов списка начинаются с нуля. Запись среза <code>s[N:M]</code> означает, что в срез попадают все элементы от N включительно до M, не включая. При этом индекс можно не указывать. Например, запись <code>s[:M]</code> означает, что в срез попадают все элементы с самого начала; запись <code>s[N:]</code> означает, что попадают все элементы до конца среза; запись <code>s[:]</code> означает, что попадают все элементы с начала и до конца. === Имена === Имя (идентификатор) может начинаться с буквы любого алфавита в [[Юникод]]е любого регистра или подчёркивания, после чего в имени можно использовать и цифры. В качестве имени нельзя использовать ключевые слова (их список можно узнать по <code>import keyword; print(keyword.kwlist)</code>) и нежелательно переопределять встроенные имена. Имена, начинающиеся с символа подчёркивания, имеют специальное значение<ref>{{cite web|url=http://docs.python.org/reference/lexical_analysis.html#reserved-classes-of-identifiers|title=2.3.2. Reserved classes of identifiers|work=Python documentation|date=2009-10-18|archiveurl=https://www.webcitation.org/5w4n2As6O?url=http://docs.python.org/reference/lexical_analysis.html#reserved-classes-of-identifiers|archivedate=2011-01-28}}</ref>. В каждой точке программы интерпретатор имеет доступ к трём [[пространство имён (программирование)|пространствам имён]] (то есть отображениям имён в объекты): локальному, глобальному и встроенному. ''Области видимости'' имён могут быть вложенными друг в друга (внутри определяемой функции видны имена из окружающего блока кода). На практике с областями видимости и связыванием имён связано несколько правил «хорошего тона», о которых можно подробнее узнать из документации. === Строки документации === Python предлагает механизм [[Техническая документация|документирования]] кода pydoc. В начало каждого модуля, класса, функции вставляется строка документации — ''{{не переведено|docstring||en|docstring}}''. Строки документации остаются в коде на момент времени исполнения, и в язык встроен доступ к документации<ref>{{Cite web |url=http://softwaremaniacs.org/blog/2005/12/08/django/ |title=…целостность больших проектов на Python строится на двух вещах: тесты и doc-строка |access-date=2008-10-31 |archive-date=2008-10-21 |archive-url=https://web.archive.org/web/20081021094143/http://softwaremaniacs.org/blog/2005/12/08/django/ |url-status=live }}</ref>(переменная <code>__doc__</code>), что используется современными IDE ([[Интегрированная среда разработки]]) (например, [[Eclipse (среда разработки)|Eclipse]]). В интерактивном режиме можно получить помощь, сгенерировать гипертекстовую документацию по целому модулю или даже применить ''{{не переведено|doctest||en|doctest}}'' для автоматического тестирования модуля. == [[Парадигма программирования|Парадигмы программирования]] == Python — [[мультипарадигменный язык программирования]]. Полностью поддерживаются [[Объектно-ориентированное программирование|объектно-ориентированное]], [[структурное программирование|структурное]]<ref name=":6">{{Cite web|lang=en|url=http://facweb.cs.depaul.edu/sjost/it211/documents/structured.htm|title=Structured Programming Details|author=Steve D. Jost|website=[[Университет Де Поля]]|date=2019|access-date=2021-02-17|archive-date=2020-04-29|archive-url=https://web.archive.org/web/20200429100316/http://facweb.cs.depaul.edu/sjost/it211/documents/structured.htm|url-status=live}}</ref>, [[Обобщённое программирование|обобщённое]], [[Функциональное программирование|функциональное]] программирование<ref name=":2" /> и [[метапрограммирование]]<ref name=":12" />. Базовая поддержка [[Аспектно-ориентированное программирование|аспектно-ориентированного]] программирования реализуется за счёт метапрограммирования<ref name=":13" />. Множество других методик, в том числе [[контрактное программирование|контрактное]]<ref name="AutoNT-15">{{cite web |url=http://www.nongnu.org/pydbc/ |title=PyDBC: method preconditions, method postconditions and class invariants for Python |access-date=2011-09-24 |archive-date=2019-11-23 |archive-url=https://web.archive.org/web/20191123231931/http://www.nongnu.org/pydbc/ |url-status=live }}</ref><ref name="AutoNT-16">{{cite web |url=http://www.wayforward.net/pycontract/ |title=Contracts for Python |access-date=2011-09-24 |archive-date=2020-06-15 |archive-url=https://web.archive.org/web/20200615173404/http://www.wayforward.net/pycontract/ |url-status=live }}</ref> и [[логическое программирование]]<ref name="AutoNT-17">{{cite web |url=https://sites.google.com/site/pydatalog/ |title=PyDatalog |access-date=2012-07-22 |archive-date=2020-06-13 |archive-url=https://web.archive.org/web/20200613160231/https://sites.google.com/site/pydatalog/ |url-status=live }}</ref> можно реализовать с помощью расширений. === [[Объектно-ориентированное программирование]] === Дизайн языка Python построен вокруг объектно-ориентированной модели программирования. Реализация [[Объектно-ориентированное программирование|ООП]] в Python является хорошо продуманной, но вместе с тем достаточно специфической по сравнению с другими [[Объектно-ориентированный язык программирования|объектно-ориентированными языками]]. В языке всё является объектами — либо экземплярами классов, либо экземплярами метаклассов. Исключением является базовый встроенный метакласс <code>'''type'''</code>. Таким образом, классы на самом деле являются экземплярами метаклассов, а производные метаклассы являются экземплярами метакласса <code>'''type'''</code>. Метаклассы являются частью концепции метапрограммирования и предоставляют возможность управления наследованием классов, что позволяет создавать абстрактные классы, регистрировать классы или добавлять в них какой-либо программный интерфейс в рамках [[Библиотека (программирование)|библиотеки]] или [[фреймворк]]а<ref name=":12" />. Классы по своей сути представляют план или описание того, как создать объект, и хранят в себе описание атрибутов объекта и методов для работы с ним. Парадигма ООП основывается на [[Инкапсуляция (программирование)|инкапсуляции]], [[Наследование (программирование)|наследовании]] и [[Полиморфизм (информатика)|полиморфизме]]<ref name=":15" />. Инкапсуляция в Python представлена возможностью хранения публичных и скрытых [[Поле класса|атрибутов]] (полей) в объекте с предоставлением [[Метод (программирование)|методов]] для работы с ними<ref name=":15" />, при этом на самом деле все атрибуты являются публичными, но для пометки скрытых атрибутов существует соглашение об именовании<ref name=":16" />. Наследование позволяет создавать производные объекты без необходимости повторного написания кода, а полиморфизм заключается в возможности переопределения любых методов объекта (в Python все методы являются [[Виртуальный метод|виртуальными]]<ref name=":16">{{Cite web|lang=en|url=https://docs.python.org/3/tutorial/classes.html|title=9. Classes|website=Python 3.9.2 documentation|publisher=docs.python.org|archive-url=https://web.archive.org/web/20210314111300/https://docs.python.org/3/tutorial/classes.html|archive-date=2021-03-14|access-date=2021-03-14|url-status=live}}</ref>), а также в перегрузке [[Перегрузка процедур и функций|методов]] и [[Перегрузка операторов|операторов]]. Перегрузка методов в Python реализуется за счёт возможности вызова одного и того же метода с разным набором аргументов<ref name=":15">{{Cite web|lang=en|url=https://developer.ibm.com/languages/python/tutorials/object-oriented-programming-in-python/|title=Object-oriented programming in Python|website=IBM Developer|date=2020-10-20|publisher=ibm.com|archive-url=https://web.archive.org/web/20210311194854/https://developer.ibm.com/languages/python/tutorials/object-oriented-programming-in-python/|archive-date=2021-03-11|access-date=2021-03-11|url-status=live}}</ref>. Особенностью Python является возможность модифицировать классы после их объявления, добавляя в них новые атрибуты и методы<ref name=":5" />, также можно модифицировать и сами объекты, в результате чего классы могут использоваться как структуры для хранения произвольных данных<ref name=":16" />. В Python поддерживается множественное наследование. Само по себе множественное наследование является сложным, и его реализации сталкиваются с проблемами разрешения коллизий имён между родительскими классами и с возможным повторным наследованием от одного и того же класса в иерархии. В Python методы вызываются согласно порядку разрешения методов (MRO), который основан на алгоритме [[C3-линеаризация|C3-линеаризации]]<ref>{{Статья|ссылка=https://thesai.org/Publications/ViewPaper?Volume=8&Issue=6&Code=IJACSA&SerialNo=14|автор=Fawzi Albalooshi, Amjad Mahmood|заглавие=A Comparative Study on the Effect of Multiple Inheritance Mechanism in Java, C++, and Python on Complexity and Reusability of Code|год=2017|язык=en|издание=International Journal of Advanced Computer Science and Applications (IJACSA)|том=8|выпуск=6|issn=2156-5570|doi=10.14569/IJACSA.2017.080614|archiveurl=https://web.archive.org/web/20200710024816/https://thesai.org/Downloads/Volume8No6/Paper_14-A_Comparative_Study_on_the_Effect_of_Multiple.pdf|archivedate=2020-07-10|access-date=2021-03-12|deadlink=no}}</ref>, в обычных случаях при написании программ не требуется знать принцип работы данного алгоритма, понимание же может потребоваться при создании нетривиальных иерархий классов<ref>{{Cite web|lang=en|url=https://www.python.org/download/releases/2.3/mro/|title=The Python 2.3 Method Resolution Order|author=Michele Simionato|website=Python.org|archive-url=https://web.archive.org/web/20210314152959/https://www.python.org/download/releases/2.3/mro/|archive-date=2021-03-14|access-date=2021-03-14|url-status=live}}</ref>. Возможности и особенности, специфичные для Python: * Специальные методы, управляющие жизненным циклом объекта: конструкторы, деструкторы. * Перегрузка операторов (всех, кроме <code>is, '.', '='</code> и символьных логических). * Свойства (имитация поля с помощью функций). * Управление доступом к полям (эмуляция полей и методов, частичный доступ, и т. п.). * Методы для управления наиболее распространёнными операциями (истинностное значение, <code>len()</code>, глубокое копирование, [[сериализация]], итерация по объекту, …). * Полная [[Интроспекция (программирование)|интроспекция]]. * Классовые и статические методы, классовые поля. * Классы, вложенные в функции и классы. * Возможность модифицировать объекты во время исполнения программы. === [[Обобщённое программирование]] === Языки с поддержкой динамической типизации и объектно-ориентированного программирования обычно не рассматриваются в рамках обобщённого программирования, поскольку задачи обобщённого программирования решаются за счёт отсутствия ограничений на типы данных<ref name=":8">{{Статья|ссылка=https://link.springer.com/chapter/10.1007/978-3-642-45404-2_5|автор=Alexandre Bergel, Lorenzo Bettini|заглавие=Generic Programming in Pharo|год=2013|ответственный=José Cordeiro, Slimane Hammoudi, Marten van Sinderen|язык=en|место=Berlin, Heidelberg|издание=Software and Data Technologies|издательство=Springer|страницы=66–79|isbn=978-3-642-45404-2|doi=10.1007/978-3-642-45404-2_5|archiveurl=https://web.archive.org/web/20210213175706/https://link.springer.com/chapter/10.1007/978-3-642-45404-2_5|archivedate=2021-02-13|access-date=2021-02-13|deadlink=no}}</ref><ref name=":9">{{Статья|ссылка=https://arxiv.org/pdf/2011.02626v1.pdf|автор=R. Peschke, K. Nishimura, G. Varner|заглавие=ARGG-HDL: A High Level Python BasedObject-Oriented HDL Framework|год=2020|язык=en|издание=IEEE Transactions on Nuclear Science|тип=pre-print|месяц=10|arxiv=011.02626v1|access-date=2021-02-13|archive-date=2020-11-07|archive-url=https://web.archive.org/web/20201107012516/https://arxiv.org/pdf/2011.02626v1.pdf|deadlink=no|archivedate=2020-11-07|archiveurl=https://web.archive.org/web/20201107012516/https://arxiv.org/pdf/2011.02626v1.pdf}}</ref>. В Python обобщённое программирование со строгой типизацией достигается использованием средств языка совместно со внешними анализаторами кода<ref>{{Cite web|lang=en|url=https://www.python.org/dev/peps/pep-0484/|title=PEP 484 -- Type Hints|website=Python.org|date=2014-09-24|archiveurl=https://web.archive.org/web/20210209180311/https://www.python.org/dev/peps/pep-0484/|archivedate=2021-02-09|accessdate=2021-02-13|url-status=live}}</ref>, такими как Mypy<ref>{{Cite web|lang=en|url=https://mypy.readthedocs.io/en/stable/generics.html|title=Generics|author=Jukka Lehtosalo|website=Mypy 0.800 documentation|date=2016|publisher=Read the Docs|archiveurl=https://web.archive.org/web/20210213135624/https://mypy.readthedocs.io/en/stable/generics.html|archivedate=2021-02-13|accessdate=2021-02-13|url-status=live}}</ref>. === [[Функциональное программирование]] === Несмотря на то, что Python изначально не задумывался как язык функционального программирования{{sfn|Рамальо|2016|pp=188—191}}, он поддерживает функциональный стиль программирования, в частности<ref name=":4">{{Книга|автор=David Mertz|заглавие=Functional Programming in Python|год=2015|издательство=O'Reilly|isbn=978-1491928561|язык=en}}</ref>: * функция является объектом первого класса, * функции высших порядков, * рекурсия, * фокус на работу со [[Список (информатика)|списками]], * аналог [[Замыкание (программирование)|замыканий]], * частичное применение функции с помощью метода <code>partial()</code>, * возможность реализации других средств на самом языке (например, [[карринг]]). Однако, в отличие от большинства языков, непосредственно ориентированных на функциональное программирование, Python не является [[Чистота языка программирования|чистым языком программирования]] и код не защищён от [[Побочный эффект (программирование)|побочных эффектов]]<ref name=":4" />{{sfn|Рамальо|2016|p=273}}. В стандартной библиотеке Python существуют специальные пакеты <code>operator</code> и <code>functools</code> для функционального программирования{{sfn|Рамальо|2016|pp=188—191}}. === [[Метапрограммирование]] === {{В планах|дата=2023-02-08}} Python поддерживает [[метапрограммирование]]{{Sfn|Рамальо|2016|pp=613—708}}<ref name=":12" />. === [[Асинхронное программирование]] === {{Заготовка раздела|Асинхронное программирование на Python}} Python, начиная с 3.5, стал поддерживать асинхронное программирование. Появились операторы <code>async</code> и <code>await</code>, а также библиотека <code>asyncio</code><ref name=":23" /><syntaxhighlight lang="python3"> import asyncio async def main(): print('Hello ...') await asyncio.sleep(1) print('... World!') asyncio.run(main()) </syntaxhighlight><code>async</code> является атрибутом, который создает [[Асинхронное программирование|асинхронную]] функцию<ref name=":23" /> <code>await</code> позволяет выполнять асинхронные генераторы<ref name=":23" /> == Возможности == === [[Модуль (программирование)|Модули]] и пакеты === Программное обеспечение (приложение или библиотека) на Python оформляется в виде модулей, которые в свою очередь могут быть собраны в ''пакеты''. Модули могут располагаться как в [[Каталог (файловая система)|каталогах]], так и в [[ZIP|ZIP-архивах]]. Модули могут быть двух типов по своему происхождению: модули, написанные на «чистом» Python, и модули расширения (extension modules), написанные на других языках программирования. Например, в стандартной библиотеке есть «чистый» модуль pickle и его аналог на Си: cPickle. Модуль оформляется в виде отдельного файла, а пакет — в виде отдельного каталога. Подключение модуля к программе осуществляется оператором <code>import</code>. После импорта модуль представлен отдельным объектом, дающим доступ к пространству имён модуля. В ходе выполнения программы модуль можно перезагрузить функцией <code>reload()</code>. === [[Интроспекция (программирование)|Интроспекция]] === Python поддерживает полную [[Интроспекция (программирование)|интроспекцию]] времени исполнения<ref>{{статья| автор= Патрик О'Брайен| заглавие= Руководство по интроспекции на Python| оригинал= | ссылка= http://www.citforum.ru/programming/python/introspec.shtml| язык= | ответственный= [http://www.iso.ru/ Intersoft Lab]| archivedate= 2021-07-21| archiveurl= https://web.archive.org/web/20210721011912/http://citforum.ru/programming/python/introspec.shtml}}</ref>. Это означает, что для любого объекта можно получить всю информацию о его внутренней структуре. Применение интроспекции является важной частью того, что называют [[Pythonic style]], и широко применяется в библиотеках и [[фреймворк]]ах Python, таких как [[PyRO]], [[PLY]], [[Cherry]], [[Django]] и др., значительно экономя время использующего их программиста. Необходимые для интроспекции данные хранятся в специальных атрибутах. Так, например, получить все пользовательские атрибуты большинства объектов можно из специального атрибута — словаря (или другого объекта, предоставляющего интерфейс <code>dict</code>) <code>__dict__</code> <source lang="python"> >>> class x(object):pass .... >>> f = x() >>> f.attr = 12 >>> print(f.__dict__) {'attr': 12} >>> print(x.__dict__) # т.к. классы тоже являются экземплярами объекта type # то и они поддерживают этот тип интроспекции {'__dict__': <attribute '__dict__' of 'x' objects>, '__module__'....... </source> Есть также другие атрибуты, имена и назначение которых зависят от объекта: <source lang="python"> >>> def f():pass .... >>> f.func_code.co_code # получение байтокода функции 'd\x00\x00S' >>> f.__class__ # специальный атрибут - ссылка на класс данного объекта <type 'function'> </source> Подавляющее большинство атрибутов, поддерживающих интроспекцию, является классовым, и их, в свою очередь, можно получить из <code>obj.__class__.__dict__</code>. Часть информации, унаследованную от базового класса, все объекты используют совместно, что позволяет экономить память. Для удобства получения интроспективной информации в Python есть модуль <code>inspect</code>{{sfn|Beazley|2009|pp=222—225}}. <source lang="python"> >>> def f(x,y = 10,**mp):pass ... >>> inspect.getargspec(f) (['x', 'y'], None, 'mp', (10,)) </source> С помощью модуля <code>new</code> возможен обратный процесс — построения объекта из составных частей на этапе исполнения <source lang="python"> >>> def f(i): return j + i .... >>> j = 2 >>> f(1) 3 >>> import new >>> g = new.function(f.func_code, {'j': 23}) >>> g(1) 24 </source> === [[Обработка исключений]] === Обработка исключений поддерживается в Python посредством операторов <code>try, except, else, finally, raise</code>, образующих блок обработки исключения. В общем случае блок выглядит следующим образом: <source lang="python"> try: # Здесь код, который может вызвать исключение raise Exception("message") # Exception, это один из стандартных типов исключения (всего лишь класс), # может использоваться любой другой, в том числе свой except (Тип исключения1, Тип исключения2, …) as Переменная: # Код в блоке выполняется, если тип исключения совпадает с одним из типов # (Тип исключения1, Тип исключения2, …) или является наследником одного # из этих типов. # Полученное исключение доступно в необязательной Переменной. except (Тип исключения3, Тип исключения4, …) as Переменная: # Количество блоков except не ограничено raise # Сгенерировать исключение "поверх" полученного; без параметров - повторно сгенерировать полученное except: # Будет выполнено при любом исключении, не обработанном типизированными блоками except else: # Код блока выполняется, если не было поймано исключений. finally: # Будет исполнено в любом случае, возможно после соответствующего # блока except или else </source> Совместное использование <code>else, except</code> и <code>finally</code> стало возможно только начиная с Python 2.5. Информация о текущем исключении всегда доступна через <code>sys.exc_info()</code>. Кроме значения исключения, Python также сохраняет состояние стека вплоть до точки возбуждения исключения — так называемый traceback. В отличие от компилируемых языков программирования, в Python использование исключения не приводит к значительным накладным расходам (а зачастую даже позволяет ускорить исполнение программ) и очень широко используется. Исключения согласуются с философией Python (10-й пункт «[[#Философия|дзена Python]]» — «Ошибки никогда не должны умалчиваться») и являются одним из средств поддержки «[[Утиная типизация|утиной типизации]]». Иногда вместо явной обработки исключений удобнее использовать блок [[Python#Управление контекстом выполнения|<code>with</code>]] (доступен, начиная с Python 2.5). === [[Итератор]]ы === В программах на Python широко используются итераторы. Цикл <code>for</code> может работать как с последовательностью, так и с итератором. Большинство коллекций предоставляют итераторы, итераторы могут также определяться пользователем для собственных объектов. Модуль <code>itertools</code> стандартной библиотеки содержит средства работы с итераторами. === [[Генератор (программирование)|Генераторы]] === Одной из интересных возможностей языка являются '''генераторы''' — функции, сохраняющие внутреннее состояние: значения локальных переменных и текущую инструкцию (см. также: [[сопрограмма|сопрограммы]]). Генераторы могут использоваться как [[Итератор (программирование)|итераторы]] для структур данных и для [[ленивые вычисления|ленивых вычислений]]. При вызове генератора функция немедленно возвращает объект-итератор, который хранит текущую точку исполнения и состояние локальных переменных функции. При запросе следующего значения (посредством метода <code>next()</code>, неявно вызываемого в цикле <code>for</code>) генератор продолжает исполнение функции от предыдущей точки остановки до следующего оператора <code>yield</code> или <code>return</code>. В Python 2.4 появились '''генераторные выражения''' — выражения, дающие в результате генератор. Генераторные выражения позволяют сэкономить память там, где иначе требовалось бы использовать список с промежуточными результатами: <source lang="python"> >>> sum(i for i in range(1, 100) if i % 2 != 0) 2500 </source> В этом примере суммируются все нечётные числа от 1 до 99. Начиная с версии 2.5, Python поддерживает полноценные сопроцедуры: теперь в генератор можно передавать значения с помощью метода <code>send()</code> и возбуждать в его контексте исключения с помощью метода <code>throw()</code>. Также Python поддерживает вложенные генераторы. Например, для создания двумерного массива нужно разместить генератор списка, являющегося строкой, внутри генератора всех строк: <code>[[0 for j in range(m)] for i in range(n)]</code> === Управление контекстом выполнения === В Python 2.5 появились средства для управления контекстом выполнения блока кода — оператор <code>with</code> и модуль <code>contextlib</code>. См.: [[v:Практика по языку Python/Примеры программ на языке Python#Управление контекстом выполнения|пример]]. Оператор может применяться в тех случаях, когда до и после некоторых действий должны обязательно выполняться некоторые другие действия, независимо от возбуждённых в блоке исключений или операторов <code>return</code>: файлы должны быть закрыты, ресурсы освобождены, перенаправление стандартного ввода вывода закончено и т. п. Оператор улучшает читаемость кода, а значит, помогает предотвращать ошибки. === Декораторы === {{не путать|Декоратор (шаблон проектирования)|одноимённым шаблоном проектирования}} {{В планах|дата=2023-02-08}} Декораторы функций — вызываемые объекты, которые принимают другую функцию в качестве аргумента. Декораторы функций могут производить операции с функцией и возвращают либо саму функцию, либо другую заменяющую её функцию или вызываемый объект. То есть, если в коде ранее был прописан декоратор, названный decorate, то следующий код{{sfn|Рамальо|2016|pp=214—246}}: : <syntaxhighlight lang="python"> @decorate def target(): print('running target()') </syntaxhighlight> эквивалентен этому{{sfn|Рамальо|2016|pp=214—246}}: : <syntaxhighlight lang="python"> def target(): print('running target()') target = decorate(target) </syntaxhighlight> Это позволяет сократить использование кода. Пример использования декоратора функции{{sfn|Рамальо|2016|pp=214—246}}: : <syntaxhighlight lang="pycon"> >>> def deco(func): ... def inner(): ... print('running inner()') ... return inner … >>> @deco ... def target(): ... print('running target()') >>> target() running inner() >>> target <function deco.<locals>.inner at 0.10063b598> </syntaxhighlight> Существуют декораторы классов{{sfn|Рамальо|2016|pp=686—688}}. === [[Регулярные выражения]] === Формат регулярных выражений унаследован из [[Perl]] с некоторыми отличиями. Для их использования требуется импортировать модуль <code>re</code><ref>{{Cite web |url=https://docs.python.org/3/library/re.html |title=6.2. re — Regular expression operations — Python 3.5.1 documentation |access-date=2016-05-11 |archive-date=2018-07-18 |archive-url=https://web.archive.org/web/20180718132241/https://docs.python.org/3/library/re.html |url-status=live }}</ref>, являющийся частью стандартной библиотеки. == Стандартная библиотека == [[Файл:Python batteries included.jpg|thumb| Python поставляется «[[Стандартная библиотека Python|с батарейками в комплекте]]». Такую метафору использовали разработчики, чтобы подчеркнуть богатую стандартную библиотеку языка<ref>{{Cite news|title=PEP 206 -- Python Advanced Library|author=A.M. Kuchling|url=https://www.python.org/dev/peps/pep-0206/|website=Python.org|date=14.07.2000|accessdate=2021-04-04|archivedate=2021-05-05|archiveurl=https://web.archive.org/web/20210505003659/https://www.python.org/dev/peps/pep-0206/}}</ref>]] Богатая стандартная [[Библиотека (программирование)|библиотека]] является одной из привлекательных сторон Python. Здесь имеются средства для работы со многими [[Протокол передачи данных|сетевыми протоколами]] и форматами [[Интернет]]а, например, модули для написания [[Веб-сервер|HTTP-серверов]] и клиентов, для разбора и создания почтовых сообщений, для работы с [[XML]] и т. п. Набор модулей для работы с [[операционная система|операционной системой]] позволяет писать кросс-платформенные приложения. Существуют модули для работы с [[регулярное выражение|регулярными выражениями]], текстовыми [[кодировка]]ми, [[мультимедиа|мультимедийными]] форматами, [[криптография|криптографическими]] протоколами, архивами, [[Сериализация|сериализации]] данных, поддержка [[Юнит-тестирование|юнит-тестирования]] и др.<ref>{{Cite web|url=https://docs.python.org/3/library/index.html|title=The Python Standard Library|website=Python documentation|access-date=2023-10-09|archive-date=2023-06-06|archive-url=https://web.archive.org/web/20230606041152/https://docs.python.org/3/library/index.html|url-status=live}}</ref> Если модулей стандартной библиотеки не хватает, то есть возможность использовать другие каналы получения библиотек. Одним из каналов распространения и обновления пакетов для Python является [[PyPI]] ({{lang-en|Python Package Index}})<ref>{{Cite web|url=https://pypi.org/|title=PyPI · Индекс пакета Python|lang=ru|website=PyPI|access-date=2023-10-09|archive-date=2017-06-03|archive-url=https://web.archive.org/web/20170603211126/https://pypi.org/|url-status=live}}</ref>. == Сторонние библиотеки == {{Основная статья|Сторонние библиотеки Python}} Здесь перечислены самые популярные библиотеки Python: * Искусственный интеллект - [[TensorFlow]] * Работа с базами данных - [[Сторонние библиотеки Python#Сторонние библиотеки Python|Библиотеки для работы с базами данных]] * Математические вычисления - [[NumPy]] * Веб-вычисления - [[Django]] * Создание игр - [[Pygame]] == Примеры программ == В статье «[[v:Практика по языку Python/Примеры программ на языке Python|Примеры программ на языке Python]]» [[Викиверситет]]а собраны примеры небольших программ, демонстрирующих некоторые возможности языка Python и его стандартной библиотеки. Программа «[[Hello, world!|Hello World!]]» может быть написана одной строкой:<syntaxhighlight lang="python3"> print("Hello World!") </syntaxhighlight> Вычисление [[факториал]]а числа 10 (10!): <syntaxhighlight lang="python3"> def factorial(n): if n < 0: raise ArithmeticError('Факториал отрицательного числа.') f = 1 for i in range (2, n + 1): f *= i return f print(factorial(10)) # 3628800 </syntaxhighlight> Реализация с помощью [[рекурсия|рекурсии]]: <syntaxhighlight lang="python3"> def factorial(n): if n < 0: raise ArithmeticError('Факториал отрицательного числа.') if n == 0 or n == 1: return 1 else: return factorial(n - 1) * n print(factorial(10)) </syntaxhighlight> == Профилирование и оптимизация кода == В стандартной библиотеке Python имеется [[Профилирование (информатика)|профайлер]] (модуль <code>profile</code>), который можно использовать для сбора статистики о времени работы отдельных функций. Для решения вопроса о том, какой вариант кода работает быстрее, можно использовать модуль <code>timeit</code>. Производимые в следующей программе измерения позволяют выяснить, какой из вариантов [[Конкатенация|конкатенации]] строк более эффективен<ref name=":22">{{Cite web|url=https://wiki.python.org/moin/PythonSpeed/PerformanceTips|title=PythonSpeed/PerformanceTips - Python Wiki|website=wiki.python.org|access-date=2023-10-09|archive-date=2023-10-18|archive-url=https://web.archive.org/web/20231018232415/https://wiki.python.org/moin/PythonSpeed/PerformanceTips|url-status=live}}</ref>: <syntaxhighlight lang="python"> from timeit import Timer tmp = "Python 3.2.2 (default, Jun 12 2011, 15:08:59) [MSC v.1500 32 bit (Intel)] on win32." def case1(): # А. инкрементальные конкатенации в цикле s = "" for i in range(10000): s += tmp def case2(): # Б. через промежуточный список и метод join s = [] for i in range(10000): s.append(tmp) s = "".join(s) def case3(): # В. списковое выражение и метод join return "".join([tmp for i in range(10000)]) def case4(): # Г. генераторное выражение и метод join return "".join(tmp for i in range(10000)) for v in range(1,5): print (Timer("func()","from __main__ import case%s as func" % v).timeit(200)) </syntaxhighlight> Как и в любом языке программирования, в Python имеются свои приёмы [[оптимизация (информатика)|оптимизации]] кода. Оптимизировать код можно исходя из различных (часто конкурирующих друг с другом) критериев (увеличение быстродействия, уменьшение объёма требуемой оперативной памяти, компактность исходного кода и т. д.). Чаще всего программы оптимизируют по времени исполнения. Здесь есть несколько очевидных для опытных программистов правил<ref name=":22" />. * Не нужно оптимизировать программу, если скорость её выполнения достаточна. * Используемый алгоритм имеет определённую [[Временная сложность алгоритма|временную сложность]], поэтому перед оптимизацией кода программы стоит сначала пересмотреть алгоритм. * Стоит использовать готовые и отлаженные функции и модули, даже если для этого нужно немного обработать данные. Например, в Python есть встроенная функция <code>sorted()</code>. * [[Профилирование (информатика)|Профилирование]] поможет выяснить узкие места. Оптимизацию нужно начинать с них. Python имеет следующие особенности и связанные с ними правила оптимизации<ref name=":22" />. * Вызов функций является достаточно дорогостоящей операцией, поэтому внутри вложенных циклов нужно стараться избегать вызова функций или, например, переносить цикл в функции. Функция, обрабатывающая последовательность, эффективнее, чем обработка той же последовательности в цикле вызовом функции. * Старайтесь вынести из глубоко вложенного цикла всё, что можно вычислить во внешних циклах. Доступ к локальным переменным более быстрый, чем к глобальным или чем доступ к полям. * Оптимизатор '''psyco''' может помочь ускорить работу модуля программы при условии, что модуль не использует динамических свойств языка Python. * В случае, если модуль проводит массированную обработку данных и оптимизация алгоритма и кода не помогает, можно переписать [[Критический участок кода|критические участки]], скажем, на языке Си или Pyrex. Инструмент под названием Pychecker<ref>{{Cite web |url=http://pychecker.sourceforge.net/ |title=PyChecker: a python source code checking tool |access-date=2007-02-03 |archive-date=2007-02-02 |archive-url=https://web.archive.org/web/20070202224013/http://pychecker.sourceforge.net/ |url-status=live }}</ref> поможет проанализировать исходный код на Python и выдать рекомендации по найденным проблемам (например, неиспользуемые имена, изменение сигнатуры метода при его перегрузке и т. п.). В ходе такого статического анализа исходного кода могут быть выявлены и ошибки. Pylint<ref>{{Cite web |url=http://www.logilab.org/view?rql=Any%20X%20WHERE%20X%20eid%20857 |title=pylint (analyzes Python source code looking for bugs and signs of poor quality.) (Logilab.org) |access-date=2007-02-03 |archive-date=2007-02-12 |archive-url=https://web.archive.org/web/20070212050018/http://www.logilab.org/view%3Frql%3DAny%2520X%2520WHERE%2520X%2520eid%2520857 |url-status=live }}</ref> призван решать близкие задачи, но имеет уклон в сторону проверки стиля кода, поиска [[код с запашком|кода с запашком]]<ref>{{Cite web|url=https://pylint.readthedocs.io/en/stable/|title=Pylint 3.0.1 documentation|website=pylint.readthedocs.io|access-date=2023-10-09|archive-date=2023-10-18|archive-url=https://web.archive.org/web/20231018232406/https://pylint.readthedocs.io/en/stable/|url-status=live}}</ref>. == Сравнение с другими языками == Выбор языка обычно зависит от решаемых задач, особенностей языков и наличия библиотек, требуемых для решения задачи. Одна и та же задача, написанная на разных языках, может сильно разниться по эффективности исполнения, в том числе различия могут быть и при исполнении в разных операционных системах или при использовании разных компиляторов. В общем случае языки можно поделить на интерпретируемые (скриптовые), компилируемые в промежуточное представление и компилируемые, что влияет на производительность и потребление памяти. Python принято относить к интерпретируемым. Также отдельные языки могут иметь свои сильные стороны, в случае Python выделяется лёгкость в написании программ<ref name=":17" />. === [[C++]] и [[Java]] === Python сравнивается с C++/Java с точки зрения лаконичности, простоты и гибкости Python<ref name=":11" />. Можно сравнить «[[Hello, world]]»-программы, записанные на каждом из языков<ref name=":11" />. {| class="wikitable" |+ Сравнение программ «Hello, world!» |- ! C++<ref name=":11" /> !! Java<ref name=":11" /> !! Python<ref name=":11" /> |- | <source lang="C++"> #include <iostream> int main() { std::cout << "Hello, world!" << std::endl; return 0; } </source> || <source lang="Java"> public class HelloClass { public static void main(String[] args) { System.out.println("Hello, world!"); } } </source> || <source lang="Python"> print("Hello, world!") </source> |} Касательно ООП, в Python, в отличие от C++ и Java, отсутствуют модификаторы доступа к полям и методам класса, атрибуты и поля у объектов могут создаваться на лету в ходе исполнения программы, а все методы являются виртуальными. По сравнению с Java Python позволяет также перегружать операторы, что даёт возможность использовать выражения близкие к естественным<ref name=":11" />. В совокупности подход к ООП в Python упрощает программирование, делает код более понятным и одновременно добавляет гибкости языку<ref name=":11" />. С другой стороны, скорость выполнения кода на Python (как и других интерпретируемых языков) значительно ниже, чем скорость выполнения аналогичного кода на C++<ref>{{Статья|ссылка=https://arxiv.org/pdf/2001.02491.pdf|автор=Pascal Fua, Krzysztof Lis|заглавие=Comparing Python, Go, and C++ on the N-Queens Problem|год=2020|издание=Computer Vision Laboratory, EPFL|access-date=2021-03-02|archive-date=2020-03-12|archive-url=https://web.archive.org/web/20200312235010/https://arxiv.org/pdf/2001.02491.pdf|deadlink=no|archivedate=2020-03-12|archiveurl=https://web.archive.org/web/20200312235010/https://arxiv.org/pdf/2001.02491.pdf}}</ref> и обычно ожидается ниже, чем в Java<ref>{{Cite web|lang=en|url=https://www.python.org/doc/essays/comparisons/|title=Comparing Python to Other Languages|author=Guido van Rossum|website=Python.org|date=1997|archive-url=https://web.archive.org/web/20210316045507/https://www.python.org/doc/essays/comparisons/|archive-date=2021-03-16|access-date=2021-03-16|url-status=live}}</ref>. Код на C++ получается производительнее Python, при этом занимает больше строк. Согласно исследованиям алгоритмов, применяемых в [[Биоинформатика|биоинформатике]], Python показал себя более гибким чем C++, а Java оказалась компромиссным решением между производительностью C++ и гибкостью Python<ref name=":17">{{Статья|ссылка=https://doi.org/10.1186/1471-2105-9-82|автор=Mathieu Fourment, Michael R. Gillings|заглавие=A comparison of common programming languages used in bioinformatics|год=2008|язык=en|издание=BMC Bioinformatics|месяц=02|число=05|том=9|выпуск=1|страницы=82|issn=1471-2105|doi=10.1186/1471-2105-9-82|archiveurl=https://web.archive.org/web/20210319180836/https://bmcbioinformatics.biomedcentral.com/articles/10.1186/1471-2105-9-82|archivedate=2021-03-19|access-date=2021-03-19|deadlink=no}}</ref>. В Java и Python все объекты создаются в [[Куча (память)|куче]], в то время как C++ позволяет создавать объекты как в куче, так и на [[Стек вызовов|стеке]], в зависимости от используемого синтаксиса<ref>{{Статья|ссылка=https://www.ncbi.nlm.nih.gov/pmc/articles/PMC3933420/|автор=Muhammad Shoaib Farooq, Sher Afzal Khan, Farooq Ahmad, Saeed Islam, Adnan Abid|заглавие=An Evaluation Framework and Comparative Analysis of the Widely Used First Programming Languages|год=2014|язык=en|издание=PLoS ONE|месяц=02|число=24|том=9|выпуск=2|issn=1932-6203|doi=10.1371/journal.pone.0088941|pmid=24586449|archiveurl=https://web.archive.org/web/20210315195631/https://www.ncbi.nlm.nih.gov/pmc/articles/PMC3933420/|archivedate=2021-03-15|access-date=2021-03-15|deadlink=no}}</ref>. На производительность также влияет способ доступа к данным в памяти. В C++ и Java доступ к данным происходит по постоянным смещениям в памяти, в то время как в Python — через [[Хеш-таблица|хеш-таблицы]]. Использование [[Указатель (тип данных)|указателей]] в C++ может быть довольно сложным для понимания среди новичков, и овладение навыками правильного использования указателей может занять некоторое время<ref name=":17" />. === [[Go]] === {{Дополнить}} Go и Python — кардинально различающиеся языки, тем не менее, они часто сравниваются один с другим из-за общей ниши — бэкэнда веб-приложений. По выражению Джейсона Кинкэйда, Go объединяет «производительность и безопасность компилируемых языков, таких как C++, со скоростью разработки на динамических языках, таких как Python»<ref name="AutoNT-94">{{cite news |url=https://techcrunch.com/2009/11/10/google-go-language/ |title=Google's Go: A New Programming Language That's Python Meets C++ |last=Kincaid |first=Jason |date=10 November 2009 |work=TechCrunch |access-date=2010-01-29 |accessdate=2021-02-16 |archivedate=2010-01-18 |archiveurl=https://web.archive.org/web/20100118014358/http://www.techcrunch.com/2009/11/10/google-go-language/ }}</ref>. В какой-то мере это действительно так: Go изначально разработан как строго статически типизированный компилируемый язык, поддерживающий максимум возможностей динамических языков, при котором ещё можно обеспечить эффективную компиляцию и сохранить производительность компилируемых программ. Общими для обоих языков является использование автоматического управления памятью, наличие встроенных динамических коллекций (массивов и словарей), поддержка срезов, развитый механизм модулей, простой и минималистичный синтаксис. Различий гораздо больше, и не всегда можно однозначно указать, в пользу какого из языков они говорят. ; Динамические возможности. : Если Python является полностью динамическим языком и практически любые элементы программы могут меняться во время исполнения, включая конструирование «на лету» новых типов и модификацию существующих, то Go — статический язык с достаточно ограниченными возможностями рефлексии, работающей только в отношении созданных при разработке типов данных. В некоторой мере заменой динамических возможностей в Go является кодогенерация, обеспечиваемая простотой синтаксиса и наличием необходимых инструментов и системных библиотек. Также в Go 1.18 добавили поддержку средств обобщённого программирования (generics)<ref>{{Cite web|lang=en|url=https://go.dev/doc/go1.18|title=Go 1.18 Release Notes - The Go Programming Language|website=go.dev|access-date=2023-05-27|archive-date=2023-05-27|archive-url=https://web.archive.org/web/20230527171309/https://go.dev/doc/go1.18|url-status=live}}</ref>. === [[Perl]] === Оба языка являются интерпретируемыми, компилируются в промежуточное представление, которое затем отправляется на исполнение. В случае Python генерируется промежуточный байт-код, а компилятор Perl генерирует синтаксическое дерево. Управление памятью в обоих языках автоматическое, а сами языки используются как скриптовые и хорошо подходят для написания веб-приложений. Подход в написания кода Python предполагает лучшее понимание [[Исходный код|листинга программы]] в ущерб производительности, тогда как в Perl больше свободы в синтаксисе, что может привести к тому что программы на Perl становятся нечитабельны для программистов, не работающих с данным языком<ref name=":17" />. === [[MATLAB]] и [[R (язык программирования)|R]] === {{В планах|дата=2023-02-08}}Python, MATLAB и R используются в обработке данных и в обучении студентов основам математики и статистики. R является языком для выполнения статистических расчётов, в то время как MATLAB может считаться языком программирования наряду с Python<ref>{{Статья|ссылка=http://www.jds-online.com/files/150%E5%AE%8C%E6%88%90V.pdf|автор=Ceyhun Ozgur, Taylor Colliau, Grace Rogers, Zachariah Hughes, Elyse “Bennie” Myer-Tyson|заглавие=MatLab vs. Python vs. R|год=2017|язык=en|издание=Journal of Data Science|том=15|страницы=355—372|issn=1680-743X|archiveurl=https://web.archive.org/web/20210411143915/http://www.jds-online.com/files/150%E5%AE%8C%E6%88%90V.pdf|archivedate=2021-04-11|access-date=2021-04-11|deadlink=no}}</ref>. === Языки, на которые повлиял Python === Python, как весьма популярный язык программирования, повлиял на следующие языки: * [[CoffeeScript]] имеет синтаксис, вдохновлённый Python<ref>{{Книга|ссылка=https://archive.org/details/littlebookoncoff0000macc|автор=Alex MacCaw|заглавие=The Little Book on CoffeeScript|ответственный=|год=2012|место=|издательство=O'Reilly|страницы=|страниц=|isbn=9781449321055}}</ref>. * [[ECMAScript]]/[[JavaScript]] заимствовал итераторы и генераторы из Python<ref name="AutoNT-93">{{cite web |url=http://wiki.ecmascript.org/doku.php?id=proposals:iterators_and_generators |archive-url=https://web.archive.org/web/20071020082650/http://wiki.ecmascript.org/doku.php?id=proposals:iterators_and_generators |url-status=dead|archive-date=2007-10-20 |title=Proposals: iterators and generators [ES4 Wiki&#93; |publisher=wiki.ecmascript.org |access-date=2008-11-24 }}</ref>. * [[Go]], при сильнейших идеологических различиях, заимствовал у динамических языков, таких как Python, встроенные словари, динамические массивы, срезы. * [[Groovy]] был создан с мотивацией привнести философию Python на [[Java]]<ref name="AutoNT-95">{{cite web |last=Strachan |first=James |date=2003-08-29 |title=Groovy&nbsp;– the birth of a new dynamic language for the Java platform |url=http://radio.weblogs.com/0112098/2003/08/29.html |access-date=2007-06-11 |archive-url=https://web.archive.org/web/20070405085722/http://radio.weblogs.com/0112098/2003/08/29.html |archive-date=2007-04-05 |url-status=dead}}</ref>. * [[Julia (язык программирования)|Julia]] была задумана как «такая же пригодная для общего программирования, как и Python»<ref name="Julia">{{cite web| title= Why We Created Julia| date= 2012-02| website= Julia website| url= https://julialang.org/blog/2012/02/why-we-created-julia| access-date= 2014-06-05| quote= We want something as usable for general programming as Python [...]| archive-date= 2020-05-02| archive-url= https://web.archive.org/web/20200502144010/https://julialang.org/blog/2012/02/why-we-created-julia/| url-status= live}}</ref>. * [[Nim]] использует систему отступов и аналогичный синтаксис<ref>{{cite web |url=https://www.infoworld.com/article/3157745/application-development/nim-language-draws-from-best-of-python-rust-go-and-lisp.html |title=Nim language draws from best of Python, Rust, Go, and Lisp |first=Serdar |last=Yegulalp |date=2017-01-16 |website=InfoWorld |quote=Nim's syntax is strongly reminiscent of Python's, as it uses indented code blocks and some of the same syntax (such as the way if/elif/then/else blocks are constructed). |access-date=2021-02-16 |archive-date=2018-10-13 |archive-url=https://web.archive.org/web/20181013211847/https://www.infoworld.com/article/3157745/application-development/nim-language-draws-from-best-of-python-rust-go-and-lisp.html |url-status=live }}</ref>. * [[Ruby]] — [[Юкихиро Мацумото]], создатель языка, сказал: «Я хотел скриптовый язык, который был бы более мощным, чем Perl, и более объектно-ориентированным, чем Python. Вот почему я решил создать свой собственный язык»<ref name="linuxdevcenter">{{cite web |url=http://www.linuxdevcenter.com/pub/a/linux/2001/11/29/ruby.html |title=An Interview with the Creator of Ruby |publisher=Linuxdevcenter.com |access-date=2012-12-03 |archive-date=2018-04-28 |archive-url=https://web.archive.org/web/20180428150410/http://www.linuxdevcenter.com/pub/a/linux/2001/11/29/ruby.html |url-status=live }}</ref>. * [[Swift (язык программирования)|Swift]] во время разработки брал идеи структуры языка из Python, а также из [[Objective-C]], [[Rust (язык программирования)|Rust]], [[Haskell]], [[Ruby]], [[C Sharp|C#]], [[CLU]]<ref>{{cite web |url=http://nondot.org/sabre |title=Chris Lattner's Homepage |publisher=Chris Lattner |first=Chris |last=Lattner |author-link=Chris Lattner |date=2014-06-03 |access-date=2014-06-03 |quote=I started work on the Swift Programming Language in July of 2010. I implemented much of the basic language structure, with only a few people knowing of its existence. A few other (amazing) people started contributing in earnest late in 2011, and it became a major focus for the Apple Developer Tools group in July 2013 [...] drawing ideas from Objective-C, Rust, Haskell, Ruby, Python, C#, CLU, and far too many others to list. |archive-date=2015-12-22 |archive-url=https://web.archive.org/web/20151222150510/http://nondot.org/sabre/ |url-status=live }}</ref>. == Критика == === Низкое быстродействие === Классический Python имеет общий со многими другими [[Интерпретируемый язык программирования|интерпретируемыми языками]] недостаток — сравнительно невысокую скорость выполнения программ<ref name="alioth-benchmark">{{cite web|url=http://shootout.alioth.debian.org/u32/benchmark.php?test=all&lang=python&lang2=gpp&box=1|title=Python / C++ GNU g++|work=Computer Language Benchmarks Game|accessdate=2009-07-01|archiveurl=https://www.webcitation.org/5w4n30Deb?url=http://shootout.alioth.debian.org/u32/benchmark.php?test=all|archivedate=2011-01-28}}</ref>. В некоторой степени ситуацию улучшает кеширование [[байт-код]]а (расширения <code>.pyc</code> и, до версии 3.5, <code>.pyo</code>), которое позволяет интерпретатору не тратить время на синтаксический разбор текста модулей при каждом запуске. Существуют реализации языка Python, вводящие высокопроизводительные [[Виртуальная машина|виртуальные машины]] в качестве бэкенда компилятора. Примерами таких реализаций может служить [[PyPy]], базирующийся на RPython, более ранней инициативой является проект [[Parrot]]. Ожидается, что использование виртуальной машины типа [[LLVM]] приведёт к тем же результатам, что и использование аналогичных подходов для реализаций языка Java, где низкая вычислительная производительность в основном преодолена<ref>{{Cite web|lang=en |url=https://arstechnica.com/open-source/news/2009/03/google-launches-project-to-boost-python-performance-by-5x.ars |title=Ars Technica report on Unladen Swallow goals |access-date=2017-10-29 |archive-date=2012-05-01 |archive-url=https://web.archive.org/web/20120501010841/http://arstechnica.com/open-source/news/2009/03/google-launches-project-to-boost-python-performance-by-5x.ars |url-status=live }}</ref>. Однако нельзя забывать, что динамический характер Python делает неизбежными дополнительные накладные расходы при исполнении программ, что ограничивает производительность Python-систем независимо от применяемых технологий. Вследствие этого для написания критических участков кода используются низкоуровневые языки, интеграция с которыми обеспечивается множеством программ и библиотек. Тем не менее, Python портирован на некоторые относительно малопроизводительные платформы<ref>{{Cite web|url=http://micropython.org/|title=MicroPython - Python for microcontrollers|lang=en|website=micropython.org|access-date=2023-10-09|archive-date=2014-06-06|archive-url=https://web.archive.org/web/20140606021306/http://micropython.org/|url-status=live}}</ref>. === Глобальная блокировка интерпретатора (GIL) === [[Файл:GIL description.gif|thumb|250px|Схематичное изображение работы потоков под GIL. Зелёный — поток, удерживающий GIL, красные — блокированные потоки]] {{main|Global Interpreter Lock}} Интерпретатор Python в [[CPython]] (а также [[Stackless Python|Stackless]] и [[PyPy]]{{Sfn|Яворски, Зиаде|2021|p=466}}) использует потоко-небезопасные данные, во избежание разрушения которых при совместной модификации из разных потоков применяется глобальная блокировка интерпретатора — GIL (Global Interpreter Lock){{sfn|Palach|2014|pp=16—17}}: в ходе исполнения кода поток интерпретатора блокирует GIL, выполняет в течение фиксированного времени (по умолчанию 5 миллисекунд{{ref+|Значение в секундах можно получить с помощью команды sys.getswitchinterval()<ref>{{Cite web|url=https://docs.python.org/3/library/sys.html#sys.getswitchinterval|title=sys#sys.getswitchinterval()|website=Документация Python|access-date=2021-10-25|archive-date=2021-10-25|archive-url=https://web.archive.org/web/20211025160501/https://docs.python.org/3/library/sys.html#sys.getswitchinterval|url-status=live}}</ref> и изменить во время работы программы с помощью sys.setswitchinterval()<ref>{{Cite web|url=https://docs.python.org/3/library/sys.html#sys.setswitchinterval|title=sys#sys.setswitchinterval()|website=Документация Python|access-date=2021-10-25|archive-date=2021-10-25|archive-url=https://web.archive.org/web/20211025160501/https://docs.python.org/3/library/sys.html#sys.setswitchinterval|url-status=live}}</ref>|К}}) некоторое количество инструкций, после чего освобождает блокировку и приостанавливается, давая возможность работать другим потокам. GIL также освобождается во время ввода-вывода, изменения и проверки состояния синхронизирующих примитивов, при исполнении кода расширений, не обращающихся к данным интерпретатора, например, [[NumPy]]/[[SciPy]]. Таким образом, в каждый момент времени в одном процессе интерпретатора Python может исполняться только один поток кода на Python, независимо от числа доступных процессорных ядер. Потери производительности от GIL зависят от характера программ и архитектуры системы. Большинство программ является однопоточными, либо запускает всего несколько потоков, из которых часть в каждый конкретный момент простаивает в ожидании. Персональные компьютеры обычно имеют небольшое количество процессорных ядер, которые загружены параллельно исполняющимися в системе процессами, так что реальные потери производительности на персональных компьютерах из-за GIL невелики. Но в серверных приложениях может быть удобно использовать десятки и сотни (а то и больше) параллельных потоков (например, в системах массового обслуживания, где каждый поток обрабатывает данные для отдельного пользовательского запроса), а серверы на конец 2010-х годов нередко имеют десятки и даже сотни процессорных ядер, то есть технически могут обеспечить этим потокам физически одновременное исполнение; в таких условиях GIL может приводить к действительно значительному снижению общей производительности, так как лишает программу возможности полноценно использовать ресурсы многоядерных систем. Гвидо ван Россум говорил, что GIL «не так уж и плох» и он будет в CPython до тех пор, пока «кто-то другой» не представит реализацию Python без GIL, с которой бы однопоточные скрипты работали так же быстро<ref>{{cite web | url=http://mail.python.org/pipermail/python-3000/2007-May/007414.html | author=[[Guido van Rossum]] | title=the future of the GIL | publisher=[http://mail.python.org Python Mailing Lists] | date=2007-05-08 | access-date=2021-03-03 | archive-date=2020-11-09 | archive-url=https://web.archive.org/web/20201109025224/https://mail.python.org/pipermail/python-3000/2007-May/007414.html | url-status=live }}</ref><ref>{{cite web | url=http://www.artima.com/weblogs/viewpost.jsp?thread=214235 | author=Guido van Rossum | title=It isn't Easy to Remove the GIL | publisher=[http://www.artima.com artima.com] | date=2007-09-10 | access-date=2021-03-03 | archive-date=2019-06-06 | archive-url=https://web.archive.org/web/20190606085140/https://www.artima.com/weblogs/viewpost.jsp?thread=214235 | url-status=live }}</ref>. В задачи разработки входит работа по оптимизации GIL<ref>{{Cite web |url=http://mail.python.org/pipermail/python-dev/2009-October/093321.html |title=Python-Dev&#93; Reworking the GIL |access-date=2010-12-07 |archive-date=2011-06-10 |archive-url=https://web.archive.org/web/20110610164607/http://mail.python.org/pipermail/python-dev/2009-October/093321.html |url-status=live }}</ref>. Планируется отказ от GIL, есть черновой вариант PEP 703<ref name="автоссылка1">{{Cite web |url=https://peps.python.org/pep-0703 |title=PEP 703 – Making the Global Interpreter Lock Optional in CPython {{!}} peps.python.org<!-- Заголовок добавлен ботом --> |access-date=2023-10-08 |archive-date=2023-10-13 |archive-url=https://web.archive.org/web/20231013135852/https://peps.python.org/pep-0703/ |url-status=live }}</ref>, но на данный момент есть следующие варианты избавления от GIL: * Вариант интерпретатора с синхронизацией доступа к отдельным объектам вместо глобальной блокировки<ref>{{Cite web |url=http://www.artima.com/weblogs/viewpost.jsp?thread=211200 |title=Python 3000 FAQ |access-date=2007-08-08 |archive-date=2020-11-09 |archive-url=https://web.archive.org/web/20201109015427/https://www.artima.com/weblogs/viewpost.jsp?thread=211200 |url-status=live }}</ref> из-за частых захватов/освобождений блокировок оказался слишком медленным. * Реализация потоков через процессы ОС, например, модуль multiprocessing<ref>{{Cite web|url=https://docs.python.org/3/library/multiprocessing.html|title=multiprocessing — Process-based parallelism|website=Python documentation|access-date=2023-10-09|archive-date=2023-10-09|archive-url=https://web.archive.org/web/20231009230311/https://docs.python.org/3/library/multiprocessing.html|url-status=live}}</ref>. * Отказ от совместного использования изменяемых данных и вызовов внешнего кода. При этом данные дублируются в потоках и их синхронизация (если таковая нужна) лежит на программисте<ref>{{Cite web |url=http://perldoc.perl.org/perlthrtut.html |title=perlthrtut — perldoc.perl.org |access-date=2008-04-10 |archive-date=2008-05-22 |archive-url=https://web.archive.org/web/20080522092213/http://perldoc.perl.org/perlthrtut.html |url-status=live }}</ref>. * Библиотеки, обеспечивающие собственную организацию поддержки потоков. * Есть черновой PEP по отказу от GIL в CPython<ref name="автоссылка1" /> Радикальным вариантом решения проблемы может быть переход на [[Jython]] и [[IronPython]], работающие на виртуальных машинах Java и .NET/Mono: эти реализации вообще не используют GIL. === Синтаксис и семантика === Несмотря на то, что одним из заявленных принципов дизайна Python является [[Правило наименьшего удивления|принцип наименьшего удивления]], критики отмечают целый ряд архитектурных решений, которые могут вводить в заблуждение или вызывать недоумение у программистов, привыкших к другим распространённым языкам<ref name="pitfalls">{{cite web |title = zephyrfalcon.org :: labs :: 10 Python pitfalls |url = http://zephyrfalcon.org/labs/python_pitfalls.html |archive-url = https://web.archive.org/web/20130810230937/http://zephyrfalcon.org/labs/python_pitfalls.html |archive-date = 2013-08-10 |url-status = dead }}</ref>. В их числе: * Отличие в принципе работы оператора присвоения по сравнению со статически-типизированными языками. В Python при присвоении значения копируется ссылка на объект, а не значение. При работе с простыми неизменяемыми типами возникает ощущение изменения значения переменной при присваивании ей значения, однако фактически присваивается ссылка на другое значение, например, при увеличении значения переменной типа <code>int</code> на 1 меняется ссылка, а не увеличивается значение по ссылке. Однако при работе с изменяемыми типами их содержимое можно менять по ссылке, поэтому при присвоении одной переменной ссылки на другую и последующем изменении значения в одной из двух переменных оно изменится в обеих переменных, что хорошо заметно при работе со списками<ref name="pitfalls" /><ref>{{Книга|ссылка=https://books.google.ru/books?id=FOVBDAAAQBAJ&pg=SA3-PA35|автор=Reeta Sahoo, Gagan Sahoo|заглавие=Computer Science with Python|год=2016|место=New Delhi|издательство=New Saraswati House India Pvt Ltd|страницы=3.35—3.36|страниц=458|isbn=978-93-5199-980-5|access-date=2021-01-16|archive-date=2021-01-22|archive-url=https://web.archive.org/web/20210122000110/https://books.google.ru/books?id=FOVBDAAAQBAJ&pg=SA3-PA35|deadlink=no}}</ref>. При этом кортежи хоть и являются неизменяемыми, но могут хранить ссылки на изменяемые объекты, поэтому по факту кортежи тоже можно менять<ref>{{Cite web|lang=en|url=http://radar.oreilly.com/2014/10/python-tuples-immutable-but-potentially-changing.html|title=Python tuples: immutable but potentially changing - O'Reilly Radar|author=Luciano Ramalho|website=radar.oreilly.com|date=2014-10-15|publisher=O'Reilly|archiveurl=https://web.archive.org/web/20210116094945/http://radar.oreilly.com/2014/10/python-tuples-immutable-but-potentially-changing.html|archivedate=2021-01-16|accessdate=2021-01-16|url-status=live}}</ref>; * Отличие в поведении на некоторых типах «сокращённых» операторов, таких как <code>+=</code> и их развёрнутой записи, хотя в большинстве языков «сокращённый» вариант — это просто краткая запись полного, и семантически они абсолютно эквивалентны. Пример с использованием <code>x +=</code>:<syntaxhighlight lang="python3" line="1"> >>> x = [1, 2] >>> y = x >>> x += [3, 4] >>> x [1, 2, 3, 4] >>> y [1, 2, 3, 4] </syntaxhighlight>Аналогичный пример с использованием <code>x = x +</code>:<syntaxhighlight lang="python3"> >>> x = [1, 2] >>> y = x >>> x = x + [3, 4] >>> x [1, 2, 3, 4] >>> y [1, 2] </syntaxhighlight> * Жёсткая трактовка лексической области видимости, подобная используемой в JavaScript: даже если переменная получает значение в последней строке функции, её областью видимости является вся функция. * Путаница между полями класса и полями объекта: текущее значение поля класса инициализирует одноимённое поле объекта, но не при создании объекта, а при первой записи значения в данное поле.<syntaxhighlight lang="python3"> class Colored: color = "red" obj1 = Colored() print(obj1.color) # выводится исходное значение поля КЛАССА Colored.color = "green" # изменение поля КЛАССА print(obj1.color) # выводится значение поля КЛАССА obj1.color = "blue" # изменяется поле ОБЪЕКТА и фиксируется его значение Colored.color = "yellow" # изменение поля КЛАССА, которое уже не отразится на объекте print(obj1.color) # выводится поле ОБЪЕКТА # Скрипт выведет: red green blue </syntaxhighlight> : В примере выше три раза выводится поле color объекта obj1 класса Colored. При этом пока не выполнена запись в это поле, выводится текущее значение ''поля класса'', и в третий раз — значение поля объекта. Такое сохранение связи между полем объекта и класса до первой перезаписи может стать причиной неожиданного эффекта: если в программе меняется значение поля класса, то все объекты, одноимённые поля которых ещё не перезаписаны, окажутся неявно изменены. * Интуитивно трудно предсказуемое поведение параметров со значением-объектом по умолчанию. Если в качестве инициализатора для параметра по умолчанию указать конструктор объекта, это приведёт к созданию статического объекта, ссылка на который и будет передаваться по умолчанию в каждый вызов<ref>{{Cite web|url=https://docs.python.org/3/reference/compound_stmts.html|title=8. Compound statements — Python 3.7.2 documentation|publisher=docs.python.org|accessdate=2019-02-05|archive-date=2019-11-27|archive-url=https://web.archive.org/web/20191127123528/https://docs.python.org/3/reference/compound_stmts.html|url-status=live}}</ref>. Это может повлечь трудно уловимые ошибки. === Невозможность модификации встроенных классов === {{Дополнить}} По сравнению с [[Ruby]] и некоторыми другими языками, в Python отсутствует возможность модифицировать встроенные классы<ref>{{Cite web|url=https://docs.python.org/3/library/stdtypes.html|title=Built-in Types|website=Python documentation|access-date=2023-10-09|archive-date=2020-06-14|archive-url=https://web.archive.org/web/20200614194325/https://docs.python.org/3/library/stdtypes.html|url-status=live}}</ref>, такие, как <code>int, str, float, list</code> и другие. == Реализации == === CPython === {{основная статья|CPython}} CPython является основной реализацией языка. Он написан на [[Си (язык программирования)|языке Си]] и является переносимым на разные платформы. В основе управления памятью лежит использование комбинации счётчиков ссылок и сборщика мусора, ответственного за поиск циклических захватов ссылок<ref name=":18" />. Хотя язык считается интерпретируемым, на самом деле он компилируется в промежуточный высокоуровневый байт-код<ref>{{Cite web|lang=ru|url=https://leanpub.com/insidethepythonvirtualmachine/read|title=Read Inside The Python Virtual Machine {{!}} Leanpub|author=Obi Ike-Nwosu|website=Inside The Python Virtual Machine|publisher=leanpub.com|archive-url=https://web.archive.org/web/20210129122502/https://leanpub.com/insidethepythonvirtualmachine/read|archive-date=2021-01-29|access-date=2021-03-23|url-status=live}}</ref><ref name=":19" />, который затем исполняется через стековую виртуальную машину<ref name=":18" />. Например, вызов функции <code>print()</code> может быть представлен в следующем виде<ref name=":19">Получено с помощью <code>dis.dis('print("Hello World!")')</code>.</ref>: <syntaxhighlight lang="asm"> 0 0 RESUME 0 1 2 PUSH_NULL 4 LOAD_NAME 0 (print) 6 LOAD_CONST 0 ('Hello World!') 8 PRECALL 1 12 CALL 1 22 RETURN_VALUE </syntaxhighlight> Имена в языке имеют позднее связывание, в результате чего можно писать обращения к переменным, методам и атрибутам, которых ещё нет, но они должны быть объявлены на момент исполнения кода, использующего их. Каждый объект в Python имеет словарь, представленный хеш-таблицей, через который происходит сопоставление названий атрибутов их значениям. Глобальные переменные также сопоставляются через словарь. Одно обращение к методу или атрибуту может сопровождаться поочерёдным поиском в нескольких словарях<ref name=":18" />. === PyPy === {{Основная статья|PyPy}} PyPy — реализация Python, написанная на [[RPython]] (подмножество Python, имеющее намного меньше динамических возможностей). Позволяет легко проверять новые возможности. В PyPy, кроме стандартного CPython, включены возможности [[Stackless Python|Stackless]], [[Psyco]], модификация [[Абстрактное синтаксическое дерево|AST]] «на лету» и многое другое. В проект интегрированы возможности анализа Python-кода и трансляция в другие языки и [[байт-код]]ы виртуальных машин ([[Си (язык программирования)|Си]], [[LLVM]], [[Javascript]], .NET с версии 0.9.9). Начиная с 0.9.0, возможна полностью автоматическая трансляция RPython в Си, в результате чего достигается скорость, приемлемая для использования (в 2—3 раза ниже, чем CPython при отключённом [[JIT]] для версии 0.9.9). По умолчанию PyPy поставляется со встроенным JIT-компилятором, с помощью которого он способен работать намного быстрее, чем CPython. === Jython === {{В планах|дата=2023-02-08}}{{Основная статья|Jython}} Jython — реализация Python, компилирующая код на Python в [[Байт-код Java|байт-код]] [[Java]], который может быть выполнен [[JVM]]. Также может использоваться для импорта [[Класс (программирование)|класса]], исходный код которого был написан на Java в качестве модуля для Python{{sfn|К. Рейт, Т. Шлюссер|2017|p=23}}. === Другие реализации === Существуют также другие реализации. * {{iw|Numba}} — Jit-компилятор на основе LLVM с поддержкой NumPy. * [[PyS60]]<ref name="PyS60" /> — реализация языка для [[смартфон]]ов фирмы [[Nokia]] на платформе [[Symbian S60|Series 60]]. Не поддерживается * [[IronPython]] — Python для [[.NET Framework]] и [[Mono]]. Компилирует Python программы в [[MSIL]], таким образом предоставляя полную интеграцию с .NET-системой<ref>{{Cite web |url=http://www.codeplex.com/Wiki/View.aspx?ProjectName=IronPython |title=IronPython |access-date=2007-07-24 |archive-date=2006-08-18 |archive-url=https://web.archive.org/web/20060818015745/http://www.codeplex.com/Wiki/View.aspx?ProjectName=IronPython |url-status=live }}</ref>. * [[Stackless Python|Stackless]] — также написанная на Си реализация Python. Это не полноценная реализация, а [[патч]]и к CPython. Предоставляет расширенные возможности многопоточного программирования и значительно большую глубину [[рекурсия|рекурсии]]. * [[Python for .NET]]<ref>{{Cite web |url=http://pythonnet.sourceforge.net/ |title=Python for .NET |access-date=2007-02-10 |archive-date=2007-02-16 |archive-url=https://web.archive.org/web/20070216184915/http://pythonnet.sourceforge.net/ |url-status=live }}</ref> — ещё одна реализация Python для .NET. В отличие от IronPython эта реализация не компилирует Python код в MSIL, а только предоставляет интерпретатор, написанный на [[C Sharp|C#]]. Позволяет использовать .NET-сборки из Python кода. * [[Jython]] — реализация Python, использующая [[JVM]] в качестве среды исполнения. Позволяет прозрачно использовать [[Java]]-библиотеки. * [[TinyPy]]<ref>{{Cite web |url=http://www.tinypy.org/ |title=tinypy |access-date=2008-08-21 |archive-date=2008-09-18 |archive-url=https://web.archive.org/web/20080918042926/http://www.tinypy.org/ |url-status=live }}</ref> — минималистическая версия Python. Часть возможностей CPython не реализована. * [[MicroPython]] — реализация Python 3 для встроенных систем с малым объёмом оперативной памяти<ref>{{Cite web |url=http://micropython.org/ |title=MicroPython |access-date=2014-06-04 |archive-date=2014-06-06 |archive-url=https://web.archive.org/web/20140606021306/http://micropython.org/ |url-status=live }}</ref>. * [[Brython]]<ref>{{Cite web|url = http://www.brython.info/|title = Сайт проекта Brython|author = |date = |publisher = |access-date = 2014-11-06|archive-date = 2014-10-20|archive-url = https://web.archive.org/web/20141020083048/http://www.brython.info/|url-status = live}}</ref> — реализация языка на клиентском JavaScript, позволяющая писать браузерные скрипты на Python 3. * [[QPython]]<ref>{{Cite web|url = http://qpython.com/|title = Сайт проекта QPython|access-date = 2015-02-03|archive-date = 2015-02-04|archive-url = https://web.archive.org/web/20150204000601/http://qpython.com/|url-status = live}}</ref> — реализация Python для Android. Проект всё ещё на стадии тестирования, однако на QPython уже портированы некоторые самые необходимые библиотеки. Позволяет и работать в интерактивном режиме. Существует также Qpython3. == Специализированные подмножества/расширения Python == На основе Python было создано несколько специализированных подмножеств языка, в основном предназначенных для статической компиляции в машинный код. Некоторые из них перечислены ниже. * [[RPython]]<ref>{{Cite web |url=http://codespeak.net/pypy/dist/pypy/doc/coding-guide.html |title=PyPy[coding-guide&#93; |accessdate=2007-07-24 |archiveurl=https://web.archive.org/web/20070707005837/http://codespeak.net/pypy/dist/pypy/doc/coding-guide.html#restricted-python |archivedate=2007-07-07 |url-status=dead }}</ref> — созданная в рамках проекта [[PyPy]] сильно ограниченная реализация Python без динамизма времени исполнения и некоторых других возможностей. Код на RPython можно компилировать во множество других языков/платформ — C, JavaScript, Lisp, .NET<ref>{{Cite web |url=http://codespeak.net/pypy/dist/pypy/doc/carbonpython.html |title=PyPy carbonpython |accessdate=2007-07-24 |archiveurl=https://web.archive.org/web/20070912131432/http://codespeak.net/pypy/dist/pypy/doc/carbonpython.html |archivedate=2007-09-12 |url-status=dead }}</ref>, [[LLVM]]. На RPython написан интерпретатор PyPy. * [[Cython]]<ref>{{Cite web |url=http://www.cython.org/ |title=Cython: C-Extensions for Python |access-date=2007-07-28 |archive-date=2007-08-11 |archive-url=https://web.archive.org/web/20070811093728/http://www.cython.org/ |url-status=live }}</ref> — ограниченная реализация Python, но несколько меньше, чем RPython. [[Cython]] расширен возможностями статической типизации типами из языка C и позволяет свободно смешивать типизированный и не типизированный код. Предназначен для написания модулей расширений, компилируется в код на языке C. * [[Nuitka]]<ref>{{Cite web|url=https://nuitka.net/|title=Nuitka the Python Compiler — Nuitka the Python Compiler documentation|website=nuitka.net|access-date=2023-10-09|archive-date=2022-09-03|archive-url=https://web.archive.org/web/20220903042758/https://nuitka.net/|url-status=live}}</ref> — Позволяет транслировать весь код Python в код [[Си (язык программирования)|Си]] или в исполняемые файлы. == Инструменты поддержки программирования == === Интерактивный режим === Подобно [[Лисп|Lisp]] и [[Пролог (язык программирования)|Prolog]], Python может использоваться в интерактивном режиме, при котором введённые с клавиатуры операторы сразу же выполняются, а результат выводится на экран ([[REPL]]). Этот режим удобен как при изучении языка, так и в процессе профессиональной разработки — для быстрого тестирования отдельных фрагментов кода, — так как обеспечивает немедленную обратную связь. Также он позволяет использовать интерпретатор в качестве [[калькулятор]]а с большим набором функций. * Эталонная реализация Python имеет встроенный интерактивный интерпретатор, работающий в режиме текстового терминала и позволяющий выполнять все основные операции. В интерактивном режиме доступен [[отладчик]] <code>pdb</code> и система помощи (вызывается по <code>help()</code>), работающая для всех модулей, классов и функций, которые содержат строки документации: : <source lang="python3"> >>> from math import * # импорт математических функций >>> help(cos) # помощь по функции cos Help on built-in function cos in module math: cos(x, /) Return the cosine of x (measured in radians). </source> * [[IPython]]<ref>{{Cite web |url=http://ipython.scipy.org/ |title=Архивированная копия |accessdate=2006-06-01 |archiveurl=https://web.archive.org/web/20180804135112/http://ipython.scipy.org/ |archivedate=2018-08-04 |url-status=dead }}</ref> — выходящая под [[лицензия BSD|BSD-лицензией]] кросс-платформенная интерактивная оболочка, предоставляющая расширенную интроспекцию и дополнительные команды. В частности, позволяет передавать исполняемому коду на Python результаты выполнения команд системной командной оболочки. Поддерживает подсветку кода и автоматическое дополнение. * [[BPython]]<ref>{{Cite web |url=http://www.bpython-interpreter.org/ |title=bpython interpreter |access-date=2011-02-17 |archive-date=2011-05-11 |archive-url=https://web.archive.org/web/20110511020421/http://bpython-interpreter.org/ |url-status=live }}</ref> — расширение стандартной командной оболочки Python с помощью ряда дополнительных модулей. Реализует подсветку синтаксиса, автоматическое дополнение кода с предложением вариантов, автоматическое выравнивание, интеграция с [[Pastebin]], сохранение ввода в файл, восстановление удалённой строки, предложение параметров для функций. Почти все IDE для Python поддерживают [[REPL]] для быстрого тестирования. === IDE === [[Файл:Python's IDLE.png|мини|[[IDLE]]]] Существует несколько специализированных [[Интегрированная среда разработки|IDE]] для разработки на Python. * [[Eric]] — полнофункциональный редактор Python и IDE, написанный на Python. Он базируется на кросс-платформенном фреймворке [[Qt]], в качестве компонента редактирования используется [[Scintilla|QScintilla]]. Eric предоставляет возможности ведения проектов, отладки, профилирования, рефакторинга кода, взаимодействия с популярными системами управления версиями, такими как [[Subversion]] и [[Git]]. Расширяется через механизм плагинов. Репозиторий плагинов доступен прямо из среды разработки. Распространяется бесплатно, [[GNU General Public License#GPL v3|лицензия GNU GPL v3]]. * [[PyCharm]] — полнофункциональная IDE для Python от [[JetBrains]], доступна на платформах Windows, macOS и Linux, существует в бесплатном (Community) и платном (Professional) вариантах. * {{Не переведено|Wing IDE|Wing IDE}} — линейка Python-IDE от американской фирмы [[Wingware]], включает три варианта: «Wing 101», «Wing Personal», «Wing Pro», из которых первые два бесплатны, последний — платный. Версия Pro обладает всеми необходимыми средствами для профессиональной разработки, включая поддержку проектов, работу с системами управления версиями, расширенные возможности навигации по коду и анализа кода, рефакторинг, поддержка использования [[Django]]. Бесплатные версии предоставляют меньше функций и не выходят за пределы возможностей, доступных в других бесплатных IDE для Python. * [[Spyder (IDE)|Spyder]] — open-source IDE для Python под [[лицензия MIT|лицензией MIT]], бесплатная, доступна на платформах Windows, Mac OS X и Linux. Особенностью является то, что IDE ориентирована на [[data science]], в ней удобно работать с библиотеками типа SciPy, NumPy, Matplotlib. Spyder поставляется в комплекте с менеджером пакетов [[Anaconda (инсталлятор)|Anaconda]]. В целом обладает качествами стандартной IDE, имеет редактор с подсветкой синтаксиса, автоматическое дополнение кода, обозреватель документации. * [[Thonny]] — многоплатформенная бесплатная IDE, выпускается под [[лицензия MIT|лицензией MIT]], поддерживается Институтом информатики [[Тартуский университет|Тартуского университета]] в [[Эстония|Эстонии]]. Позиционируется как «Python IDE для новичков», полностью, включая интерпретатор Python, ставится «из коробки» пользователем без административных прав, сразу после установки может использоваться без дополнительных настроек. Предназначена для обучения, имеет улучшенную визуализацию порядка вычисления выражений и вызова функций, динамическую подсветку синтаксических ошибок, простой менеджер пакетов. Для профессионального применения возможностей недостаточно, например, нет поддержки проектов и интеграции с [[Система управления версиями|системами управления версиями]]. * [[IDLE]]<ref>{{Cite web|url=https://docs.python.org/3/library/idle.html|title=IDLE|website=Python documentation|access-date=2023-10-09|archive-date=2020-06-04|archive-url=https://web.archive.org/web/20200604195234/https://docs.python.org/3/library/idle.html|url-status=live}}</ref> — Встроенный в Python IDE. Очень простой и малофункциональный. Помимо этого, существуют плагины для поддержки программирования на Python для универсальных IDE [[Eclipse (среда разработки)|Eclipse]]<ref>{{Cite web|url=https://marketplace.eclipse.org/content/pydev-python-ide-eclipse|title=PyDev - Python IDE for Eclipse|lang=en|website=Eclipse Plugins, Bundles and Products - Eclipse Marketplace|access-date=2023-10-09|archive-date=2023-10-18|archive-url=https://web.archive.org/web/20231018232415/https://marketplace.eclipse.org/content/pydev-python-ide-eclipse|url-status=live}}</ref>, [[KDevelop]]<ref>{{Cite web|url=https://apps.kde.org/kdev-python/|title=KDevelop Python Support|lang=en|website=KDE Applications|access-date=2023-10-09|archive-date=2023-10-04|archive-url=https://web.archive.org/web/20231004024833/https://apps.kde.org/kdev-python/|url-status=live}}</ref>, [[Visual Studio Code]]<ref>{{Cite web|url=https://code.visualstudio.com/docs/languages/python|title=Python in Visual Studio Code|lang=en|website=code.visualstudio.com|access-date=2023-10-09|archive-date=2023-10-18|archive-url=https://web.archive.org/web/20231018232410/https://code.visualstudio.com/docs/languages/python|url-status=live}}</ref> и [[Microsoft Visual Studio]]<ref>{{Cite web|url=https://visualstudio.microsoft.com/vs/features/python/|title=Visual Studio Python IDE - Python Development Tools for Windows|lang=en-US|website=Visual Studio|access-date=2023-10-09|archive-date=2023-10-02|archive-url=https://web.archive.org/web/20231002182149/https://visualstudio.microsoft.com/vs/features/python/|url-status=live}}</ref>, а также имеется поддержка подсветки синтаксиса, авто дополнения кода и подключения средств отладки и запуска приложений для целого ряда распространённых текстовых редакторов. == Применение == [[Файл:Python Powered.png|thumb|Python Powered]] Python — стабильный и распространённый язык. Он используется во многих проектах и в различных качествах: как основной язык программирования или для создания расширений и интеграции приложений. На Python реализовано большое количество проектов, также он активно используется для создания прототипов будущих программ. Python является лёгким в изучении языком, и часто изучается как первый язык<ref name=":2" />, в том числе используется при обучении детей программированию<ref>{{статья|автор=Васильев Денис Алексеевич|заглавие=Методические особенности изучения языка Python школьниками|издание=Символ науки|год=2017|ссылка=https://cyberleninka.ru/article/n/metodicheskie-osobennosti-izucheniya-yazyka-python-shkolnikami|номер=1|archivedate=2021-07-21|archiveurl=https://web.archive.org/web/20210721012157/https://cyberleninka.ru/article/n/metodicheskie-osobennosti-izucheniya-yazyka-python-shkolnikami}}</ref>. Как первый язык он хорошо подходит, поскольку программы на нём близки к естественному языку, на котором люди привыкли думать, а для написания корректной программы требуется минимальное количество ключевых слов. В других же языках, таких как [[C++]], существует большое количество различных синтаксических конструкций и элементов языка, которым приходится уделять внимание вместо изучения алгоритмов<ref name=":11">{{Статья|ссылка=https://iopscience.iop.org/article/10.1088/1742-6596/423/1/012027|автор=A Bogdanchikov, M Zhaparov, R Suliyev|заглавие=Python to learn programming|год=2013-04-10|язык=en|издание=Journal of Physics: Conference Series|месяц=04|число=10|том=423|страницы=012027|issn=1742-6588, 1742-6596|doi=10.1088/1742-6596/423/1/012027|access-date=2021-03-01|archive-date=2021-06-09|archive-url=https://web.archive.org/web/20210609072244/https://hkvalidate.perfdrive.com/?ssa=7e557f91-2a23-4954-9336-4d6aa8eff543&ssb=13723216276&ssc=https%3A%2F%2Fiopscience.iop.org%2Farticle%2F10.1088%2F1742-6596%2F423%2F1%2F012027&ssi=68a9da23-8427-477c-a539-9f5448a945ec&ssk=support@shieldsquare.com&ssm=42114570057895697108641720190350&ssn=b37115f7a9ef8f78371ddc2fc86e93ac7b7d49c27ea8-1bd1-433f-87f254&sso=a8f8ae2a-7b96902d3b52ffbb038f39585ed097cd097eb09d11627f2d&ssp=97250498481623231227162323594126397&ssq=71610532336343094416123363660343109120417&ssr=MjA3LjI0MS4yMjUuMTU4&sst=Mozilla/5.0%20(Windows%20NT%2010.0;%20Win64;%20x64)%20AppleWebKit/537.36%20(KHTML,%20like%20Gecko)%20Chrome/74.0.3729.169%20Safari/537.36&ssv=&ssw=|deadlink=no|archiveurl=https://web.archive.org/web/20210609072244/https://hkvalidate.perfdrive.com/?ssa=7e557f91-2a23-4954-9336-4d6aa8eff543&ssb=13723216276&ssc=https%3A%2F%2Fiopscience.iop.org%2Farticle%2F10.1088%2F1742-6596%2F423%2F1%2F012027&ssi=68a9da23-8427-477c-a539-9f5448a945ec&ssk=support%40shieldsquare.com&ssm=42114570057895697108641720190350&ssn=b37115f7a9ef8f78371ddc2fc86e93ac7b7d49c27ea8-1bd1-433f-87f254&sso=a8f8ae2a-7b96902d3b52ffbb038f39585ed097cd097eb09d11627f2d&ssp=97250498481623231227162323594126397&ssq=71610532336343094416123363660343109120417&ssr=MjA3LjI0MS4yMjUuMTU4&sst=Mozilla%2F5.0%20%28Windows%20NT%2010.0%3B%20Win64%3B%20x64%29%20AppleWebKit%2F537.36%20%28KHTML%2C%20like%20Gecko%29%20Chrome%2F74.0.3729.169%20Safari%2F537.36&ssv=&ssw=}}</ref>. Являясь приложением с открытым исходным кодом, интерпретатор Python используется по всему миру и поставляется в составе операционных систем на базе Linux, а также в компьютерах от фирмы [[Apple]]. Python популярен среди индивидуальных разработчиков, но также используется крупными компаниями в достаточно серьёзных продуктах, ориентированных на получение прибыли<ref name=":0" />. На Python написан [[Reddit]]<ref name=":7" /> и Youtube<ref>{{Cite web|url=https://python.plainenglish.io/a-jr-programmer-asked-me-why-google-and-youtube-use-python-f472baf1bab2|title=A Jr Programmer Asked Me Why Google and YouTube Use Python|lang=en|first=Josef|last=Cruz|website=Medium|date=2022-06-07|access-date=2023-10-09|archive-date=2022-06-11|archive-url=https://web.archive.org/web/20220611083439/https://python.plainenglish.io/a-jr-programmer-asked-me-why-google-and-youtube-use-python-f472baf1bab2|url-status=live}}</ref>. В [[Dropbox]]<ref>{{Cite web|url=https://blog.dropbox.com/topics/company/thank-you--guido|title=Thank you, Guido|lang=en|website=blog.dropbox.com|access-date=2023-10-09|archive-date=2021-02-16|archive-url=https://web.archive.org/web/20210216114908/https://blog.dropbox.com/topics/company/thank-you--guido|url-status=live}}</ref> также активно применяется Python, а из-за сложностей динамической типизации и огромного количества кода компания перешла к статической типизации с помощью открытого проекта Mypy<ref>{{Cite web|lang=en|url=https://dropbox.tech/application/our-journey-to-type-checking-4-million-lines-of-python|title=Our journey to type checking 4 million lines of Python|author=Jukka Lehtosalo|website=dropbox.tech|date=2019-09-05|publisher=Dropbox|archiveurl=https://web.archive.org/web/20200922204821/https://dropbox.tech/application/our-journey-to-type-checking-4-million-lines-of-python|archivedate=2020-09-22|accessdate=2020-09-22|url-status=live}}</ref> Также Python активно используется в [[Facebook]]<ref>{{Cite web |url=https://code.facebook.com/posts/1040181199381023/python-in-production-engineering/ |title=Python in production engineering |access-date=2017-01-21 |archive-date=2017-02-02 |archive-url=https://web.archive.org/web/20170202121734/https://code.facebook.com/posts/1040181199381023/python-in-production-engineering/ |url-status=live }}</ref> и [[Instagram]]<ref>{{Cite web |url=https://engineering.instagram.com/what-powers-instagram-hundreds-of-instances-dozens-of-technologies-adf2e22da2ad |title=What Powers Instagram: Hundreds of Instances, Dozens of Technologies |access-date=2017-01-21 |archive-date=2021-06-09 |archive-url=https://web.archive.org/web/20210609072246/https://instagram-engineering.com/what-powers-instagram-hundreds-of-instances-dozens-of-technologies-adf2e22da2ad?gi=7a31ad142d3 |url-status=live }}</ref>. Многие компании используют Python для тестирования аппаратного обеспечения, среди этих компаний значатся [[Intel]], [[Cisco]], [[Hewlett-Packard]] и [[IBM]]. [[Industrial Light & Magic]] и [[Pixar]] используют его при создании анимационных фильмов<ref name=":0" />. Язык активно используется компанией [[Google (компания)|Google]] в её поисковой системе, а [[YouTube|Youtube]] в значительной степени написан с использованием Python<ref name=":0">{{Книга|ссылка=https://books.google.ru/books?id=1HxWGezDZcgC&pg=PA8|автор=Mark Lutz|заглавие=Learning Python: Powerful Object-Oriented Programming|год=2009-10-06|язык=en|издательство=O'Reilly Media, Inc.|страницы=7—8|страниц=1218|isbn=978-1-4493-7932-2|access-date=2020-09-21|archive-date=2021-04-10|archive-url=https://web.archive.org/web/20210410140715/https://books.google.ru/books?id=1HxWGezDZcgC&pg=PA8|deadlink=no}}</ref><ref>{{cite web |url = https://opensource.googleblog.com/2017/01/grumpy-go-running-python.html |title = Grumpy: Go running Python! |archive-url = https://web.archive.org/web/20170120051915/https://opensource.googleblog.com/2017/01/grumpy-go-running-python.html |archive-date = 2017-01-20 }} — статья в Google Open Source Blog</ref>. Кроме того, Google спонсирует разработку Python с 2010 года<ref name=":20">{{Cite news|title=Google recommits to the Python ecosystem|author=Christina Cardoza|url=https://sdtimes.com/softwaredev/google-recommits-to-the-python-ecosystem/|website=SD Times|date=12.02.2021|accessdate=2021-04-04|archivedate=2021-02-25|archiveurl=https://web.archive.org/web/20210225035350/https://sdtimes.com/softwaredev/google-recommits-to-the-python-ecosystem/}}</ref><ref>{{Cite news|title=Welcoming Google as a Visionary Sponsor of the PSF|url=https://pyfound.blogspot.com/2021/02/welcoming-google-as-visionary-sponsor.html|website=News from the Python Software Foundation|date=11.02.2021|accessdate=2021-04-04|archivedate=2021-04-09|archiveurl=https://web.archive.org/web/20210409073556/https://pyfound.blogspot.com/2021/02/welcoming-google-as-visionary-sponsor.html}}</ref>, и поддержку [[PyPI]], основной системы распространения пакетов для Python<ref name=":20" /><ref>{{Cite news|title=Google Cloud финансирует экосистему Python|url=https://www.osp.ru/articles/2021/0302/13055821|website=Издательство «Открытые системы»|date=02.03.2021|accessdate=2021-04-04|archivedate=2021-06-09|archiveurl=https://web.archive.org/web/20210609072356/https://www.osp.ru/articles/2021/0302/13055821}}</ref>. Сильными сторонами Python являются его модульность и возможность интегрироваться с другими языками программирования, в том числе в составе сложных комплексных приложений и систем<ref>{{Статья|ссылка=https://www.frontiersin.org/articles/10.3389/fninf.2015.00011/full|автор=Eilif Muller, James A. Bednar, Markus Diesmann, Marc-Oliver Gewaltig, Michael Hines|заглавие=Python in neuroscience|год=2015|язык=en|издание=Frontiers in Neuroinformatics|месяц=04|число=14|том=9|issn=1662-5196|doi=10.3389/fninf.2015.00011|archiveurl=https://web.archive.org/web/20201130064502/https://www.frontiersin.org/articles/10.3389/fninf.2015.00011/full|archivedate=2020-11-30|access-date=2021-03-01|deadlink=no}}</ref>. Сочетание простоты и лаконичности с большим количеством возможностей делает Python удобным в качестве [[Скриптовые языки|скриптового языка]]{{Нет АИ|30|03|2021}}. Многие проекты предоставляют прикладной интерфейс программирования на Python для написания скриптов, например, среды 3D-моделирования [[Autodesk Maya]]<ref name=":0" />, [[Blender]]<ref>{{Cite web|lang=en|url=https://docs.blender.org/manual/en/latest/advanced/scripting/introduction.html|title=Scripting & Extending Blender : Introduction|website=Blender Manual|publisher=Blender|archiveurl=https://web.archive.org/web/20200921203043/https://docs.blender.org/manual/en/latest/advanced/scripting/introduction.html|archivedate=2020-09-21|accessdate=2020-09-21|url-status=live}}</ref> и [[Houdini (графическая программа)|Houdini]]<ref>{{Cite web|lang=en|url=https://www.sidefx.com/docs/houdini/hom/index.html|title=Python Scripting|website=www.sidefx.com|accessdate=2020-09-27|archive-date=2020-09-29|archive-url=https://web.archive.org/web/20200929134233/https://www.sidefx.com/docs/houdini/hom/index.html|url-status=live}}</ref>, а также свободная геоинформационная система [[QGIS]]<ref>{{Cite web|lang=en|url=https://gis.ucar.edu/building-plugin-qgis|title=Building a plugin for QGIS|website=Geographic Informations Systems (GIS) Program|publisher=National Center for Atmospheric Research|archiveurl=https://web.archive.org/web/20200923160619/https://gis.ucar.edu/building-plugin-qgis|archivedate=2020-09-23|accessdate=2020-09-23|url-status=live}}</ref>. Некоторые проекты реализуют базовую часть на более производительных языках программирования, а для упрощения работы предоставляют полноценный интерфейс прикладного программирования на Python{{Нет АИ|30|03|2021}}. Так, движок свободного [[видеоредактор]]а [[OpenShot Video Editor|OpenShot]] реализован в виде библиотеки ''libopenshot'', написанной на C++ с использованием библиотек на Си, а все возможности полностью покрыты прикладным интерфейсом программирования Python<ref>{{Cite web|lang=en|url=https://www.kickstarter.com/projects/421164014/openshot-video-editor-for-windows-mac-and-linux|title=OpenShot Video Editor for Windows, Mac, and Linux|author=Jonathan Thomas|date=2020-03-04|publisher=[[Kickstarter]]|archiveurl=https://web.archive.org/web/20200923172045/https://www.kickstarter.com/projects/421164014/openshot-video-editor-for-windows-mac-and-linux/description|archivedate=2020-09-23|accessdate=2020-09-23|url-status=live}}</ref>{{Значимость факта?}}. [[Агентство национальной безопасности США]] использует Python для анализа данных, а [[NASA]] использует его при выполнении научных задач<ref name=":0" />. Из инструментов, используемых в NASA, можно отметить свободный графический симулятор сети {{Не переведено 5|GNS3|3=en|4=Graphical Network Simulator-3}}, который также хорошо зарекомендовал себя в корпоративной среде и используется в технологических компаниях, например, в [[Intel]]<ref>{{Cite web|lang=en-US|url=https://fedoramagazine.org/using-gns3-with-fedora/|title=Using GNS3 with Fedora|website=Fedora Magazine|date=2019-08-28|accessdate=2020-09-22|archive-date=2020-10-01|archive-url=https://web.archive.org/web/20201001161823/https://fedoramagazine.org/using-gns3-with-fedora/|url-status=live}}</ref>. На Python написана также свободная популярная программа нарезки 3D моделей для печати на 3D-принтерах [[Cura]]<ref>{{Cite web |url=https://github.com/Ultimaker/Cura |title=Ultimaker Cura GitHub |access-date=2020-09-19 |archive-date=2020-09-17 |archive-url=https://web.archive.org/web/20200917042356/https://github.com/Ultimaker/Cura |url-status=live }}</ref><ref>{{Cite web|lang=en|url=https://all3dp.com/1/best-3d-slicer-software-3d-printer/|title=2020 Best 3D Printer Slicer Software|author=natol Locker|website=All3DP|date=2020-01-02|publisher=|accessdate=2020-09-24|quote=The list is sorted by popularity (via Alexa rank)|archive-date=2020-08-13|archive-url=https://web.archive.org/web/20200813221813/https://all3dp.com/1/best-3d-slicer-software-3d-printer/|url-status=live}}</ref>. Python с пакетами [[NumPy]], [[SciPy]] и [[Matplotlib|MatPlotLib]] активно используется как универсальная среда для научных расчётов в качестве замены распространённым специализированным коммерческим пакетам, таким как [[Matlab]], предоставляя аналогичную функциональность и более низкий порог вхождения<ref>{{Статья|ссылка=https://www.frontiersin.org/articles/10.3389/neuro.11.005.2009/full|автор=Peter Jurica, Cees Van Leeuwen|заглавие=OMPC: an open-source MATLAB®-to-Python compiler|год=2009|язык=English|издание=Frontiers in Neuroinformatics|том=3|issn=1662-5196|doi=10.3389/neuro.11.005.2009|access-date=2020-09-29|archive-date=2020-11-29|archive-url=https://web.archive.org/web/20201129111400/https://www.frontiersin.org/articles/10.3389/neuro.11.005.2009/full|deadlink=no|archivedate=2020-11-29|archiveurl=https://web.archive.org/web/20201129111400/https://www.frontiersin.org/articles/10.3389/neuro.11.005.2009/full}}</ref>. По большей части на Python написана также графическая программа {{Нп3|Veusz|4=Veusz}}<ref>{{Cite web|lang=en|url=https://veusz.github.io/development/|title=Veusz Development|website=Veusz|publisher=Github Pages|archiveurl=https://web.archive.org/web/20201002203816/https://veusz.github.io/development/|archivedate=2020-10-02|accessdate=2020-10-02|url-status=live}}</ref>, позволяющая создавать качественные графики, готовые для размещения в научных публикациях<ref>{{публикация|1=книга|ссылка=https://www.oryxthejournal.org/writing-for-conservation-guide|автор=Fisher, M.|заглавие=Writing for Conservation|год=2019|часть=Plot with a purpose|ссылка часть=https://www.oryxthejournal.org/writing-for-conservation-guide/plot-with-a-purpose.html|язык=en|издательство=Fauna & Flora International, Cambridge|часть архив=https://web.archive.org/web/20201002201841/https://www.oryxthejournal.org/writing-for-conservation-guide/plot-with-a-purpose.html|часть архив дата=2020-10-02|архив дата=2020-11-01|архив=https://web.archive.org/web/20201101045131/https://www.oryxthejournal.org/writing-for-conservation-guide/}}</ref>{{Значимость факта?}}. Библиотека [[Astropy]] — популярный инструмент для астрономических расчётов<ref>{{публикация|статья|ссылка=https://iopscience.iop.org/article/10.3847/1538-3881/aabc4f/pdf|автор=The Astropy Collaboration, A. M. Price-Whelan, B. M. Sipőcz, H. M. Günther, P. L. Lim, S. M. Crawford, S. Conseil, D. L. Shupe, M. W. Craig, N. Dencheva|заглавие=The Astropy Project: Building an Open-science Project and Status of the v2.0 Core Package|год=2018|язык=en|издание=The Astronomical Journal|месяц=08|число=24|том=156|выпуск=3|страницы=123|issn=1538-3881|doi=10.3847/1538-3881/aabc4f|архив=https://web.archive.org/web/20201002210222/https://iopscience.iop.org/article/10.3847/1538-3881/aabc4f/pdf|архив дата=2020-10-03}}</ref>{{Значимость факта?}}. Также Python является лучшим языком программирования по использованию в ИИ сфере<ref>{{Cite web|url=https://djangostars.com/blog/why-python-is-good-for-artificial-intelligence-and-machine-learning/|title=8 Reasons Why Python is Good for Artificial Intelligence and Machine Learning|lang=en-US|first=Alexander|last=Ryabtsev|website=Software Development Blog & IT Tech Insights {{!}} Django Stars|date=2019-03-11|access-date=2023-10-09|archive-date=2023-10-18|archive-url=https://web.archive.org/web/20231018232408/https://djangostars.com/blog/why-python-is-good-for-artificial-intelligence-and-machine-learning/|url-status=live}}</ref> Также Python подходит для выполнения нестандартных или сложных задач в [[Автоматизация сборки|системах сборки]] проектов, что обусловлено отсутствием необходимости предварительной компиляции исходных файлов. В проекте [[Google C++ Testing Framework|Google Test]] он используется для генерации исходного кода [[mock-объект]]ов для классов языка [[C++]]<ref>{{Cite web|url=https://github.com/google/googletest/blob/b88511ef640c046ec9c7553b383a2aba64c80967/googlemock/scripts/generator/README|title=The Google Mock class generator README|author=|website=[[Google C++ Testing Framework|Google Test]]|date=|publisher=github.com|access-date=2019-02-03|archive-date=2021-06-09|archive-url=https://web.archive.org/web/20210609072349/https://github.com/google/googletest/blob/b88511ef640c046ec9c7553b383a2aba64c80967/googlemock/scripts/generator/README|url-status=live}}</ref>{{Значимость факта?}}. Интерпретатор Python может использоваться в качестве мощной командной оболочки и скриптового языка для написания командных файлов ОС. Лёгкость обращения из Python-скриптов к внешним программам и наличие библиотек, дающих доступ к управлению системой, делают Python удобным инструментом для системного администрирования<ref name="GiftJones">{{публикация|книга|автор=Noah Gift, Jeremy M. Jones|заглавие=Python for Unix and Linux System Administration|isbn=978-0-596-51582-9}}</ref>. Он широко используется для этой цели на платформе Linux: обычно Python поставляется с системой, во многих дистрибутивах инсталляторы и визуальный интерфейс системных утилит написаны именно на Python. Используется он и в администрировании других Unix-систем, в частности, в [[Solaris]] и [[macOS]]<ref name="GiftJones" />. [[Кроссплатформенность]] самого языка и библиотек делает его привлекательным для унифицированной автоматизации задач системного администрирования в гетерогенных средах, где совместно применяются компьютеры с операционными системами различных типов. Будучи языком общего назначения Python применим почти во всех сферах деятельности. Фактически Python используется практически любой солидной компанией тем или иным образом как для выполнения текущих задач, так и в тестировании, администрировании или в разработке программных продуктов<ref name=":0" />. == Примечания == === Комментарии === {{Примечания|group=К}} === Источники === {{примечания|2|refs= <ref name="foreword">{{cite web|url=https://www.python.org/doc/essays/foreword/|title=Foreword for «Programming Python» (1st ed.)|lang=en|accessdate=2021-03-07|url-status=live|archiveurl=https://web.archive.org/web/20210120125441/https://www.python.org/doc/essays/foreword/|archivedate=2021-01-20}}</ref> <ref name="PyS60">{{cite web |url = http://wiki.opensource.nokia.com/projects/PyS60 |title = Python for S60 — OpenSource |archive-url = https://web.archive.org/web/20090806081738/http://wiki.opensource.nokia.com/projects/PyS60 |archive-date = 2009-08-06 }}</ref> }} == Литература == {{викифицировать литературу}} * {{Публикация|Книга|заглавие=Python. К вершинам мастерства|ref=Рамальо|ссылка=https://books.google.ru/books?id=qVBjDwAAQBAJ|год=2016|автор=Лучано Рамальо|язык=ru|место=|издательство=ДМК Пресс|оригинал язык=en|издание=|оригинал=Fluent Python. O’Reilly, 2015}} * {{Публикация|книга|заглавие=Автостопом по Python|ref=К. Рейт, Т. Шлюссер|год=2017|автор=Кеннет Рейтц, Таня Шлюссер|язык=ru|ссылка=https://www.google.ru/books/edition/Автостопом_по_Python/ZfcxDwAAQBAJ|издательство=Издательский дом «Питер»|оригинал=The Hitchhiker`s Guide to Python|оригинал ссылка=https://www.google.ru/books/edition/The_Hitchhiker_s_Guide_to_Python/nHDtDAAAQBA|оригинал язык=en|isbn=9785496030236}} * {{книга|автор=David M. Beazley|заглавие=Python Essential Reference|издание=4th Edition|год=2009|издательство=Addison-Wesley Professional|страниц=717|isbn=978-0672329784|ref=Beazley}} * {{Книга|заглавие=Parallel Programming with Python|автор=Jan Palach|ссылка=https://books.google.ru/books?id=bE_lAwAAQBAJ|издательство=Packt Publishing Ltd|год=2014|ref=Palach}} * {{Публикация|книга|заглавие=Python. Лучшие практики и инструменты|ref=Яворски, Зиаде|год=2021|автор= Яворски Михал, Зиаде Тарек|язык=ru|ссылка=https://www.google.ru/books/edition/Python_Лучшие_практики_и/hHswEAAAQBAJ|издательство=Издательский дом «Питер»|оригинал=Expert Python Programming|оригинал ссылка=https://www.google.ru/books/edition/Expert_Python_Programming/2tAwEAAAQBAJ|оригинал язык=en}} * {{книга|автор = {{comment|Фёдоров, Д. Ю.|Фёдоров, Дмитрий Юрьевич}}|заглавие = Программирование на языке высокого уровня Python|ссылка = https://urait.ru/viewer/programmirovanie-na-yazyke-vysokogo-urovnya-python-492920#page/1|место = Москва|издательство = Издательство Юрайт|год = 2022|страниц = 210|серия = Высшее образование|isbn = 978-5-534-14638-7}} == Ссылки == {{Навигация | Тема = Python | Викиучебник = Python | Викитека = Категория:Python }} * [http://www.python.org/ Официальный сайт]{{ref-en}} {{Python}} {{Языки программирования}} {{ВС}} [[Категория:Python|*]] [[Категория:Статьи с примерами кода Python]] [[Категория:Языки с динамической типизацией]] [[Категория:Языки веб-программирования]] [[Категория:Высокоуровневые языки программирования]]'
Вики-текст новой страницы после правки (new_wikitext)
'СЕКС СЕКС СЕКС СИСЬКИ ПИСКИ ХУИСЬКИ...........'
Унифицированная разница изменений правки (edit_diff)
'@@ -1,833 +1,1 @@ -{{Другие значения}} -{{Карточка языка программирования -| испытал влияние = [[ABC (язык программирования)|ABC]],<ref name="faq-created">{{cite web |url=https://docs.python.org/faq/general.html#why-was-python-created-in-the-first-place |title=Why was Python created in the first place? |work=General Python FAQ |publisher=Python Software Foundation |access-date=2007-03-22 |archive-date=2012-10-24 |archive-url=https://web.archive.org/web/20121024164224/http://docs.python.org/faq/general.html#why-was-python-created-in-the-first-place |url-status=live }}</ref> [[Ада (язык программирования)|Ada]],<ref>{{cite web|lang=en | url=http://archive.adaic.com/standards/83lrm/html/lrm-11-03.html#11.3 | title=Ada 83 Reference Manual (raise statement) | access-date=2020-01-07 | archive-date=2019-10-22 | archive-url=https://web.archive.org/web/20191022155758/http://archive.adaic.com/standards/83lrm/html/lrm-11-03.html#11.3 | url-status=live }}</ref> [[Алгол 68]],<ref name="98-interview">{{cite web |url=http://www.amk.ca/python/writing/gvr-interview |title=Interview with Guido van Rossum (July 1998) |last=Kuchling |first=Andrew M. |work=amk.ca |date=2006-12-22 |access-date=2012-03-12 |url-status=dead |archive-url=https://web.archive.org/web/20070501105422/http://www.amk.ca/python/writing/gvr-interview |archive-date=2007-05-01}}</ref> [[APL (язык программирования)|APL]],<ref name="python.org">{{cite web|url=https://docs.python.org/3/library/itertools.html|title=itertools — Functions creating iterators for efficient looping — Python 3.7.1 documentation|website=docs.python.org|access-date=2016-11-22|archive-date=2020-06-14|archive-url=https://web.archive.org/web/20200614153629/https://docs.python.org/3/library/itertools.html|url-status=live}}</ref> [[Си (язык программирования)|C]],<ref name="AutoNT-1">{{ cite journal |last=van Rossum |first=Guido |year=1993 |title=An Introduction to Python for UNIX/C Programmers |journal=Proceedings of the NLUUG Najaarsconferentie (Dutch UNIX Users Group) |quote=even though the design of C is far from ideal, its influence on Python is considerable. |citeseerx=10.1.1.38.2023 }}</ref> [[C++]],<ref name="classmix">{{cite web |url=https://docs.python.org/tutorial/classes.html |title=Classes |work=The Python Tutorial |publisher=Python Software Foundation |access-date=2012-02-20 |quote=It is a mixture of the class mechanisms found in C++ and Modula-3 |archive-date=2012-10-23 |archive-url=https://web.archive.org/web/20121023030209/http://docs.python.org/tutorial/classes.html |url-status=live }}</ref> [[Клу]],<ref name="effbot-call-by-object">{{cite web |url=http://effbot.org/zone/call-by-object.htm |title=Call By Object |work=effbot.org |last=Lundh |first=Fredrik |quote=replace "CLU" with "Python", "record" with "instance", and "procedure" with "function or method", and you get a pretty accurate description of Python's object model. |access-date=2017-11-21 |archive-date=2019-11-23 |archive-url=https://web.archive.org/web/20191123043655/http://effbot.org/zone/call-by-object.htm |url-status=live }}</ref> [[Dylan (язык программирования)|Dylan]],<ref name="AutoNT-2">{{cite web |url=https://www.python.org/download/releases/2.3/mro/ |title=The Python 2.3 Method Resolution Order |last=Simionato |first=Michele |publisher=Python Software Foundation |quote=The C3 method itself has nothing to do with Python, since it was invented by people working on Dylan and it is described in a paper intended for lispers |access-date=2014-07-29 |archive-date=2020-08-20 |archive-url=https://web.archive.org/web/20200820231854/https://www.python.org/download/releases/2.3/mro/ |url-status=live }}</ref> [[Haskell]],<ref name="AutoNT-3">{{cite web |url=https://docs.python.org/howto/functional.html |title=Functional Programming HOWTO |last=Kuchling |first=A. M. |work=Python v2.7.2 documentation |publisher=Python Software Foundation |access-date=2012-02-09 |archive-date=2012-10-24 |archive-url=https://web.archive.org/web/20121024163217/http://docs.python.org/howto/functional.html |url-status=live }}</ref> [[Icon (язык программирования)|Icon]],<ref name="AutoNT-4">{{cite web |url=https://www.python.org/dev/peps/pep-0255/ |title=PEP 255&nbsp;– Simple Generators |first1=Neil |last1=Schemenauer |first2=Tim |last2=Peters |first3=Magnus Lie |last3=Hetland |date=2001-05-18 |work=Python Enhancement Proposals |publisher=Python Software Foundation |access-date=2012-02-09 |archive-date=2020-06-05 |archive-url=https://web.archive.org/web/20200605012926/https://www.python.org/dev/peps/pep-0255/ |url-status=live }}</ref> [[Java]],<ref name="AutoNT-5">{{cite web |url=https://www.python.org/dev/peps/pep-0318/ |title=PEP 318&nbsp;– Decorators for Functions and Methods |first1=Kevin D. |last1=Smith |first2=Jim J. |last2=Jewett |first3=Skip |last3=Montanaro |first4=Anthony |last4=Baxter |date=2004-09-02 |work=Python Enhancement Proposals |publisher=Python Software Foundation |access-date=2012-02-24 |archive-date=2020-06-03 |archive-url=https://web.archive.org/web/20200603133734/https://www.python.org/dev/peps/pep-0318/ |url-status=live }}</ref>[[Лисп]],<ref name="AutoNT-6">{{cite web |url=https://docs.python.org/3.2/tutorial/controlflow.html |title=More Control Flow Tools |work=Python 3 documentation |publisher=Python Software Foundation |access-date=2015-07-24 |archive-date=2016-06-04 |archive-url=https://web.archive.org/web/20160604080843/https://docs.python.org/3.2/tutorial/controlflow.html |url-status=live }}</ref> [[Модула-3]],<ref name="classmix" /> [[Perl]], [[Standard ML]]<ref name="python.org"/> -| повлиял на = [[Mojo (язык программирования)|Mojo]]<ref>{{Cite web |last=Krill |first=Paul |date=2023-05-04 |title=Mojo language marries Python and MLIR for AI development |url=https://www.infoworld.com/article/3695588/mojo-language-marries-python-and-mlir-for-ai-development.html |access-date=2023-05-05 |website=InfoWorld |language=en |archive-date=5 May 2023 |archive-url=https://web.archive.org/web/20230505064554/https://www.infoworld.com/article/3695588/mojo-language-marries-python-and-mlir-for-ai-development.html |url-status=live }}</ref> -}} - -'''Python''' (<small>[[МФА]]:</small> {{IPA|[ˈpʌɪθ(ə)n]}}; в русском языке встречаются названия '''пито́н'''<ref>{{Cite web |url=http://www.xakep.ru/magazine/xa/117/088/1.asp |title=Мария «Mifrill» Нефёдова, Создатели языков программирования: Они такие разные, но кодинг их объединяет, Хакер № 09/08 (117) |access-date=2012-12-01 |archive-date=2013-07-02 |archive-url=https://web.archive.org/web/20130702190922/http://www.xakep.ru/magazine/xa/117/088/1.asp |url-status=live }}</ref> или '''па́йтон'''<ref>{{книга|автор=Прохоренок Н., Дронов В.|часть=Введение|заглавие=Python 3. Самое необходимое, 2-е изд.|ссылка=https://books.google.ru/books?id=k_6MDwAAQBAJ&lpg=PA11&hl=ru&pg=PA11#v=onepage&q&f=false|издательство=БХВ-Петербург|год=2019|страницы=11|страниц=608|isbn=9785977539944|archivedate=2021-02-12|archiveurl=https://web.archive.org/web/20210212044851/https://books.google.ru/books?id=k_6MDwAAQBAJ&lpg=PA11&hl=ru&pg=PA11#v=onepage&q&f=false}}</ref>) — [[высокоуровневый язык программирования]] общего назначения с [[Динамическая типизация|динамической]] [[Строгая типизация|строгой]] типизацией и автоматическим управлением памятью<ref name=":2">{{Статья|ссылка=https://www.irjet.net/archives/V6/i2/IRJET-V6I2367.pdf|автор=Yogesh Rana|заглавие=Python: Simple though an Important Programming language|год=2019|язык=en|издание=International Research Journal of Engineering and Technology (IRJET)|месяц=02|число=02|том=06|выпуск=2|страницы=1856—1858|issn=2395-0056|archiveurl=https://web.archive.org/web/20210211163417/https://www.irjet.net/archives/V6/i2/IRJET-V6I2367.pdf|archivedate=2021-02-11|access-date=2021-02-11|deadlink=no}}</ref><ref>{{Cite web|lang=en|url=https://wiki.python.org/moin/Why%20is%20Python%20a%20dynamic%20language%20and%20also%20a%20strongly%20typed%20language|title=Why is Python a dynamic language and also a strongly typed language - Python Wiki|author=SkipMontanaro|website=wiki.python.org|date=2012-02-24|archive-url=https://web.archive.org/web/20210314173706/https://wiki.python.org/moin/Why%20is%20Python%20a%20dynamic%20language%20and%20also%20a%20strongly%20typed%20language|archive-date=2021-03-14|access-date=2021-03-14|url-status=live}}</ref>, ориентированный на повышение производительности разработчика, читаемости [[Исходный код|кода]] и его качества, а также на обеспечение переносимости написанных на нём программ<ref name=":1">{{Cite web|lang=en|url=https://www.oreilly.com/library/view/learning-python-3rd/9780596513986/ch01.html|title=A Python Q&A Session|author=Mark Lutz|website=Learning Python, 3rd Edition [Book]|date=2007|publisher=O'Reilly Media, Inc.|archiveurl=https://web.archive.org/web/20210208175236/https://www.oreilly.com/library/view/learning-python-3rd/9780596513986/ch01.html|archivedate=2021-02-08|accessdate=2021-02-11|url-status=live}}</ref>. Язык является полностью [[Объектно-ориентированный язык программирования|объектно-ориентированным]] в том плане, что всё является [[Объект (программирование)|объектами]]<ref name=":2" />. Необычной особенностью языка является выделение [[Блок кода|блоков кода]] отступами<ref>{{Cite web|lang=en|url=https://developers.google.com/edu/python/introduction?hl=ru|title=Python Introduction {{!}}|website=Python Education|date=2018-08-20|publisher=Google Developers|archiveurl=https://web.archive.org/web/20201204155936/https://developers.google.com/edu/python/introduction|archivedate=2020-12-04|accessdate=2021-02-21|url-status=live}}</ref>. [[Синтаксис (программирование)|Синтаксис]] ядра языка минималистичен, за счёт чего на практике редко возникает необходимость обращаться к документации<ref name=":1" />. Сам же язык известен как [[Интерпретируемый язык программирования|интерпретируемый]] и используется в том числе для написания [[скрипт]]ов<ref name=":2" />. Недостатками языка являются зачастую более низкая скорость работы и более высокое потребление памяти написанных на нём программ по сравнению с аналогичным кодом, написанным на [[Компилируемый язык программирования|компилируемых языках]], таких как [[Си (язык программирования)|C]] или [[C++]]<ref name=":2" /><ref name=":1" />. - -Python является [[Мультипарадигменный язык программирования|мультипарадигменным языком программирования]], поддерживающим [[Императивное программирование|императивное]], [[Процедурное программирование|процедурное]], [[Структурное программирование|структурное]], [[Объектно-ориентированное программирование|объектно-ориентированное]] программирование<ref name=":2" />, [[метапрограммирование]]<ref name=":12">{{cite web|author=Satwik Kansal|url=https://developer.ibm.com/technologies/analytics/tutorials/ba-metaprogramming-python/|title=Metaprogramming in Python|lang=en|website=[[IBM]]|date=2018-04-05|accessdate=2021-04-14|url-status=live|archiveurl=https://web.archive.org/web/20210227132455/https://developer.ibm.com/technologies/analytics/tutorials/ba-metaprogramming-python/|archivedate=2021-02-27}}</ref>, [[Функциональное программирование|функциональное]] программирование<ref name=":2" /> и [[асинхронное программирование]]<ref name=":23">{{Cite web|url=https://docs.python.org/3/library/asyncio.html|title=asyncio — Asynchronous I/O|website=Python documentation|access-date=2023-10-09|archive-date=2019-05-05|archive-url=https://web.archive.org/web/20190505024126/https://docs.python.org/3/library/asyncio.html|url-status=live}}</ref>. Задачи [[Обобщённое программирование|обобщённого программирования]] решаются за счёт динамической типизации<ref name=":8" /><ref name=":9" />. [[Аспектно-ориентированное программирование]] частично поддерживается через [[Декоратор (шаблон проектирования)|декораторы]]<ref name=":13">{{Cite web|lang=en|url=https://www.oreilly.com/library/view/mastering-object-oriented-python/9781789531367/8cc23b01-44dd-4d1c-8993-f11107febf72.xhtml|title=Aspect-oriented programming|author=Steven F. Lott|website=Mastering Object-Oriented Python - Second Edition|date=2019|publisher=Packt Publishing|archiveurl=https://web.archive.org/web/20210221190643/https://www.oreilly.com/library/view/mastering-object-oriented-python/9781789531367/8cc23b01-44dd-4d1c-8993-f11107febf72.xhtml|archivedate=2021-02-21|accessdate=2021-02-21|url-status=live}}</ref>, более полноценная поддержка обеспечивается дополнительными [[фреймворк]]ами<ref>{{Статья|ссылка=https://core.ac.uk/download/pdf/230920601.pdf|автор=Arne Bachmann, Henning Bergmeyer, Andreas Schreiber|заглавие=Evaluation of aspect-oriented frameworks in Python for extending a project with provenance documentation features|год=2011|язык=en|издание=The Python Papers|том=6|выпуск=3|страницы=1–18|issn=1834-3147|archiveurl=https://web.archive.org/web/20180422011318/http://ojs.pythonpapers.org/index.php/tpp/article/download/218/202|archivedate=2018-04-22|access-date=2021-02-20|deadlink=no}}</ref>. Такие методики как [[Контрактное программирование|контрактное]] и [[логическое программирование]] можно реализовать с помощью библиотек или расширений<ref>{{Книга|язык=en|ссылка=https://books.google.ru/books?id=RkEAEAAAQBAJ&pg=PT47|автор=Steven Cooper|заглавие=Data Science from Scratch: The #1 Data Science Guide for Everything A Data Scientist Needs to Know: Python, Linear Algebra, Statistics, Coding, Applications, Neural Networks, and Decision Trees|год=2018|издательство=Roland Bind|страниц=126|access-date=2021-02-21|archive-date=2021-02-21|archive-url=https://web.archive.org/web/20210221110359/https://books.google.ru/books?id=RkEAEAAAQBAJ&pg=PT47|deadlink=no}}</ref>. Основные архитектурные черты — [[динамическая типизация]], [[сборка мусора (программирование)|автоматическое управление памятью]]<ref name=":2" />, [[Интроспекция в Python|полная интроспекция]], механизм [[обработка исключений|обработки исключений]], поддержка [[многопоточность|многопоточных вычислений]] с глобальной блокировкой интерпретатора ([[Global Interpreter Lock|GIL]])<ref>{{Cite web|lang=en|url=https://www.linuxjournal.com/content/multiprocessing-python|title=Multiprocessing in Python|author=Reuven M. Lerner|website=Linux Journal|date=2018-04-16|archiveurl=https://web.archive.org/web/20210214122407/https://www.linuxjournal.com/content/multiprocessing-python|archivedate=2021-02-14|accessdate=2021-02-14|url-status=live}}</ref>, высокоуровневые [[структура данных|структуры данных]]. Поддерживается разбиение программ на [[Модуль (программирование)|модули]], которые, в свою очередь, могут объединяться в пакеты<ref>{{Cite web|lang=en|url=https://www.oreilly.com/library/view/python-cookbook-3rd/9781449357337/ch10.html|title=10. Modules and Packages - Python Cookbook, 3rd Edition [Book]|author=David Beazley, Brian K. Jones|website=Python Cookbook, 3rd Edition|date=2013|publisher=O'Reilly Media, Inc.|archiveurl=https://web.archive.org/web/20210221072641/https://www.oreilly.com/library/view/python-cookbook-3rd/9781449357337/ch10.html|archivedate=2021-02-21|accessdate=2021-02-21|url-status=live}}</ref>. - -[[Эталонная реализация|Эталонной реализацией]] Python является интерпретатор [[CPython]], который поддерживает большинство активно используемых платформ<ref>{{Cite web |url=http://www.python.org/about/ |title=About Python |access-date=2007-08-07 |archive-date=2007-08-11 |archive-url=https://web.archive.org/web/20070811215819/http://www.python.org/about/ |url-status=live }}</ref>, являющийся [[Стандарт де-факто|стандартом де-факто]] языка<ref>{{Cite web|lang=en|url=https://wiki.python.org/moin/PythonImplementations|title=PythonImplementations - Python Wiki|website=wiki.python.org|date=2020-07-21|archiveurl=https://web.archive.org/web/20201111215017/https://wiki.python.org/moin/PythonImplementations|archivedate=2020-11-11|accessdate=2021-02-17|url-status=live}}</ref>. Он распространяется под [[свободное программное обеспечение|свободной лицензией]] [[Python Software Foundation License]], позволяющей использовать его без ограничений в любых приложениях, включая [[проприетарное ПО|проприетарные]]<ref>{{Cite web|lang=en|url=https://docs.python.org/3/license.html|title=History and License|website=Python|access-date=2021-05-21|archive-date=2016-12-05|archive-url=https://web.archive.org/web/20161205134352/https://docs.python.org/3/license.html|url-status=live}}</ref>. CPython компилирует исходные тексты в высокоуровневый [[байт-код]], который исполняется в стековой виртуальной машине<ref name=":18">{{Статья|ссылка=https://cs.ucsb.edu/sites/cs.ucsb.edu/files/docs/reports/2010-14.pdf|автор=Mostafa Chandra Krintz, C. Cascaval, D. Edelsohn, P. Nagpurkar, P. Wu|заглавие=Understanding the Potential of Interpreter-based Optimizations for Python|год=2010|язык=en|издание=UCSB Technical Report|месяц=08|число=11|archiveurl=https://web.archive.org/web/20210223142412/https://cs.ucsb.edu/sites/cs.ucsb.edu/files/docs/reports/2010-14.pdf|archivedate=2021-02-23|access-date=2021-02-23|deadlink=no}}</ref>. К другим трём основным реализациям языка относятся [[Jython]] (для [[JVM]]), [[IronPython]] (для [[CLR]]/[[.NET Framework|.NET]]) и [[PyPy]]<ref name=":2" /><ref name=":3" />. PyPy написан на подмножестве языка Python (RPython) и разрабатывался как альтернатива CPython с целью повышения скорости исполнения программ, в том числе за счёт использования [[JIT-компиляция|JIT-компиляции]]<ref name=":3" />. Поддержка версии Python 2 закончилась в 2020 году<ref name="python-8468">{{cite web|url=https://www.python.org/dev/peps/pep-0373/|title=PEP 373 -- Python 2.7 Release Schedule|lang=en|date=2014-03-23|accessdate=2021-03-07|url-status=live|archiveurl=https://web.archive.org/web/20210225041847/https://www.python.org/dev/peps/pep-0373/|archivedate=2021-02-25}}</ref>. На текущий момент активно развивается версия языка Python 3<ref name=":5">{{Статья|ссылка=https://journals.plos.org/ploscompbiol/article?id=10.1371/journal.pcbi.1004867|автор=Berk Ekmekci, Charles E. McAnany, Cameron Mura|заглавие=An Introduction to Programming for Bioscientists: A Python-Based Primer|год=2016|язык=en|издание=PLOS Computational Biology|месяц=07|число=06|том=12|выпуск=6|страницы=e1004867|issn=1553-7358|doi=10.1371/journal.pcbi.1004867|pmid=27271528|archiveurl=https://web.archive.org/web/20210216190549/https://www.ncbi.nlm.nih.gov/pmc/articles/PMC4896647/pdf/pcbi.1004867.pdf|archivedate=2021-02-16|access-date=2021-02-17|deadlink=no}}</ref>. Разработка языка ведётся через предложения по расширению языка '''PEP''' ({{Lang-en|Python Enhancement Proposal}}), в которых описываются нововведения, делаются корректировки согласно обратной связи от сообщества и документируются итоговые решения<ref name=":7">{{Статья|ссылка=http://ijaerd.com/papers/special_papers/IT032.pdf|автор=Kalyani Adawadkar|заглавие=Python Programming - Applications and Future|год=2017|язык=en|издание=International Journal of Advance Engineering and Research Development|месяц=04|выпуск=SIEICON-2017|страницы=1—4|issn=2348-447|archiveurl=https://web.archive.org/web/20200715080906/http://www.ijaerd.com/papers/special_papers/IT032.pdf|archivedate=2020-07-15|access-date=2021-02-20|deadlink=no}}</ref>. - -Стандартная библиотека включает большой набор полезных переносимых функций, начиная с возможностей для работы с текстом и заканчивая средствами для написания сетевых приложений. Дополнительные возможности, такие как математическое моделирование, работа с оборудованием, написание веб-приложений или разработка игр, могут реализовываться посредством обширного количества сторонних библиотек, а также интеграцией библиотек, написанных на Си или C++, при этом и сам интерпретатор Python может интегрироваться в проекты, написанные на этих языках<ref name=":2" />. Существует и специализированный [[репозиторий]] программного обеспечения, написанного на Python, — [[PyPI]]<ref name=":10">{{Статья|ссылка=https://papers.ssrn.com/abstract=3426281|автор=Ethan Bommarito, Michael James Bommarito|заглавие=An Empirical Analysis of the Python Package Index (PyPI)|год=2019|язык=en|место=Rochester, NY|издание=Social Science Research Network|издательство=Social Science Research Network|месяц=07|число=25|doi=10.2139/ssrn.3426281|arxiv=arXiv:1907.11073v2|access-date=2021-02-19|archive-date=2021-06-09|archive-url=https://web.archive.org/web/20210609072346/https://papers.ssrn.com/sol3/papers.cfm?abstract_id=3426281|deadlink=no|archivedate=2021-06-09|archiveurl=https://web.archive.org/web/20210609072346/https://papers.ssrn.com/sol3/papers.cfm?abstract_id=3426281}}</ref>. Данный репозиторий предоставляет средства для простой установки пакетов в операционную систему и стал стандартом де-факто для Python<ref>{{Книга|язык=en|ссылка=https://books.google.ru/books?id=O0PfBgAAQBAJ&pg=PA8&lpg=PA8|автор=Pratik Desai|заглавие=Python Programming for Arduino|год=2015|издательство=Packt Publishing Ltd|страницы=8|страниц=400|isbn=978-1-78328-594-5|access-date=2021-02-21|archive-date=2021-02-21|archive-url=https://web.archive.org/web/20210221201536/https://books.google.ru/books?id=O0PfBgAAQBAJ&pg=PA8&lpg=PA8|deadlink=no}}</ref>. По состоянию на 2019 год в нём содержалось более 175 тысяч пакетов<ref name=":10" />. - -Python стал одним из самых популярных языков, он используется в [[Анализ данных|анализе данных]], [[Машинное обучение|машинном обучении]], [[DevOps]] и [[Веб-разработка|веб-разработке]], а также в других сферах, включая [[Разработка компьютерных игр|разработку игр]]. За счёт читабельности, простого синтаксиса и отсутствия необходимости в компиляции язык хорошо подходит для обучения программированию, позволяя концентрироваться на изучении алгоритмов, концептов и парадигм. Отладка же и экспериментирование в значительной степени облегчаются тем фактом, что язык является интерпретируемым<ref name=":2" /><ref name=":14">{{Статья|ссылка=https://journals.plos.org/ploscompbiol/article?id=10.1371/journal.pcbi.0030199|автор=Sebastian Bassi|заглавие=A Primer on Python for Life Science Researchers|год=2007|язык=en|издание=PLOS Computational Biology|месяц=11|число=30|том=3|выпуск=11|страницы=e199|issn=1553-7358|doi=10.1371/journal.pcbi.0030199|archiveurl=https://web.archive.org/web/20210313132814/https://journals.plos.org/ploscompbiol/article?id=10.1371%2Fjournal.pcbi.0030199|archivedate=2021-03-13|access-date=2021-03-13|deadlink=no}}</ref>. Применяется язык многими крупными компаниями, такими как [[Google (компания)|Google]] или [[Facebook]]<ref name=":2" />. - -== История == -{{main|История языка программирования Python}} -[[Файл:Python logo 1990s.svg|мини|200px|Логотип, использовавшийся с 1990-х до 2006 года]] -[[Файл:Guido van Rossum OSCON 2006.jpg|мини|200px|[[Ван Россум, Гвидо|Гвидо ван Россум]] в 2006 году на OSCON в Портленде (штат Орегон)]] -Задумка по реализации языка появилась в конце [[1980-е|1980-х годов]], а разработка его реализации началась в 1989 году сотрудником голландского института [[Центр математики и информатики|CWI]] [[Гвидо ван Россум]]ом<ref name=":7" />. Для распределённой операционной системы [[Amoeba (операционная система)|Amoeba]] требовался расширяемый [[Сценарный язык|скриптовый язык]], и Гвидо начал разрабатывать Python на досуге, позаимствовав некоторые наработки для языка [[ABC (язык программирования)|ABC]] (Гвидо участвовал в разработке этого языка, ориентированного на обучение программированию). В феврале [[1991 год]]а Гвидо опубликовал исходный текст в [[Группа новостей|группе новостей]] alt.sources<ref>{{Cite web |url=http://svn.python.org/view/*checkout*/python/trunk/Misc/HISTORY |title=Архивированная копия |accessdate=2009-06-01 |archiveurl=https://web.archive.org/web/20160217132249/http://svn.python.org/view/*checkout*/python/trunk/Misc/HISTORY |archivedate=2016-02-17 |url-status=dead }}</ref>. С самого начала Python проектировался как [[объектно-ориентированный язык программирования|объектно-ориентированный язык]]. - -Гвидо ван Россум назвал язык в честь популярного британского комедийного телешоу [[1970-е|1970-х]] «[[Летающий цирк Монти Пайтона]]»<ref name="AutoNT-24" />, поскольку автор был поклонником этого телешоу, как и многие другие разработчики того времени, а в самом шоу прослеживалась некая параллель с миром компьютерной техники<ref name=":1" />. - -Наличие дружелюбного, отзывчивого сообщества пользователей считается, наряду с дизайнерской интуицией Гвидо, одним из факторов успеха Python. Развитие языка происходит согласно чётко регламентированному процессу создания, обсуждения, отбора и реализации документов PEP ({{lang-en|Python Enhancement Proposal}}) — предложений по развитию Python<ref>{{Cite web |url=http://www.python.org/dev/peps/ |title=Index of Python Enhancement Proposals (PEPs) |access-date=2007-01-28 |archive-date=2007-01-28 |archive-url=https://web.archive.org/web/20070128214511/http://www.python.org/dev/peps/ |url-status=live }}</ref>. - -[[3 декабря]] [[2008 год]]а<ref>{{Cite web |url=http://python.org/download/releases/3.0/ |title=Python 3.0 Release |access-date=2009-06-01 |archive-date=2009-06-02 |archive-url=https://web.archive.org/web/20090602015124/http://www.python.org/download/releases/3.0/ |url-status=live }}</ref>, после длительного тестирования, вышла первая версия Python 3000 (или Python 3.0, также используется [[Аббревиатура|сокращение]] Py3k). В Python 3 устранены многие недостатки архитектуры с максимально возможным (но не полным) сохранением совместимости со старыми версиями Python. - -Дата окончания срока поддержки Python 2.7 первоначально была установлена на 2015 год, а затем перенесена на 2020 год из опасения, что большая часть существующего кода не может быть легко перенесена на Python 3<ref>{{cite web |url=https://legacy.python.org/dev/peps/pep-0373/ |title=PEP 373 -- Python 2.7 Release Schedule |work=python.org |access-date=2017-01-09 |archive-date=2020-05-19 |archive-url=https://web.archive.org/web/20200519075520/https://legacy.python.org/dev/peps/pep-0373/ |url-status=live }}</ref><ref>{{cite web |url=https://www.python.org/dev/peps/pep-0466/ |title=PEP 466 -- Network Security Enhancements for Python 2.7.x |work=python.org |access-date=2017-01-09 |archive-date=2020-06-04 |archive-url=https://web.archive.org/web/20200604232833/https://www.python.org/dev/peps/pep-0466/ |url-status=live }}</ref>. Поддержка Python 2 была направлена лишь на уже существующие проекты, новые проекты должны были использовать Python 3<ref name=":5" />. Официально Python 2.7 не поддерживается с 1 января 2020 года, хотя последнее обновление вышло в апреле 2020. Больше никаких исправлений безопасности или других улучшений для Python 2.7 не будет выпущено<ref name="python-8468" /><ref>{{Cite web|url=https://www.python.org/doc/sunset-python-2/|title=Sunsetting Python 2|website=Python.org|language=en|access-date=2019-09-22|archive-date=2020-01-12|archive-url=https://web.archive.org/web/20200112080903/https://www.python.org/doc/sunset-python-2/|url-status=live}}</ref>. С окончанием срока службы Python 2.x поддерживаются только Python 3.6.x и более поздние версии<ref>{{Cite web|url=https://devguide.python.org/#status-of-python-branches|title=Python Developer's Guide — Python Developer's Guide|website=devguide.python.org|access-date=2019-12-17|archive-date=2020-11-09|archive-url=https://web.archive.org/web/20201109032501/https://devguide.python.org/#status-of-python-branches|url-status=live}}</ref>. - -== Концепция и философия == -{{main|Дзен Пайтона}} -[[Файл:Text-x-python.svg|thumb|left|100px|Пиктограмма для файлов .py]] -Язык использует [[динамическая типизация|динамическую типизацию]] вместе с [[подсчёт ссылок|подсчётом ссылок]] и циклический [[сборщик мусора]] для [[Менеджер памяти|менеджмента памяти]]<ref name="Reference_counting">{{Cite web| url=https://docs.python.org/extending/extending.html#reference-counts| title=Extending and Embedding the Python Interpreter: Reference Counts| publisher=Docs.python.org| language=en| access-date=2020-06-05| quote=Since Python makes heavy use of <code>malloc()</code> and <code>free()</code>, it needs a strategy to avoid memory leaks as well as the use of freed memory. The chosen method is called ''reference counting''.| archive-date=2012-10-18| archive-url=https://web.archive.org/web/20121018063230/http://docs.python.org/extending/extending.html#reference-counts| url-status=live}}</ref>. Также есть динамические [[разрешения имён (программирование)|разрешения имён]] ([[Область видимости#Динамическое связывание|динамическое связывание]]), которые связывают имена методов и переменных во время выполнения программы. - -Python предлагает поддержку функционального программирования в традициях [[Лисп]]а. Так, в Python есть функции <code>filter</code>, <code>map</code> и <code>reduce</code> (Начиная с python 3, находится в библиотеке <code>itertools</code> <ref>{{Cite web |url=https://docs.python.org/3/whatsnew/3.0.html |title=What’s New In Python 3.0 — Python 3.12.0 documentation<!-- Заголовок добавлен ботом --> |access-date=2023-10-08 |archive-date=2012-11-02 |archive-url=https://web.archive.org/web/20121102053959/https://docs.python.org/3/whatsnew/3.0.html |url-status=live }}</ref>; также из Лиспа были заимствованы понятия [[Характеристика списка|характеристик списков]], [[Ассоциативный массив|ассоциативных массивов]] (словарей), [[Множество (тип данных)|множеств]] и генераторов списков<ref name="AutoNT-59">{{cite web |url=https://www.python.org/dev/peps/pep-0289/ |title=PEP 289&nbsp;– Generator Expressions |last=Hettinger |first=Raymond |date=2002-01-30 |work=Python Enhancement Proposals |publisher=Python Software Foundation |access-date=2012-02-19 |archive-date=2020-06-14 |archive-url=https://web.archive.org/web/20200614153717/https://www.python.org/dev/peps/pep-0289/ |url-status=live }}</ref>. Стандартная библиотека содержит два модуля (itertools и functools), реализующие инструменты, заимствованные из [[Haskell]] и [[Standard ML]]<ref name="AutoNT-18">{{cite web |url=https://docs.python.org/3/library/itertools.html |title=6.5 itertools&nbsp;– Functions creating iterators for efficient looping |publisher=Docs.python.org |access-date=2016-11-22 |archive-date=2020-06-14 |archive-url=https://web.archive.org/web/20200614153629/https://docs.python.org/3/library/itertools.html |url-status=live }}</ref>. - -{{Якорь|Философия}} -Разработчики языка Python придерживаются определённой философии программирования, называемой «The Zen of Python» («[[Дзен]] Пито́на», или «Дзен Па́йтона»)<ref>{{Cite web |url=http://www.python.org/peps/pep-0020.html |title=PEP 20 — The Zen of Python |access-date=2005-09-23 |archive-date=2005-07-17 |archive-url=https://web.archive.org/web/20050717021621/http://www.python.org/peps/pep-0020.html |url-status=live }}</ref>. Её текст выдаётся [[интерпретатор]]ом Python по команде <code>import this</code> (работает один раз за сессию). Автором этой философии считается [[Петерс, Тим|Тим Петерс]] (Tim Peters). - -<div style="float:right"> -{{начало цитаты|источник=Философия начинается так<ref>{{Книга|ссылка=https://books.google.ru/books?id=jLFjDwAAQBAJ&pg=PA64|автор=Бейдер Дэн|заглавие=Чистый Python. Тонкости программирования для профи|год=2018|издательство="Издательский дом ""Питер"""|страницы=64—65|страниц=288|isbn=978-5-4461-0803-9|access-date=2020-09-21|archive-date=2021-04-10|archive-url=https://web.archive.org/web/20210410140709/https://books.google.ru/books?id=jLFjDwAAQBAJ&pg=PA64|deadlink=no}}</ref>}} -* Красивое лучше, чем уродливое. -* Явное лучше, чем неявное. -* Простое лучше, чем сложное. -* Сложное лучше, чем запутанное. -…. -{{oq|en| -* Beautiful is better than ugly. -* Explicit is better than implicit. -* Simple is better than complex. -* Complex is better than complicated. -... -}}{{конец цитаты}} -</div> - -Вместо того, чтобы встроить в ядро Python всю функциональность языка, он был спроектирован таким образом, чтобы быть легко расширяемым. Это сделало язык популярным средством добавления программируемых интерфейсов к существующим приложениям. Видение Гвидо ван Россума маленького ядра с большой стандартной библиотекой и легко расширяемым интерпретатором проистекало из негативного опыта разработки языка [[ABC (язык программирования)|ABC]], который придерживался противоположного подхода<ref name="venners-interview-pt-1">{{cite web |url=http://www.artima.com/intv/pythonP.html |title=The Making of Python |last=Venners |first=Bill |date=2003-01-13 |work=Artima Developer |publisher=Artima |access-date=2007-03-22 |archive-date=2016-09-01 |archive-url=https://web.archive.org/web/20160901183332/http://www.artima.com/intv/pythonP.html |url-status=live }}</ref>. - -Python стремится к более простому, менее громоздкому синтаксису и грамматике, предоставляя разработчикам выбор в их методологии кодирования. В отличие от девиза [[Perl]] «[[There’s More Than One Way To Do It|есть несколько способов сделать это]]», Python придерживается философии «должен существовать один — и, желательно, только один — очевидный способ сделать это»<ref name="PEP20">{{cite web |url=https://www.python.org/dev/peps/pep-0020/ |title=PEP 20&nbsp;– The Zen of Python |last=Peters |first=Tim |date=2004-08-19 |work=Python Enhancement Proposals |publisher=Python Software Foundation |access-date=2008-11-24 |archive-date=2018-12-26 |archive-url=https://web.archive.org/web/20181226141127/https://www.python.org/dev/peps/pep-0020/ |url-status=live }}</ref>. {{Нп5|Мартелли, Алекс|Алекс Мартелли|en|Alex Martelli}}, член [[Python Software Foundation]], и автор книг по Python пишет, что «Описывать что-то как „умное“ не считается комплиментом в культуре Python»<ref name="AutoNT-19">{{cite book | url=http://shop.oreilly.com/product/9780596007973.do | title=Python Cookbook, 2nd Edition | publisher=[[O'Reilly Media]] | author=Alex Martelli, Anna Ravenscroft, David Ascher | year=2005 | page=230 | isbn=978-0-596-00797-3 }} {{Wayback|url=http://shop.oreilly.com/product/9780596007973.do |date=20200223171254 }} {{Cite web |url=http://shop.oreilly.com/product/9780596007973.do |title=Источник |access-date=2020-12-28 |archive-date=2020-02-23 |archive-url=https://web.archive.org/web/20200223171254/http://shop.oreilly.com/product/9780596007973.do |url-status=unfit }}</ref>. - -Разработчики Python стремятся избежать преждевременной оптимизации и отвергают патчи к некритическим частям эталонной реализации [[CPython]], которые могли бы предложить незначительное увеличение скорости за счёт понятности кода<ref name="AutoNT-20">{{cite web | title=Python Culture | website=ebeab | date=2014-01-21 | url=http://ebeab.com/2014/01/21/python-culture/ | archive-url=https://web.archive.org/web/20140130021902/http://ebeab.com/2014/01/21/python-culture/ | archive-date=2014-01-30 |url-status=dead}}</ref>. Однако есть способы повышения производительности. Если в программе есть узкие места, связанные с выполнением ресурсоёмких операций на центральном процессоре, но не связанные с использованием операций ввода-вывода, то повысить производительность возможно за счёт трансляции программы при помощи [[Cython]] в язык Си и последующей компиляции<ref>{{Книга|ссылка=https://books.google.ru/books?id=gdN5AAAAQBAJ&pg=PA201&lpg=PA201|автор=Mark Summerfield|заглавие=Python in Practice: Create Better Programs Using Concurrency, Libraries, and Patterns|год=2013-08-20|издательство=Addison-Wesley|страницы=201|страниц=326|isbn=978-0-13-337323-3|access-date=2021-01-28|archive-date=2021-06-09|archive-url=https://web.archive.org/web/20210609072351/https://books.google.ru/books?id=gdN5AAAAQBAJ&pg=PA201&lpg=PA201|deadlink=no}}</ref>. Требовательные к вычислительным ресурсам части программы также можно переписывать на язык Си и подключать как отдельные библиотеки с привязками к Python<ref name=":3">{{Статья|ссылка=https://www.sciencedirect.com/science/article/pii/S2213133714000687|автор=J. Akeret, L. Gamper, A. Amara, A. Refregier|заглавие=HOPE: A Python just-in-time compiler for astrophysical computations|год=2015|язык=en|издание=Astronomy and Computing|месяц=04|число=01|том=10|страницы=1–8|issn=2213-1337|doi=10.1016/j.ascom.2014.12.001|arxiv=1410.4345v2|archiveurl=https://web.archive.org/web/20210215210244/https://arxiv.org/pdf/1410.4345.pdf|archivedate=2021-02-15|access-date=2021-02-15|deadlink=no}}</ref>. - -Важная цель разработчиков Python — делать его забавным для использования. Это было отражено в названии языка, данном в честь [[Монти Пайтон]]а<ref name="AutoNT-24">{{cite web |url=https://docs.python.org/3/faq/general.html#why-is-it-called-python |title=General Python FAQ |work=Python v2.7.3 documentation |publisher=Docs.python.org |access-date=2020-06-04 |archive-date=2012-10-24 |archive-url=https://web.archive.org/web/20121024164224/http://docs.python.org/faq/general.html#why-is-it-called-python |url-status=live }}</ref>. Также это отражено в иногда игривом подходе к обучающим программам и справочным материалам, таким как примеры программ из документаций, которые используют названия spam и eggs вместо использующихся в документации множества других языков foo и bar<ref>{{Cite web|url=https://insidetech.monster.com/training/articles/8114-15-ways-python-is-a-powerful-force-on-the-web|title=15 Ways Python Is a Powerful Force on the Web|accessdate=2020-12-28|archive-date=2019-05-11|archive-url=https://web.archive.org/web/20190511065650/http://insidetech.monster.com/training/articles/8114-15-ways-python-is-a-powerful-force-on-the-web|url-status=dead}}</ref><ref>{{Cite web|url=https://docs.python.org/3/library/pprint.html|title=8.18. pprint — Data pretty printer — Python 3.8.3 documentation|website=docs.python.org|access-date=2020-12-28|archive-date=2021-01-22|archive-url=https://web.archive.org/web/20210122224848/https://docs.python.org/3/library/pprint.html|url-status=live}}</ref>. - -== Портируемость == -Python [[Портирование программного обеспечения|портирован]] и работает почти на всех известных платформах — от [[Карманный персональный компьютер|КПК]] до [[мейнфрейм]]ов. Существуют порты под [[Microsoft Windows]], практически под все варианты [[UNIX]] (включая [[FreeBSD]] и [[Linux]]), [[Android]]<ref>{{cite web|url=http://www.damonkohler.com/2008/12/python-on-android.html|title=Python on Android|publisher=www.damonkohler.com|accessdate=2009-12-19|lang=en|archiveurl=https://www.webcitation.org/5w4n0S15k?url=http://www.damonkohler.com/2008/12/python-on-android.html|archivedate=2011-01-28}}</ref>, [[Plan 9]], [[Mac OS]] и [[macOS]], [[iOS|iPhone OS (iOS)]] 2.0 и выше, [[iPadOS]], [[Palm OS]], [[OS/2]], [[Amiga]], [[HaikuOS]], [[AS/400]], [[OS/390]], [[Windows Mobile]] и [[Symbian]]. - -По мере устаревания платформы её поддержка в основной ветви языка прекращается. Например, с версии 2.6 прекращена поддержка [[Windows 95]], [[Windows 98]] и [[Windows ME]]<ref>{{cite web|url=http://docs.python.org/whatsnew/2.6.html#port-specific-changes-windows|title=Port-Specific Changes: Windows|work=Python v2.6.1 documentation. What’s New in Python 2.6|publisher=Python Software Foundation|accessdate=2008-12-11|lang=en|archiveurl=https://www.webcitation.org/5w4n1Glim?url=http://docs.python.org/whatsnew/2.6.html#port-specific-changes-windows|archivedate=2011-01-28}}</ref>. В версии 3.5 перестала поддерживаться [[Windows XP]]<ref>{{Cite web|lang=en|url=https://docs.python.org/3.5/using/windows.html|title=3. Using Python on Windows — Python 3.5.9 documentation|author=|website=Python Documentation|date=|publisher=Python Software Foundation|accessdate=2020-06-08|archive-date=2020-10-15|archive-url=https://web.archive.org/web/20201015064442/https://docs.python.org/3.5/using/windows.html|url-status=live}}</ref> В версии 3.9 перестала поддерживаться [[Windows Vista]] и [[Windows 7]]<ref>{{Cite web|lang=en|url=https://bugs.python.org/issue32592|title=Drop support of Windows Vista and 7 in Python 3.9|access-date=2021-01-10|archive-date=2020-11-04|archive-url=https://web.archive.org/web/20201104213940/https://bugs.python.org/issue32592|url-status=live}}</ref>. - -При этом, в отличие от многих портируемых систем, для всех основных платформ Python имеет поддержку характерных для данной платформы технологий (например, Microsoft [[Microsoft Component Object Model|COM]]/[[Microsoft Distributed Component Object Model|DCOM]]). Более того, существует специальная версия Python для [[Виртуальная машина Java|виртуальной машины Java]] — [[Jython]], что позволяет интерпретатору выполняться на любой системе, поддерживающей [[Java]], при этом классы [[Java]] могут непосредственно использоваться из Python и даже быть написанными на Python. Также несколько проектов обеспечивают интеграцию с платформой [[Microsoft.NET]], основные из которых — [[IronPython]] и [[Python.NET]]. - -== Типы и структуры данных == -[[Файл:Python 3. The standard type hierarchy.png|thumb]] -Python поддерживает [[динамическая типизация|динамическую типизацию]], то есть тип переменной определяется только во время исполнения. Поэтому вместо «присваивания значения переменной» лучше говорить о «связывании значения с некоторым именем». Также Python поддерживает подсказки типов с помощью аннотаций, добавляющие поддержку [[Последовательная типизация|последовательной типизации]] и позволяющие использовать статический анализ кода<ref>{{Источник информации|ссылка=https://peps.python.org/pep-0484/|заглавие=PEP 484 - Type Hints|язык=en|издание=Python Enhancement Proposals|дата обращения=2023-10-09}}</ref>. Подсказки типов не используются во время компиляции и исполнения кода непосредственно [[CPython]]<ref>{{Источник информации|ссылка=https://books.google.com/books?id=JidnEAAAQBAJ&newbks=0&printsec=frontcover&pg=PT249&dq=python+static+analysis+Type+Hints&hl=ru|авторы=Luciano Ramalho|заглавие=Fluent Python|язык=en|дата=2022-03-31|издатель=O'Reilly Media, Inc.|страницы=253|страниц=972|isbn=978-1-4920-5630-0}}</ref>, но могут использоваться некоторыми библиотеками, например, [[FastAPI]]. К примитивным типам в Python относятся [[булевский тип|булевый]], целое число произвольной длины, число [[плавающая запятая|с плавающей запятой]] и [[комплексное число]]. Из контейнерных типов в Python встроены: [[строковый тип|строка]], [[список (информатика)|список]], [[кортеж (информатика)|кортеж]], [[ассоциативный массив|словарь]] и [[множество (тип данных)|множество]]<ref name=":14" />. Все значения являются объектами, в том числе функции, методы, модули, классы. - -Добавить новый тип можно либо написав [[класс (программирование)|класс]] (class), либо определив новый тип в модуле расширения (например, написанном на языке C). Система классов поддерживает [[наследование (программирование)|наследование]] (одиночное и [[множественное наследование|множественное]]) и [[метапрограммирование]]. Возможно наследование от большинства встроенных типов и типов расширений. -{|class="wikitable" -|+Типы, используемые в Python -|- -! Тип -! [[Неизменяемый объект|Изменяемость]] -! Описание -! style="width: 23em;" | Примеры -|- -| <code>bool</code> -| Неизменяемый -| [[Логический тип]] -| {{code|lang=python|True}}<br>{{code|lang=python|False}} -|- -| <code>bytearray</code> -| Изменяемый -| Массив байтов -| {{code|lang=python|bytearray(b'Some ASCII')}}<br>{{code|lang=python|bytearray(b"Some ASCII")}}<br>{{code|lang=python|bytearray([119, 105, 107, 105])}} -|- -| <code>bytes</code> -| Неизменяемый -| Массив байтов -| {{code|lang=python|b'Some ASCII'}}<br>{{code|lang=python|b"Some ASCII"}}<br>{{code|lang=python|bytes([119, 105, 107, 105])}} -|- -| <code>complex</code> -| Неизменяемый -| [[Комплексное число]] -| {{code|lang=python|3+2.7j}} -|- -| <code>dict</code> -| Изменяемый -| Словарь ([[ассоциативный массив]]), представляет собой коллекцию пар «ключ—значение»; значение может быть любого типа, ключ должен иметь хешируемый тип -| {{code|lang=python|{'key1': 1.0, 3: False} }}<br>{{code|lang=python|{} }} -|- -| <code>types.EllipsisType</code> -| Неизменяемый -| {{Не переведено 5|Многоточие (программирование)|Многоточие|en|Ellipsis (computer programming)}} (эллипсис). Используется в основном в [[NumPy]] для сокращённого задания среза многомерного массива. В самом Python присутствует для поддержки пользовательских типов и таких расширений, как NumPy{{Sfn|Рамальо|2016|p=61}} -| {{code|lang=python|...}}<br>{{code|lang=python|Ellipsis}}<br>Для [[NumPy]]: <br>{{code|lang=python|x[i, ..., j]}},<br> что эквивалентно<br>{{code|lang=python|x[i, :, :, j]}}{{Sfn|Рамальо|2016|p=61}} -|- -| <code>float</code> -| Неизменяемый -| [[Число с плавающей запятой]]. Степень точности зависит от платформы, но на практике обычно реализуется в виде 64-битного 53-разрядного числа<ref>{{Cite web - |title=15. Floating Point Arithmetic: Issues and Limitations — Python 3.8.3 documentation - |url=https://docs.python.org/3.8/tutorial/floatingpoint.html#representation-error - |access-date=2020-06-06 - |website=docs.python.org - |quote=Almost all machines today (November 2000) use IEEE-754 floating point arithmetic, and almost all platforms map Python floats to IEEE-754 “double precision”. - |archive-date=2020-06-06 - |archive-url=https://web.archive.org/web/20200606113842/https://docs.python.org/3.8/tutorial/floatingpoint.html#representation-error - |url-status=live - }}</ref> -| -{{code|lang=python|1.414}} -|- -| <code>frozenset</code> -| Неизменяемый -| Неупорядочное [[множество (тип данных)|множество]], не содержит дубликатов; может содержать внутри себя различные хешируемые типы данных -| {{code|lang=python|frozenset([4.0, 'string', True])}} -|- -| <code>int</code> -| Неизменяемый -| [[Множество (тип данных)|Целое число]] неограниченного размера<ref name="pep0237">{{cite web |url=https://www.python.org/dev/peps/pep-0237/ |title=PEP 237&nbsp;– Unifying Long Integers and Integers |author=Moshe Zadka, Guido van Rossum |date=2001-03-11 |work=Python Enhancement Proposals |publisher=Python Software Foundation |access-date=2011-09-24 |archive-date=2020-05-28 |archive-url=https://web.archive.org/web/20200528063237/https://www.python.org/dev/peps/pep-0237/ |url-status=live }}</ref> -| {{code|lang=python|42}} -|- -| <code>list</code> -| Изменяемый -| [[Список (информатика)|Список]], может содержать внутри себя различные типы данных -| {{code|lang=python|[4.0, 'string', True]}}<br>{{code|lang=python|[]}} -|- -| <code>NoneType</code>{{ref+|Недоступно непосредственно по имени типа.|К|П}} -| Неизменяемый -| Объект, представляющий собой отсутствие значения, часто называемый {{Не переведено 5|Null pointer|Null|en|Null pointer}} в других языках. -| {{code|lang=python|None}} -|- -| <code>NotImplementedType</code>{{ref+||К|П}} -| Неизменяемый -| Объект, который возвращается при [[Перегрузка операторов|перегрузке операторов]], когда типы операндов не поддерживаются. -| {{code|lang=python|NotImplemented}} -|- -| <code>range</code> -| Неизменяемый -| Последовательность целых чисел от какого-то одного значения до другого, обычно используется для повторения операции несколько раз при помощи for<ref>{{cite web |title=Built-in Types |url=https://docs.python.org/3/library/stdtypes.html#typesseq-range |access-date=2019-10-03 |archive-date=2020-06-14 |archive-url=https://web.archive.org/web/20200614194325/https://docs.python.org/3/library/stdtypes.html#typesseq-range |url-status=live }}</ref> -| {{code|lang=python|range(1, 10)}}<br>{{code|lang=python|range(10, -5, -2)}} -|- -| <code>set</code> -| Изменяемый -| Неупорядочное [[множество (тип данных)|множество]], не содержит дубликатов; может содержать внутри себя различные хешируемые типы данных -| {{code|lang=python|{4.0, 'string', True} }}<br>{{code|lang=python|set()}} -|- -| <code>str</code> -| Неизменяемый -| [[Строковый тип]] -| {{code|lang=python|'Wikipedia'}}<br>{{code|lang=python|"Wikipedia"}}<br><syntaxhighlight lang="python">"""Spanning -multiple -lines"""</syntaxhighlight> -|- -| <code>tuple</code> -| Неизменяемый -| [[Кортеж (информатика)|Кортеж]]. Может содержать внутри себя различные типы данных. Может использоваться в качестве неизменяемого списка и в качестве записей с неименованными полями{{Sfn|Рамальо|2016|pp=52—54}} -| В качестве неизменяемого списка: <br>{{code|lang=python|(4.0, 'string', True)}}<br>{{code|lang=python|('single element',)}}<br>{{code|lang=python|()}}<br>В качестве записей:<br>{{code|lang=python|lax_coordinates {{=}} (33.9425, -118.408056)}} <br>{{code|lang=python|city, year, pop, chg, area {{=}} ('Tokyo', 2003, 32450, 0.66, 8014)}}{{Sfn|Рамальо|2016|pp=52—54}} -|} - -== Синтаксис и семантика == -{{Основная статья|Синтаксис и семантика Python}} - -=== Операторы === -Набор операторов достаточно традиционен. - -* Условный оператор <code>if</code> (если). При наличии нескольких условий и альтернатив применяется необязательный блок <code>elif</code>(сокращение от else if) который может повторяться в коде неограниченное число раз. Если ни одно из условий не было соблюдено, то выполняется необязательный блок <code>else</code> (иначе). -* Оператор цикла <code>while</code>. -* Оператор итерации <code>for</code>. -* Операторы обработки исключений <code>try</code> — <code>except</code> — <code>else</code> — <code>finally</code>. -* Оператор определения класса <code>class</code>. -* Оператор определения функции, метода или генератора <code>def</code>. Внутри возможно применение <code>return</code> (возврат) для возврата из функции или метода, а в случае генератора — <code>yield</code> (давать). -* Оператор [[Сопоставление с образцом|сопоставления с образцом]] (начиная с Python 3.10) <code>match</code> — <code>case</code>. -* Операторы вызова исключений <code>raise</code> и <code>assert</code>. -* Оператор <code>pass</code> ничего не делает. Используется для пустых блоков кода. - -=== Система отступов === -Одной из интересных синтаксических особенностей языка является выделение [[блок (программирование)|блоков]] кода с помощью отступов (пробелов или табуляций), поэтому в Python отсутствуют [[операторные скобки]] begin/end, как в языке [[Паскаль (язык программирования)|Паскаль]], или фигурные скобки, как в [[Си (язык программирования)|Си]]. Такой «трюк» позволяет сократить количество строк и символов в программе и приучает к «хорошему» стилю программирования. С другой стороны, поведение и даже корректность программы может зависеть от начальных пробелов в тексте. Тем, кто привык программировать на языках с явным выделением начала и конца блоков, такое поведение поначалу может показаться неинтуитивным и неудобным. - -Сам Гвидо писал<ref name="foreword" />: -{{начало цитаты}} -Наверное, самой спорной особенностью Python является использование отступов для группировки операторов, что взято непосредственно из [[ABC (язык программирования)|ABC]]. Это одна из особенностей языка, которая дорога моему сердцу. Это делает код Python более читабельным двумя способами. Во-первых, использование отступов уменьшает визуальное нагромождение и делает программы короче, тем самым сокращая объём внимания, необходимого для восприятия базовой единицы кода. Во-вторых, это даёт программисту меньше свободы в форматировании, тем самым делая возможным более единообразный стиль, что облегчает чтение чужого кода. (Сравните, например, [[Отступ (программирование)#Отступы в Си|три или четыре различных соглашения]] о размещении фигурных скобок в [[Си (язык программирования)|Си]], каждое из которых имеет сильных сторонников). -{{оригинальный текст|en|Perhaps Python's most controversial feature is its use of indentation for statement grouping, which derives directly from ABC. It is one of the language's features that is dearest to my heart. It makes Python code more readable in two ways. First, the use of indentation reduces visual clutter and makes programs shorter, thus reducing the attention span needed to take in a basic unit of code. Second, it allows the programmer less freedom in formatting, thereby enabling a more uniform style, which makes it easier to read someone else's code. (Compare, for instance, the three or four different conventions for the placement of braces in C, each with strong proponents.)}} -{{конец цитаты}} - -=== Выражения === -Состав, синтаксис, ассоциативность и приоритет операций достаточно привычны для языков программирования и призваны минимизировать употребление скобок. Если сравнивать с математикой, то приоритеты операторов зеркалируют соответствующие в математике, при этом оператор присвоения значения <code>=</code> соответствует типографскому <code>←</code>. Хотя приоритеты операций позволяют не использовать скобки во многих случаях, на анализ больших выражений может тратиться лишнее время, в результате чего в таких случаях выгоднее явно расставлять скобки<ref name=":5" />. - -Отдельно стоит упомянуть ''операцию форматирования'' для строк (работает по аналогии с функцией <code>printf()</code> из Си), которая использует тот же символ, что и взятие остатка от деления: -<source lang="python"> ->>> str_var = "world" ->>> print("Hello, %s" % str_var) -Hello, world -</source> - -В версии 3.6 были добавлены ''форматированные строковые литералы'', или ''f-строки,'' которые делают код более читаемым и лаконичным:<syntaxhighlight lang="python3"> ->>> str_var = "world" ->>> print(f"Hello, {str_var}") # вывод с использованием f-строки -Hello, world -</syntaxhighlight>Python имеет удобные ''цепочечные сравнения'': -<source lang="python"> -1 <= a < 10 and 1 <= b < 20 -</source> - -Кроме того, логические операции (<code>or</code> и <code>and</code>) являются [[Ленивые вычисления|ленивыми]]: если для вычисления значения операции достаточно первого операнда, этот операнд и является результатом, в противном случае вычисляется второй операнд логической операции. Это основывается на свойствах [[Алгебра логики|алгебры логики]]: например, если один аргумент операции «ИЛИ» (<code>or</code>) является истиной, то и результат этой операции всегда является истиной. В случае, если второй операнд является сложным выражением, это позволяет сократить издержки на его вычисление. Этот факт широко использовался до версии 2.5 вместо условной конструкции: -<source lang="python"> -a < b and "меньше" or "больше или равно" -</source> - -Встроенные типы данных, как правило, имеют особый синтаксис для своих литералов (записанных в исходном коде констант): -<source lang="python"> -"строка и Юникод-строка одновременно" -'строка и Юникод-строка одновременно' -"""тоже строка и Юникод-строка одновременно""" -True or False # булевы литералы -3.14 # число с плавающей запятой -0b1010 + 0o12 + 0xA # числа в двоичной, восьмеричной и шестнадцатеричной системах счисления -1 + 2j # комплексное число -[1, 2, "a"] # список -(1, 2, "a") # кортеж -{'a': 1, 'b': 'B'} # словарь -{'a', 6, 8.8} # множество -lambda x: x**2 # анонимная функция -(i for i in range(10)) # генератор -</source> - -Для списков (и других последовательностей) Python предлагает набор операций над срезами. Особенностью является индексация, которая может показаться новичку странной, но раскрывает свою согласованность по мере использования. Индексы элементов списка начинаются с нуля. Запись среза <code>s[N:M]</code> означает, что в срез попадают все элементы от N включительно до M, не включая. При этом индекс можно не указывать. Например, запись <code>s[:M]</code> означает, что в срез попадают все элементы с самого начала; запись <code>s[N:]</code> означает, что попадают все элементы до конца среза; запись <code>s[:]</code> означает, что попадают все элементы с начала и до конца. - -=== Имена === -Имя (идентификатор) может начинаться с буквы любого алфавита в [[Юникод]]е любого регистра или подчёркивания, после чего в имени можно использовать и цифры. В качестве имени нельзя использовать ключевые слова (их список можно узнать по <code>import keyword; print(keyword.kwlist)</code>) и нежелательно переопределять встроенные имена. Имена, начинающиеся с символа подчёркивания, имеют специальное значение<ref>{{cite web|url=http://docs.python.org/reference/lexical_analysis.html#reserved-classes-of-identifiers|title=2.3.2. Reserved classes of identifiers|work=Python documentation|date=2009-10-18|archiveurl=https://www.webcitation.org/5w4n2As6O?url=http://docs.python.org/reference/lexical_analysis.html#reserved-classes-of-identifiers|archivedate=2011-01-28}}</ref>. - -В каждой точке программы интерпретатор имеет доступ к трём [[пространство имён (программирование)|пространствам имён]] (то есть отображениям имён в объекты): локальному, глобальному и встроенному. - -''Области видимости'' имён могут быть вложенными друг в друга (внутри определяемой функции видны имена из окружающего блока кода). На практике с областями видимости и связыванием имён связано несколько правил «хорошего тона», о которых можно подробнее узнать из документации. - -=== Строки документации === -Python предлагает механизм [[Техническая документация|документирования]] кода pydoc. В начало каждого модуля, класса, функции вставляется строка документации — ''{{не переведено|docstring||en|docstring}}''. Строки документации остаются в коде на момент времени исполнения, и в язык встроен доступ к документации<ref>{{Cite web |url=http://softwaremaniacs.org/blog/2005/12/08/django/ |title=…целостность больших проектов на Python строится на двух вещах: тесты и doc-строка |access-date=2008-10-31 |archive-date=2008-10-21 |archive-url=https://web.archive.org/web/20081021094143/http://softwaremaniacs.org/blog/2005/12/08/django/ |url-status=live }}</ref>(переменная <code>__doc__</code>), что используется современными IDE ([[Интегрированная среда разработки]]) (например, [[Eclipse (среда разработки)|Eclipse]]). - -В интерактивном режиме можно получить помощь, сгенерировать гипертекстовую документацию по целому модулю или даже применить ''{{не переведено|doctest||en|doctest}}'' для автоматического тестирования модуля. - -== [[Парадигма программирования|Парадигмы программирования]] == -Python — [[мультипарадигменный язык программирования]]. Полностью поддерживаются [[Объектно-ориентированное программирование|объектно-ориентированное]], [[структурное программирование|структурное]]<ref name=":6">{{Cite web|lang=en|url=http://facweb.cs.depaul.edu/sjost/it211/documents/structured.htm|title=Structured Programming Details|author=Steve D. Jost|website=[[Университет Де Поля]]|date=2019|access-date=2021-02-17|archive-date=2020-04-29|archive-url=https://web.archive.org/web/20200429100316/http://facweb.cs.depaul.edu/sjost/it211/documents/structured.htm|url-status=live}}</ref>, [[Обобщённое программирование|обобщённое]], [[Функциональное программирование|функциональное]] программирование<ref name=":2" /> и [[метапрограммирование]]<ref name=":12" />. Базовая поддержка [[Аспектно-ориентированное программирование|аспектно-ориентированного]] программирования реализуется за счёт метапрограммирования<ref name=":13" />. Множество других методик, в том числе [[контрактное программирование|контрактное]]<ref name="AutoNT-15">{{cite web |url=http://www.nongnu.org/pydbc/ |title=PyDBC: method preconditions, method postconditions and class invariants for Python |access-date=2011-09-24 |archive-date=2019-11-23 |archive-url=https://web.archive.org/web/20191123231931/http://www.nongnu.org/pydbc/ |url-status=live }}</ref><ref name="AutoNT-16">{{cite web |url=http://www.wayforward.net/pycontract/ |title=Contracts for Python |access-date=2011-09-24 |archive-date=2020-06-15 |archive-url=https://web.archive.org/web/20200615173404/http://www.wayforward.net/pycontract/ |url-status=live }}</ref> и [[логическое программирование]]<ref name="AutoNT-17">{{cite web |url=https://sites.google.com/site/pydatalog/ |title=PyDatalog |access-date=2012-07-22 |archive-date=2020-06-13 |archive-url=https://web.archive.org/web/20200613160231/https://sites.google.com/site/pydatalog/ |url-status=live }}</ref> можно реализовать с помощью расширений. - -=== [[Объектно-ориентированное программирование]] === -Дизайн языка Python построен вокруг объектно-ориентированной модели программирования. Реализация [[Объектно-ориентированное программирование|ООП]] в Python является хорошо продуманной, но вместе с тем достаточно специфической по сравнению с другими [[Объектно-ориентированный язык программирования|объектно-ориентированными языками]]. В языке всё является объектами — либо экземплярами классов, либо экземплярами метаклассов. Исключением является базовый встроенный метакласс <code>'''type'''</code>. Таким образом, классы на самом деле являются экземплярами метаклассов, а производные метаклассы являются экземплярами метакласса <code>'''type'''</code>. Метаклассы являются частью концепции метапрограммирования и предоставляют возможность управления наследованием классов, что позволяет создавать абстрактные классы, регистрировать классы или добавлять в них какой-либо программный интерфейс в рамках [[Библиотека (программирование)|библиотеки]] или [[фреймворк]]а<ref name=":12" />. - -Классы по своей сути представляют план или описание того, как создать объект, и хранят в себе описание атрибутов объекта и методов для работы с ним. Парадигма ООП основывается на [[Инкапсуляция (программирование)|инкапсуляции]], [[Наследование (программирование)|наследовании]] и [[Полиморфизм (информатика)|полиморфизме]]<ref name=":15" />. Инкапсуляция в Python представлена возможностью хранения публичных и скрытых [[Поле класса|атрибутов]] (полей) в объекте с предоставлением [[Метод (программирование)|методов]] для работы с ними<ref name=":15" />, при этом на самом деле все атрибуты являются публичными, но для пометки скрытых атрибутов существует соглашение об именовании<ref name=":16" />. Наследование позволяет создавать производные объекты без необходимости повторного написания кода, а полиморфизм заключается в возможности переопределения любых методов объекта (в Python все методы являются [[Виртуальный метод|виртуальными]]<ref name=":16">{{Cite web|lang=en|url=https://docs.python.org/3/tutorial/classes.html|title=9. Classes|website=Python 3.9.2 documentation|publisher=docs.python.org|archive-url=https://web.archive.org/web/20210314111300/https://docs.python.org/3/tutorial/classes.html|archive-date=2021-03-14|access-date=2021-03-14|url-status=live}}</ref>), а также в перегрузке [[Перегрузка процедур и функций|методов]] и [[Перегрузка операторов|операторов]]. Перегрузка методов в Python реализуется за счёт возможности вызова одного и того же метода с разным набором аргументов<ref name=":15">{{Cite web|lang=en|url=https://developer.ibm.com/languages/python/tutorials/object-oriented-programming-in-python/|title=Object-oriented programming in Python|website=IBM Developer|date=2020-10-20|publisher=ibm.com|archive-url=https://web.archive.org/web/20210311194854/https://developer.ibm.com/languages/python/tutorials/object-oriented-programming-in-python/|archive-date=2021-03-11|access-date=2021-03-11|url-status=live}}</ref>. Особенностью Python является возможность модифицировать классы после их объявления, добавляя в них новые атрибуты и методы<ref name=":5" />, также можно модифицировать и сами объекты, в результате чего классы могут использоваться как структуры для хранения произвольных данных<ref name=":16" />. - -В Python поддерживается множественное наследование. Само по себе множественное наследование является сложным, и его реализации сталкиваются с проблемами разрешения коллизий имён между родительскими классами и с возможным повторным наследованием от одного и того же класса в иерархии. В Python методы вызываются согласно порядку разрешения методов (MRO), который основан на алгоритме [[C3-линеаризация|C3-линеаризации]]<ref>{{Статья|ссылка=https://thesai.org/Publications/ViewPaper?Volume=8&Issue=6&Code=IJACSA&SerialNo=14|автор=Fawzi Albalooshi, Amjad Mahmood|заглавие=A Comparative Study on the Effect of Multiple Inheritance Mechanism in Java, C++, and Python on Complexity and Reusability of Code|год=2017|язык=en|издание=International Journal of Advanced Computer Science and Applications (IJACSA)|том=8|выпуск=6|issn=2156-5570|doi=10.14569/IJACSA.2017.080614|archiveurl=https://web.archive.org/web/20200710024816/https://thesai.org/Downloads/Volume8No6/Paper_14-A_Comparative_Study_on_the_Effect_of_Multiple.pdf|archivedate=2020-07-10|access-date=2021-03-12|deadlink=no}}</ref>, в обычных случаях при написании программ не требуется знать принцип работы данного алгоритма, понимание же может потребоваться при создании нетривиальных иерархий классов<ref>{{Cite web|lang=en|url=https://www.python.org/download/releases/2.3/mro/|title=The Python 2.3 Method Resolution Order|author=Michele Simionato|website=Python.org|archive-url=https://web.archive.org/web/20210314152959/https://www.python.org/download/releases/2.3/mro/|archive-date=2021-03-14|access-date=2021-03-14|url-status=live}}</ref>. - -Возможности и особенности, специфичные для Python: - -* Специальные методы, управляющие жизненным циклом объекта: конструкторы, деструкторы. -* Перегрузка операторов (всех, кроме <code>is, '.', '='</code> и символьных логических). -* Свойства (имитация поля с помощью функций). -* Управление доступом к полям (эмуляция полей и методов, частичный доступ, и т. п.). -* Методы для управления наиболее распространёнными операциями (истинностное значение, <code>len()</code>, глубокое копирование, [[сериализация]], итерация по объекту, …). -* Полная [[Интроспекция (программирование)|интроспекция]]. -* Классовые и статические методы, классовые поля. -* Классы, вложенные в функции и классы. -* Возможность модифицировать объекты во время исполнения программы. - -=== [[Обобщённое программирование]] === -Языки с поддержкой динамической типизации и объектно-ориентированного программирования обычно не рассматриваются в рамках обобщённого программирования, поскольку задачи обобщённого программирования решаются за счёт отсутствия ограничений на типы данных<ref name=":8">{{Статья|ссылка=https://link.springer.com/chapter/10.1007/978-3-642-45404-2_5|автор=Alexandre Bergel, Lorenzo Bettini|заглавие=Generic Programming in Pharo|год=2013|ответственный=José Cordeiro, Slimane Hammoudi, Marten van Sinderen|язык=en|место=Berlin, Heidelberg|издание=Software and Data Technologies|издательство=Springer|страницы=66–79|isbn=978-3-642-45404-2|doi=10.1007/978-3-642-45404-2_5|archiveurl=https://web.archive.org/web/20210213175706/https://link.springer.com/chapter/10.1007/978-3-642-45404-2_5|archivedate=2021-02-13|access-date=2021-02-13|deadlink=no}}</ref><ref name=":9">{{Статья|ссылка=https://arxiv.org/pdf/2011.02626v1.pdf|автор=R. Peschke, K. Nishimura, G. Varner|заглавие=ARGG-HDL: A High Level Python BasedObject-Oriented HDL Framework|год=2020|язык=en|издание=IEEE Transactions on Nuclear Science|тип=pre-print|месяц=10|arxiv=011.02626v1|access-date=2021-02-13|archive-date=2020-11-07|archive-url=https://web.archive.org/web/20201107012516/https://arxiv.org/pdf/2011.02626v1.pdf|deadlink=no|archivedate=2020-11-07|archiveurl=https://web.archive.org/web/20201107012516/https://arxiv.org/pdf/2011.02626v1.pdf}}</ref>. В Python обобщённое программирование со строгой типизацией достигается использованием средств языка совместно со внешними анализаторами кода<ref>{{Cite web|lang=en|url=https://www.python.org/dev/peps/pep-0484/|title=PEP 484 -- Type Hints|website=Python.org|date=2014-09-24|archiveurl=https://web.archive.org/web/20210209180311/https://www.python.org/dev/peps/pep-0484/|archivedate=2021-02-09|accessdate=2021-02-13|url-status=live}}</ref>, такими как Mypy<ref>{{Cite web|lang=en|url=https://mypy.readthedocs.io/en/stable/generics.html|title=Generics|author=Jukka Lehtosalo|website=Mypy 0.800 documentation|date=2016|publisher=Read the Docs|archiveurl=https://web.archive.org/web/20210213135624/https://mypy.readthedocs.io/en/stable/generics.html|archivedate=2021-02-13|accessdate=2021-02-13|url-status=live}}</ref>. - -=== [[Функциональное программирование]] === -Несмотря на то, что Python изначально не задумывался как язык функционального программирования{{sfn|Рамальо|2016|pp=188—191}}, он поддерживает функциональный стиль программирования, в частности<ref name=":4">{{Книга|автор=David Mertz|заглавие=Functional Programming in Python|год=2015|издательство=O'Reilly|isbn=978-1491928561|язык=en}}</ref>: - -* функция является объектом первого класса, -* функции высших порядков, -* рекурсия, -* фокус на работу со [[Список (информатика)|списками]], -* аналог [[Замыкание (программирование)|замыканий]], -* частичное применение функции с помощью метода <code>partial()</code>, -* возможность реализации других средств на самом языке (например, [[карринг]]). - -Однако, в отличие от большинства языков, непосредственно ориентированных на функциональное программирование, Python не является [[Чистота языка программирования|чистым языком программирования]] и код не защищён от [[Побочный эффект (программирование)|побочных эффектов]]<ref name=":4" />{{sfn|Рамальо|2016|p=273}}. - -В стандартной библиотеке Python существуют специальные пакеты <code>operator</code> и <code>functools</code> для функционального программирования{{sfn|Рамальо|2016|pp=188—191}}. - -=== [[Метапрограммирование]] === -{{В планах|дата=2023-02-08}} -Python поддерживает [[метапрограммирование]]{{Sfn|Рамальо|2016|pp=613—708}}<ref name=":12" />. - -=== [[Асинхронное программирование]] === -{{Заготовка раздела|Асинхронное программирование на Python}} -Python, начиная с 3.5, стал поддерживать асинхронное программирование. Появились операторы <code>async</code> и <code>await</code>, а также библиотека <code>asyncio</code><ref name=":23" /><syntaxhighlight lang="python3"> -import asyncio - -async def main(): - print('Hello ...') - await asyncio.sleep(1) - print('... World!') - -asyncio.run(main()) -</syntaxhighlight><code>async</code> является атрибутом, который создает [[Асинхронное программирование|асинхронную]] функцию<ref name=":23" /> - -<code>await</code> позволяет выполнять асинхронные генераторы<ref name=":23" /> - -== Возможности == - -=== [[Модуль (программирование)|Модули]] и пакеты === -Программное обеспечение (приложение или библиотека) на Python оформляется в виде модулей, которые в свою очередь могут быть собраны в ''пакеты''. Модули могут располагаться как в [[Каталог (файловая система)|каталогах]], так и в [[ZIP|ZIP-архивах]]. Модули могут быть двух типов по своему происхождению: модули, написанные на «чистом» Python, и модули расширения (extension modules), написанные на других языках программирования. Например, в стандартной библиотеке есть «чистый» модуль pickle и его аналог на Си: cPickle. Модуль оформляется в виде отдельного файла, а пакет — в виде отдельного каталога. Подключение модуля к программе осуществляется оператором <code>import</code>. После импорта модуль представлен отдельным объектом, дающим доступ к пространству имён модуля. В ходе выполнения программы модуль можно перезагрузить функцией <code>reload()</code>. - -=== [[Интроспекция (программирование)|Интроспекция]] === -Python поддерживает полную [[Интроспекция (программирование)|интроспекцию]] времени исполнения<ref>{{статья| автор= Патрик О'Брайен| заглавие= Руководство по интроспекции на Python| оригинал= | ссылка= http://www.citforum.ru/programming/python/introspec.shtml| язык= | ответственный= [http://www.iso.ru/ Intersoft Lab]| archivedate= 2021-07-21| archiveurl= https://web.archive.org/web/20210721011912/http://citforum.ru/programming/python/introspec.shtml}}</ref>. Это означает, что для любого объекта можно получить всю информацию о его внутренней структуре. - -Применение интроспекции является важной частью того, что называют [[Pythonic style]], и широко применяется в библиотеках и [[фреймворк]]ах Python, таких как [[PyRO]], [[PLY]], [[Cherry]], [[Django]] и др., значительно экономя время использующего их программиста. - -Необходимые для интроспекции данные хранятся в специальных атрибутах. Так, например, получить все пользовательские атрибуты большинства объектов можно из специального атрибута — словаря (или другого объекта, предоставляющего интерфейс <code>dict</code>) <code>__dict__</code> - -<source lang="python"> - >>> class x(object):pass - .... - >>> f = x() - >>> f.attr = 12 - >>> print(f.__dict__) - {'attr': 12} - >>> print(x.__dict__) # т.к. классы тоже являются экземплярами объекта type - # то и они поддерживают этот тип интроспекции - {'__dict__': <attribute '__dict__' of 'x' objects>, '__module__'....... -</source> - -Есть также другие атрибуты, имена и назначение которых зависят от объекта: - -<source lang="python"> - >>> def f():pass - .... - >>> f.func_code.co_code # получение байтокода функции - 'd\x00\x00S' - >>> f.__class__ # специальный атрибут - ссылка на класс данного объекта - <type 'function'> -</source> - -Подавляющее большинство атрибутов, поддерживающих интроспекцию, является классовым, и их, в свою очередь, можно получить из <code>obj.__class__.__dict__</code>. Часть информации, унаследованную от базового класса, все объекты используют совместно, что позволяет экономить память. - -Для удобства получения интроспективной информации в Python есть модуль <code>inspect</code>{{sfn|Beazley|2009|pp=222—225}}. - -<source lang="python"> - >>> def f(x,y = 10,**mp):pass - ... - >>> inspect.getargspec(f) - (['x', 'y'], None, 'mp', (10,)) -</source> - -С помощью модуля <code>new</code> возможен обратный процесс — построения объекта из составных частей на этапе исполнения - -<source lang="python"> - >>> def f(i): return j + i - .... - >>> j = 2 - >>> f(1) - 3 - >>> import new - >>> g = new.function(f.func_code, {'j': 23}) - >>> g(1) - 24 -</source> - -=== [[Обработка исключений]] === -Обработка исключений поддерживается в Python посредством операторов <code>try, except, else, finally, raise</code>, образующих блок обработки исключения. В общем случае блок выглядит следующим образом: -<source lang="python"> -try: - # Здесь код, который может вызвать исключение - raise Exception("message") # Exception, это один из стандартных типов исключения (всего лишь класс), - # может использоваться любой другой, в том числе свой -except (Тип исключения1, Тип исключения2, …) as Переменная: - # Код в блоке выполняется, если тип исключения совпадает с одним из типов - # (Тип исключения1, Тип исключения2, …) или является наследником одного - # из этих типов. - # Полученное исключение доступно в необязательной Переменной. -except (Тип исключения3, Тип исключения4, …) as Переменная: - # Количество блоков except не ограничено - raise # Сгенерировать исключение "поверх" полученного; без параметров - повторно сгенерировать полученное -except: - # Будет выполнено при любом исключении, не обработанном типизированными блоками except -else: - # Код блока выполняется, если не было поймано исключений. -finally: - # Будет исполнено в любом случае, возможно после соответствующего - # блока except или else -</source> -Совместное использование <code>else, except</code> и <code>finally</code> стало возможно только начиная с Python 2.5. Информация о текущем исключении всегда доступна через <code>sys.exc_info()</code>. Кроме значения исключения, Python также сохраняет состояние стека вплоть до точки возбуждения исключения — так называемый traceback. - -В отличие от компилируемых языков программирования, в Python использование исключения не приводит к значительным накладным расходам (а зачастую даже позволяет ускорить исполнение программ) и очень широко используется. Исключения согласуются с философией Python (10-й пункт «[[#Философия|дзена Python]]» — «Ошибки никогда не должны умалчиваться») и являются одним из средств поддержки «[[Утиная типизация|утиной типизации]]». - -Иногда вместо явной обработки исключений удобнее использовать блок [[Python#Управление контекстом выполнения|<code>with</code>]] (доступен, начиная с Python 2.5). - -=== [[Итератор]]ы === -В программах на Python широко используются итераторы. Цикл <code>for</code> может работать как с последовательностью, так и с итератором. Большинство коллекций предоставляют итераторы, итераторы могут также определяться пользователем для собственных объектов. Модуль <code>itertools</code> стандартной библиотеки содержит средства работы с итераторами. - -=== [[Генератор (программирование)|Генераторы]] === -Одной из интересных возможностей языка являются '''генераторы''' — функции, сохраняющие внутреннее состояние: значения локальных переменных и текущую инструкцию (см. также: [[сопрограмма|сопрограммы]]). Генераторы могут использоваться как [[Итератор (программирование)|итераторы]] для структур данных и для [[ленивые вычисления|ленивых вычислений]]. - -При вызове генератора функция немедленно возвращает объект-итератор, который хранит текущую точку исполнения и состояние локальных переменных функции. При запросе следующего значения (посредством метода <code>next()</code>, неявно вызываемого в цикле <code>for</code>) генератор продолжает исполнение функции от предыдущей точки остановки до следующего оператора <code>yield</code> или <code>return</code>. - -В Python 2.4 появились '''генераторные выражения''' — выражения, дающие в результате генератор. Генераторные выражения позволяют сэкономить память там, где иначе требовалось бы использовать список с промежуточными результатами: -<source lang="python"> ->>> sum(i for i in range(1, 100) if i % 2 != 0) -2500 -</source> -В этом примере суммируются все нечётные числа от 1 до 99. - -Начиная с версии 2.5, Python поддерживает полноценные сопроцедуры: теперь в генератор можно передавать значения с помощью метода <code>send()</code> и возбуждать в его контексте исключения с помощью метода <code>throw()</code>. - -Также Python поддерживает вложенные генераторы. Например, для создания двумерного массива нужно разместить генератор списка, являющегося строкой, внутри генератора всех строк: <code>[[0 for j in range(m)] for i in range(n)]</code> - -=== Управление контекстом выполнения === -В Python 2.5 появились средства для управления контекстом выполнения блока кода — оператор <code>with</code> и модуль <code>contextlib</code>. См.: [[v:Практика по языку Python/Примеры программ на языке Python#Управление контекстом выполнения|пример]]. - -Оператор может применяться в тех случаях, когда до и после некоторых действий должны обязательно выполняться некоторые другие действия, независимо от возбуждённых в блоке исключений или операторов <code>return</code>: файлы должны быть закрыты, ресурсы освобождены, перенаправление стандартного ввода вывода закончено и т. п. Оператор улучшает читаемость кода, а значит, помогает предотвращать ошибки. - -=== Декораторы === -{{не путать|Декоратор (шаблон проектирования)|одноимённым шаблоном проектирования}} -{{В планах|дата=2023-02-08}} -Декораторы функций — вызываемые объекты, которые принимают другую функцию в качестве аргумента. Декораторы функций могут производить операции с функцией и возвращают либо саму функцию, либо другую заменяющую её функцию или вызываемый объект. То есть, если в коде ранее был прописан декоратор, названный decorate, то следующий код{{sfn|Рамальо|2016|pp=214—246}}: - -: <syntaxhighlight lang="python"> -@decorate -def target(): - print('running target()') -</syntaxhighlight> - -эквивалентен этому{{sfn|Рамальо|2016|pp=214—246}}: - -: <syntaxhighlight lang="python"> -def target(): - print('running target()') -target = decorate(target) -</syntaxhighlight> - -Это позволяет сократить использование кода. - -Пример использования декоратора функции{{sfn|Рамальо|2016|pp=214—246}}: - -: <syntaxhighlight lang="pycon"> ->>> def deco(func): -... def inner(): -... print('running inner()') -... return inner -… ->>> @deco -... def target(): -... print('running target()') ->>> target() -running inner() ->>> target -<function deco.<locals>.inner at 0.10063b598> -</syntaxhighlight> - -Существуют декораторы классов{{sfn|Рамальо|2016|pp=686—688}}. - -=== [[Регулярные выражения]] === -Формат регулярных выражений унаследован из [[Perl]] с некоторыми отличиями. Для их использования требуется импортировать модуль <code>re</code><ref>{{Cite web |url=https://docs.python.org/3/library/re.html |title=6.2. re — Regular expression operations — Python 3.5.1 documentation |access-date=2016-05-11 |archive-date=2018-07-18 |archive-url=https://web.archive.org/web/20180718132241/https://docs.python.org/3/library/re.html |url-status=live }}</ref>, являющийся частью стандартной библиотеки. - -== Стандартная библиотека == -[[Файл:Python batteries included.jpg|thumb| Python поставляется «[[Стандартная библиотека Python|с батарейками в комплекте]]». Такую метафору использовали разработчики, чтобы подчеркнуть богатую стандартную библиотеку языка<ref>{{Cite news|title=PEP 206 -- Python Advanced Library|author=A.M. Kuchling|url=https://www.python.org/dev/peps/pep-0206/|website=Python.org|date=14.07.2000|accessdate=2021-04-04|archivedate=2021-05-05|archiveurl=https://web.archive.org/web/20210505003659/https://www.python.org/dev/peps/pep-0206/}}</ref>]] - -Богатая стандартная [[Библиотека (программирование)|библиотека]] является одной из привлекательных сторон Python. Здесь имеются средства для работы со многими [[Протокол передачи данных|сетевыми протоколами]] и форматами [[Интернет]]а, например, модули для написания [[Веб-сервер|HTTP-серверов]] и клиентов, для разбора и создания почтовых сообщений, для работы с [[XML]] и т. п. Набор модулей для работы с [[операционная система|операционной системой]] позволяет писать кросс-платформенные приложения. Существуют модули для работы с [[регулярное выражение|регулярными выражениями]], текстовыми [[кодировка]]ми, [[мультимедиа|мультимедийными]] форматами, [[криптография|криптографическими]] протоколами, архивами, [[Сериализация|сериализации]] данных, поддержка [[Юнит-тестирование|юнит-тестирования]] и др.<ref>{{Cite web|url=https://docs.python.org/3/library/index.html|title=The Python Standard Library|website=Python documentation|access-date=2023-10-09|archive-date=2023-06-06|archive-url=https://web.archive.org/web/20230606041152/https://docs.python.org/3/library/index.html|url-status=live}}</ref> - -Если модулей стандартной библиотеки не хватает, то есть возможность использовать другие каналы получения библиотек. Одним из каналов распространения и обновления пакетов для Python является [[PyPI]] ({{lang-en|Python Package Index}})<ref>{{Cite web|url=https://pypi.org/|title=PyPI · Индекс пакета Python|lang=ru|website=PyPI|access-date=2023-10-09|archive-date=2017-06-03|archive-url=https://web.archive.org/web/20170603211126/https://pypi.org/|url-status=live}}</ref>. - -== Сторонние библиотеки == -{{Основная статья|Сторонние библиотеки Python}} -Здесь перечислены самые популярные библиотеки Python: - -* Искусственный интеллект - [[TensorFlow]] -* Работа с базами данных - [[Сторонние библиотеки Python#Сторонние библиотеки Python|Библиотеки для работы с базами данных]] -* Математические вычисления - [[NumPy]] -* Веб-вычисления - [[Django]] -* Создание игр - [[Pygame]] - -== Примеры программ == -В статье «[[v:Практика по языку Python/Примеры программ на языке Python|Примеры программ на языке Python]]» [[Викиверситет]]а собраны примеры небольших программ, демонстрирующих некоторые возможности языка Python и его стандартной библиотеки. - -Программа «[[Hello, world!|Hello World!]]» может быть написана одной строкой:<syntaxhighlight lang="python3"> -print("Hello World!") -</syntaxhighlight> - -Вычисление [[факториал]]а числа 10 (10!): -<syntaxhighlight lang="python3"> -def factorial(n): - if n < 0: - raise ArithmeticError('Факториал отрицательного числа.') - f = 1 - for i in range (2, n + 1): - f *= i - return f - -print(factorial(10)) # 3628800 - -</syntaxhighlight> - -Реализация с помощью [[рекурсия|рекурсии]]: -<syntaxhighlight lang="python3"> -def factorial(n): - if n < 0: - raise ArithmeticError('Факториал отрицательного числа.') - if n == 0 or n == 1: - return 1 - else: - return factorial(n - 1) * n - -print(factorial(10)) -</syntaxhighlight> - -== Профилирование и оптимизация кода == -В стандартной библиотеке Python имеется [[Профилирование (информатика)|профайлер]] (модуль <code>profile</code>), который можно использовать для сбора статистики о времени работы отдельных функций. Для решения вопроса о том, какой вариант кода работает быстрее, можно использовать модуль <code>timeit</code>. Производимые в следующей программе измерения позволяют выяснить, какой из вариантов [[Конкатенация|конкатенации]] строк более эффективен<ref name=":22">{{Cite web|url=https://wiki.python.org/moin/PythonSpeed/PerformanceTips|title=PythonSpeed/PerformanceTips - Python Wiki|website=wiki.python.org|access-date=2023-10-09|archive-date=2023-10-18|archive-url=https://web.archive.org/web/20231018232415/https://wiki.python.org/moin/PythonSpeed/PerformanceTips|url-status=live}}</ref>: -<syntaxhighlight lang="python"> -from timeit import Timer - -tmp = "Python 3.2.2 (default, Jun 12 2011, 15:08:59) [MSC v.1500 32 bit (Intel)] on win32." - -def case1(): # А. инкрементальные конкатенации в цикле - s = "" - for i in range(10000): - s += tmp - -def case2(): # Б. через промежуточный список и метод join - s = [] - for i in range(10000): - s.append(tmp) - s = "".join(s) - -def case3(): # В. списковое выражение и метод join - return "".join([tmp for i in range(10000)]) - -def case4(): # Г. генераторное выражение и метод join - return "".join(tmp for i in range(10000)) - -for v in range(1,5): - print (Timer("func()","from __main__ import case%s as func" % v).timeit(200)) -</syntaxhighlight> -Как и в любом языке программирования, в Python имеются свои приёмы [[оптимизация (информатика)|оптимизации]] кода. Оптимизировать код можно исходя из различных (часто конкурирующих друг с другом) критериев (увеличение быстродействия, уменьшение объёма требуемой оперативной памяти, компактность исходного кода и т. д.). Чаще всего программы оптимизируют по времени исполнения. - -Здесь есть несколько очевидных для опытных программистов правил<ref name=":22" />. - -* Не нужно оптимизировать программу, если скорость её выполнения достаточна. -* Используемый алгоритм имеет определённую [[Временная сложность алгоритма|временную сложность]], поэтому перед оптимизацией кода программы стоит сначала пересмотреть алгоритм. -* Стоит использовать готовые и отлаженные функции и модули, даже если для этого нужно немного обработать данные. Например, в Python есть встроенная функция <code>sorted()</code>. -* [[Профилирование (информатика)|Профилирование]] поможет выяснить узкие места. Оптимизацию нужно начинать с них. - -Python имеет следующие особенности и связанные с ними правила оптимизации<ref name=":22" />. - -* Вызов функций является достаточно дорогостоящей операцией, поэтому внутри вложенных циклов нужно стараться избегать вызова функций или, например, переносить цикл в функции. Функция, обрабатывающая последовательность, эффективнее, чем обработка той же последовательности в цикле вызовом функции. -* Старайтесь вынести из глубоко вложенного цикла всё, что можно вычислить во внешних циклах. Доступ к локальным переменным более быстрый, чем к глобальным или чем доступ к полям. -* Оптимизатор '''psyco''' может помочь ускорить работу модуля программы при условии, что модуль не использует динамических свойств языка Python. -* В случае, если модуль проводит массированную обработку данных и оптимизация алгоритма и кода не помогает, можно переписать [[Критический участок кода|критические участки]], скажем, на языке Си или Pyrex. - -Инструмент под названием Pychecker<ref>{{Cite web |url=http://pychecker.sourceforge.net/ |title=PyChecker: a python source code checking tool |access-date=2007-02-03 |archive-date=2007-02-02 |archive-url=https://web.archive.org/web/20070202224013/http://pychecker.sourceforge.net/ |url-status=live }}</ref> поможет проанализировать исходный код на Python и выдать рекомендации по найденным проблемам (например, неиспользуемые имена, изменение сигнатуры метода при его перегрузке и т. п.). В ходе такого статического анализа исходного кода могут быть выявлены и ошибки. Pylint<ref>{{Cite web |url=http://www.logilab.org/view?rql=Any%20X%20WHERE%20X%20eid%20857 |title=pylint (analyzes Python source code looking for bugs and signs of poor quality.) (Logilab.org) |access-date=2007-02-03 |archive-date=2007-02-12 |archive-url=https://web.archive.org/web/20070212050018/http://www.logilab.org/view%3Frql%3DAny%2520X%2520WHERE%2520X%2520eid%2520857 |url-status=live }}</ref> призван решать близкие задачи, но имеет уклон в сторону проверки стиля кода, поиска [[код с запашком|кода с запашком]]<ref>{{Cite web|url=https://pylint.readthedocs.io/en/stable/|title=Pylint 3.0.1 documentation|website=pylint.readthedocs.io|access-date=2023-10-09|archive-date=2023-10-18|archive-url=https://web.archive.org/web/20231018232406/https://pylint.readthedocs.io/en/stable/|url-status=live}}</ref>. - -== Сравнение с другими языками == -Выбор языка обычно зависит от решаемых задач, особенностей языков и наличия библиотек, требуемых для решения задачи. Одна и та же задача, написанная на разных языках, может сильно разниться по эффективности исполнения, в том числе различия могут быть и при исполнении в разных операционных системах или при использовании разных компиляторов. В общем случае языки можно поделить на интерпретируемые (скриптовые), компилируемые в промежуточное представление и компилируемые, что влияет на производительность и потребление памяти. Python принято относить к интерпретируемым. Также отдельные языки могут иметь свои сильные стороны, в случае Python выделяется лёгкость в написании программ<ref name=":17" />. - -=== [[C++]] и [[Java]] === -Python сравнивается с C++/Java с точки зрения лаконичности, простоты и гибкости Python<ref name=":11" />. Можно сравнить «[[Hello, world]]»-программы, записанные на каждом из языков<ref name=":11" />. - -{| class="wikitable" -|+ Сравнение программ «Hello, world!» -|- -! C++<ref name=":11" /> !! Java<ref name=":11" /> !! Python<ref name=":11" /> -|- -| <source lang="C++"> -#include <iostream> -int main() { - std::cout << "Hello, world!" << std::endl; - return 0; -} -</source> || <source lang="Java"> -public class HelloClass { - public static void main(String[] args) { - System.out.println("Hello, world!"); - } -} -</source> || <source lang="Python"> -print("Hello, world!") -</source> -|} - -Касательно ООП, в Python, в отличие от C++ и Java, отсутствуют модификаторы доступа к полям и методам класса, атрибуты и поля у объектов могут создаваться на лету в ходе исполнения программы, а все методы являются виртуальными. По сравнению с Java Python позволяет также перегружать операторы, что даёт возможность использовать выражения близкие к естественным<ref name=":11" />. В совокупности подход к ООП в Python упрощает программирование, делает код более понятным и одновременно добавляет гибкости языку<ref name=":11" />. С другой стороны, скорость выполнения кода на Python (как и других интерпретируемых языков) значительно ниже, чем скорость выполнения аналогичного кода на C++<ref>{{Статья|ссылка=https://arxiv.org/pdf/2001.02491.pdf|автор=Pascal Fua, Krzysztof Lis|заглавие=Comparing Python, Go, and C++ on the N-Queens Problem|год=2020|издание=Computer Vision Laboratory, EPFL|access-date=2021-03-02|archive-date=2020-03-12|archive-url=https://web.archive.org/web/20200312235010/https://arxiv.org/pdf/2001.02491.pdf|deadlink=no|archivedate=2020-03-12|archiveurl=https://web.archive.org/web/20200312235010/https://arxiv.org/pdf/2001.02491.pdf}}</ref> и обычно ожидается ниже, чем в Java<ref>{{Cite web|lang=en|url=https://www.python.org/doc/essays/comparisons/|title=Comparing Python to Other Languages|author=Guido van Rossum|website=Python.org|date=1997|archive-url=https://web.archive.org/web/20210316045507/https://www.python.org/doc/essays/comparisons/|archive-date=2021-03-16|access-date=2021-03-16|url-status=live}}</ref>. Код на C++ получается производительнее Python, при этом занимает больше строк. Согласно исследованиям алгоритмов, применяемых в [[Биоинформатика|биоинформатике]], Python показал себя более гибким чем C++, а Java оказалась компромиссным решением между производительностью C++ и гибкостью Python<ref name=":17">{{Статья|ссылка=https://doi.org/10.1186/1471-2105-9-82|автор=Mathieu Fourment, Michael R. Gillings|заглавие=A comparison of common programming languages used in bioinformatics|год=2008|язык=en|издание=BMC Bioinformatics|месяц=02|число=05|том=9|выпуск=1|страницы=82|issn=1471-2105|doi=10.1186/1471-2105-9-82|archiveurl=https://web.archive.org/web/20210319180836/https://bmcbioinformatics.biomedcentral.com/articles/10.1186/1471-2105-9-82|archivedate=2021-03-19|access-date=2021-03-19|deadlink=no}}</ref>. - -В Java и Python все объекты создаются в [[Куча (память)|куче]], в то время как C++ позволяет создавать объекты как в куче, так и на [[Стек вызовов|стеке]], в зависимости от используемого синтаксиса<ref>{{Статья|ссылка=https://www.ncbi.nlm.nih.gov/pmc/articles/PMC3933420/|автор=Muhammad Shoaib Farooq, Sher Afzal Khan, Farooq Ahmad, Saeed Islam, Adnan Abid|заглавие=An Evaluation Framework and Comparative Analysis of the Widely Used First Programming Languages|год=2014|язык=en|издание=PLoS ONE|месяц=02|число=24|том=9|выпуск=2|issn=1932-6203|doi=10.1371/journal.pone.0088941|pmid=24586449|archiveurl=https://web.archive.org/web/20210315195631/https://www.ncbi.nlm.nih.gov/pmc/articles/PMC3933420/|archivedate=2021-03-15|access-date=2021-03-15|deadlink=no}}</ref>. На производительность также влияет способ доступа к данным в памяти. В C++ и Java доступ к данным происходит по постоянным смещениям в памяти, в то время как в Python — через [[Хеш-таблица|хеш-таблицы]]. Использование [[Указатель (тип данных)|указателей]] в C++ может быть довольно сложным для понимания среди новичков, и овладение навыками правильного использования указателей может занять некоторое время<ref name=":17" />. - -=== [[Go]] === -{{Дополнить}} -Go и Python — кардинально различающиеся языки, тем не менее, они часто сравниваются один с другим из-за общей ниши — бэкэнда веб-приложений. По выражению Джейсона Кинкэйда, Go объединяет «производительность и безопасность компилируемых языков, таких как C++, со скоростью разработки на динамических языках, таких как Python»<ref name="AutoNT-94">{{cite news |url=https://techcrunch.com/2009/11/10/google-go-language/ |title=Google's Go: A New Programming Language That's Python Meets C++ |last=Kincaid |first=Jason |date=10 November 2009 |work=TechCrunch |access-date=2010-01-29 |accessdate=2021-02-16 |archivedate=2010-01-18 |archiveurl=https://web.archive.org/web/20100118014358/http://www.techcrunch.com/2009/11/10/google-go-language/ }}</ref>. В какой-то мере это действительно так: Go изначально разработан как строго статически типизированный компилируемый язык, поддерживающий максимум возможностей динамических языков, при котором ещё можно обеспечить эффективную компиляцию и сохранить производительность компилируемых программ. -Общими для обоих языков является использование автоматического управления памятью, наличие встроенных динамических коллекций (массивов и словарей), поддержка срезов, развитый механизм модулей, простой и минималистичный синтаксис. Различий гораздо больше, и не всегда можно однозначно указать, в пользу какого из языков они говорят. - -; Динамические возможности. -: Если Python является полностью динамическим языком и практически любые элементы программы могут меняться во время исполнения, включая конструирование «на лету» новых типов и модификацию существующих, то Go — статический язык с достаточно ограниченными возможностями рефлексии, работающей только в отношении созданных при разработке типов данных. В некоторой мере заменой динамических возможностей в Go является кодогенерация, обеспечиваемая простотой синтаксиса и наличием необходимых инструментов и системных библиотек. Также в Go 1.18 добавили поддержку средств обобщённого программирования (generics)<ref>{{Cite web|lang=en|url=https://go.dev/doc/go1.18|title=Go 1.18 Release Notes - The Go Programming Language|website=go.dev|access-date=2023-05-27|archive-date=2023-05-27|archive-url=https://web.archive.org/web/20230527171309/https://go.dev/doc/go1.18|url-status=live}}</ref>. - -=== [[Perl]] === -Оба языка являются интерпретируемыми, компилируются в промежуточное представление, которое затем отправляется на исполнение. В случае Python генерируется промежуточный байт-код, а компилятор Perl генерирует синтаксическое дерево. Управление памятью в обоих языках автоматическое, а сами языки используются как скриптовые и хорошо подходят для написания веб-приложений. Подход в написания кода Python предполагает лучшее понимание [[Исходный код|листинга программы]] в ущерб производительности, тогда как в Perl больше свободы в синтаксисе, что может привести к тому что программы на Perl становятся нечитабельны для программистов, не работающих с данным языком<ref name=":17" />. - -=== [[MATLAB]] и [[R (язык программирования)|R]] === -{{В планах|дата=2023-02-08}}Python, MATLAB и R используются в обработке данных и в обучении студентов основам математики и статистики. R является языком для выполнения статистических расчётов, в то время как MATLAB может считаться языком программирования наряду с Python<ref>{{Статья|ссылка=http://www.jds-online.com/files/150%E5%AE%8C%E6%88%90V.pdf|автор=Ceyhun Ozgur, Taylor Colliau, Grace Rogers, Zachariah Hughes, Elyse “Bennie” Myer-Tyson|заглавие=MatLab vs. Python vs. R|год=2017|язык=en|издание=Journal of Data Science|том=15|страницы=355—372|issn=1680-743X|archiveurl=https://web.archive.org/web/20210411143915/http://www.jds-online.com/files/150%E5%AE%8C%E6%88%90V.pdf|archivedate=2021-04-11|access-date=2021-04-11|deadlink=no}}</ref>. - -=== Языки, на которые повлиял Python === -Python, как весьма популярный язык программирования, повлиял на следующие языки: -* [[CoffeeScript]] имеет синтаксис, вдохновлённый Python<ref>{{Книга|ссылка=https://archive.org/details/littlebookoncoff0000macc|автор=Alex MacCaw|заглавие=The Little Book on CoffeeScript|ответственный=|год=2012|место=|издательство=O'Reilly|страницы=|страниц=|isbn=9781449321055}}</ref>. -* [[ECMAScript]]/[[JavaScript]] заимствовал итераторы и генераторы из Python<ref name="AutoNT-93">{{cite web |url=http://wiki.ecmascript.org/doku.php?id=proposals:iterators_and_generators |archive-url=https://web.archive.org/web/20071020082650/http://wiki.ecmascript.org/doku.php?id=proposals:iterators_and_generators |url-status=dead|archive-date=2007-10-20 |title=Proposals: iterators and generators [ES4 Wiki&#93; |publisher=wiki.ecmascript.org |access-date=2008-11-24 }}</ref>. -* [[Go]], при сильнейших идеологических различиях, заимствовал у динамических языков, таких как Python, встроенные словари, динамические массивы, срезы. -* [[Groovy]] был создан с мотивацией привнести философию Python на [[Java]]<ref name="AutoNT-95">{{cite web |last=Strachan |first=James |date=2003-08-29 |title=Groovy&nbsp;– the birth of a new dynamic language for the Java platform |url=http://radio.weblogs.com/0112098/2003/08/29.html |access-date=2007-06-11 |archive-url=https://web.archive.org/web/20070405085722/http://radio.weblogs.com/0112098/2003/08/29.html |archive-date=2007-04-05 |url-status=dead}}</ref>. -* [[Julia (язык программирования)|Julia]] была задумана как «такая же пригодная для общего программирования, как и Python»<ref name="Julia">{{cite web| title= Why We Created Julia| date= 2012-02| website= Julia website| url= https://julialang.org/blog/2012/02/why-we-created-julia| access-date= 2014-06-05| quote= We want something as usable for general programming as Python [...]| archive-date= 2020-05-02| archive-url= https://web.archive.org/web/20200502144010/https://julialang.org/blog/2012/02/why-we-created-julia/| url-status= live}}</ref>. -* [[Nim]] использует систему отступов и аналогичный синтаксис<ref>{{cite web |url=https://www.infoworld.com/article/3157745/application-development/nim-language-draws-from-best-of-python-rust-go-and-lisp.html |title=Nim language draws from best of Python, Rust, Go, and Lisp |first=Serdar |last=Yegulalp |date=2017-01-16 |website=InfoWorld |quote=Nim's syntax is strongly reminiscent of Python's, as it uses indented code blocks and some of the same syntax (such as the way if/elif/then/else blocks are constructed). |access-date=2021-02-16 |archive-date=2018-10-13 |archive-url=https://web.archive.org/web/20181013211847/https://www.infoworld.com/article/3157745/application-development/nim-language-draws-from-best-of-python-rust-go-and-lisp.html |url-status=live }}</ref>. -* [[Ruby]] — [[Юкихиро Мацумото]], создатель языка, сказал: «Я хотел скриптовый язык, который был бы более мощным, чем Perl, и более объектно-ориентированным, чем Python. Вот почему я решил создать свой собственный язык»<ref name="linuxdevcenter">{{cite web |url=http://www.linuxdevcenter.com/pub/a/linux/2001/11/29/ruby.html |title=An Interview with the Creator of Ruby |publisher=Linuxdevcenter.com |access-date=2012-12-03 |archive-date=2018-04-28 |archive-url=https://web.archive.org/web/20180428150410/http://www.linuxdevcenter.com/pub/a/linux/2001/11/29/ruby.html |url-status=live }}</ref>. -* [[Swift (язык программирования)|Swift]] во время разработки брал идеи структуры языка из Python, а также из [[Objective-C]], [[Rust (язык программирования)|Rust]], [[Haskell]], [[Ruby]], [[C Sharp|C#]], [[CLU]]<ref>{{cite web |url=http://nondot.org/sabre |title=Chris Lattner's Homepage |publisher=Chris Lattner |first=Chris |last=Lattner |author-link=Chris Lattner |date=2014-06-03 |access-date=2014-06-03 |quote=I started work on the Swift Programming Language in July of 2010. I implemented much of the basic language structure, with only a few people knowing of its existence. A few other (amazing) people started contributing in earnest late in 2011, and it became a major focus for the Apple Developer Tools group in July 2013 [...] drawing ideas from Objective-C, Rust, Haskell, Ruby, Python, C#, CLU, and far too many others to list. |archive-date=2015-12-22 |archive-url=https://web.archive.org/web/20151222150510/http://nondot.org/sabre/ |url-status=live }}</ref>. - -== Критика == - -=== Низкое быстродействие === -Классический Python имеет общий со многими другими [[Интерпретируемый язык программирования|интерпретируемыми языками]] недостаток — сравнительно невысокую скорость выполнения программ<ref name="alioth-benchmark">{{cite web|url=http://shootout.alioth.debian.org/u32/benchmark.php?test=all&lang=python&lang2=gpp&box=1|title=Python / C++ GNU g++|work=Computer Language Benchmarks Game|accessdate=2009-07-01|archiveurl=https://www.webcitation.org/5w4n30Deb?url=http://shootout.alioth.debian.org/u32/benchmark.php?test=all|archivedate=2011-01-28}}</ref>. В некоторой степени ситуацию улучшает кеширование [[байт-код]]а (расширения <code>.pyc</code> и, до версии 3.5, <code>.pyo</code>), которое позволяет интерпретатору не тратить время на синтаксический разбор текста модулей при каждом запуске. - -Существуют реализации языка Python, вводящие высокопроизводительные [[Виртуальная машина|виртуальные машины]] в качестве бэкенда компилятора. Примерами таких реализаций может служить [[PyPy]], базирующийся на RPython, более ранней инициативой является проект [[Parrot]]. Ожидается, что использование виртуальной машины типа [[LLVM]] приведёт к тем же результатам, что и использование аналогичных подходов для реализаций языка Java, где низкая вычислительная производительность в основном преодолена<ref>{{Cite web|lang=en |url=https://arstechnica.com/open-source/news/2009/03/google-launches-project-to-boost-python-performance-by-5x.ars |title=Ars Technica report on Unladen Swallow goals |access-date=2017-10-29 |archive-date=2012-05-01 |archive-url=https://web.archive.org/web/20120501010841/http://arstechnica.com/open-source/news/2009/03/google-launches-project-to-boost-python-performance-by-5x.ars |url-status=live }}</ref>. Однако нельзя забывать, что динамический характер Python делает неизбежными дополнительные накладные расходы при исполнении программ, что ограничивает производительность Python-систем независимо от применяемых технологий. Вследствие этого для написания критических участков кода используются низкоуровневые языки, интеграция с которыми обеспечивается множеством программ и библиотек. - -Тем не менее, Python портирован на некоторые относительно малопроизводительные платформы<ref>{{Cite web|url=http://micropython.org/|title=MicroPython - Python for microcontrollers|lang=en|website=micropython.org|access-date=2023-10-09|archive-date=2014-06-06|archive-url=https://web.archive.org/web/20140606021306/http://micropython.org/|url-status=live}}</ref>. - -=== Глобальная блокировка интерпретатора (GIL) === -[[Файл:GIL description.gif|thumb|250px|Схематичное изображение работы потоков под GIL. Зелёный — поток, удерживающий GIL, красные — блокированные потоки]] -{{main|Global Interpreter Lock}} -Интерпретатор Python в [[CPython]] (а также [[Stackless Python|Stackless]] и [[PyPy]]{{Sfn|Яворски, Зиаде|2021|p=466}}) использует потоко-небезопасные данные, во избежание разрушения которых при совместной модификации из разных потоков применяется глобальная блокировка интерпретатора — GIL (Global Interpreter Lock){{sfn|Palach|2014|pp=16—17}}: в ходе исполнения кода поток интерпретатора блокирует GIL, выполняет в течение фиксированного времени (по умолчанию 5 миллисекунд{{ref+|Значение в секундах можно получить с помощью команды sys.getswitchinterval()<ref>{{Cite web|url=https://docs.python.org/3/library/sys.html#sys.getswitchinterval|title=sys#sys.getswitchinterval()|website=Документация Python|access-date=2021-10-25|archive-date=2021-10-25|archive-url=https://web.archive.org/web/20211025160501/https://docs.python.org/3/library/sys.html#sys.getswitchinterval|url-status=live}}</ref> и изменить во время работы программы с помощью sys.setswitchinterval()<ref>{{Cite web|url=https://docs.python.org/3/library/sys.html#sys.setswitchinterval|title=sys#sys.setswitchinterval()|website=Документация Python|access-date=2021-10-25|archive-date=2021-10-25|archive-url=https://web.archive.org/web/20211025160501/https://docs.python.org/3/library/sys.html#sys.setswitchinterval|url-status=live}}</ref>|К}}) некоторое количество инструкций, после чего освобождает блокировку и приостанавливается, давая возможность работать другим потокам. GIL также освобождается во время ввода-вывода, изменения и проверки состояния синхронизирующих примитивов, при исполнении кода расширений, не обращающихся к данным интерпретатора, например, [[NumPy]]/[[SciPy]]. Таким образом, в каждый момент времени в одном процессе интерпретатора Python может исполняться только один поток кода на Python, независимо от числа доступных процессорных ядер. - -Потери производительности от GIL зависят от характера программ и архитектуры системы. Большинство программ является однопоточными, либо запускает всего несколько потоков, из которых часть в каждый конкретный момент простаивает в ожидании. Персональные компьютеры обычно имеют небольшое количество процессорных ядер, которые загружены параллельно исполняющимися в системе процессами, так что реальные потери производительности на персональных компьютерах из-за GIL невелики. Но в серверных приложениях может быть удобно использовать десятки и сотни (а то и больше) параллельных потоков (например, в системах массового обслуживания, где каждый поток обрабатывает данные для отдельного пользовательского запроса), а серверы на конец 2010-х годов нередко имеют десятки и даже сотни процессорных ядер, то есть технически могут обеспечить этим потокам физически одновременное исполнение; в таких условиях GIL может приводить к действительно значительному снижению общей производительности, так как лишает программу возможности полноценно использовать ресурсы многоядерных систем. - -Гвидо ван Россум говорил, что GIL «не так уж и плох» и он будет в CPython до тех пор, пока «кто-то другой» не представит реализацию Python без GIL, с которой бы однопоточные скрипты работали так же быстро<ref>{{cite web | url=http://mail.python.org/pipermail/python-3000/2007-May/007414.html | author=[[Guido van Rossum]] | title=the future of the GIL | publisher=[http://mail.python.org Python Mailing Lists] | date=2007-05-08 | access-date=2021-03-03 | archive-date=2020-11-09 | archive-url=https://web.archive.org/web/20201109025224/https://mail.python.org/pipermail/python-3000/2007-May/007414.html | url-status=live }}</ref><ref>{{cite web | url=http://www.artima.com/weblogs/viewpost.jsp?thread=214235 | author=Guido van Rossum | title=It isn't Easy to Remove the GIL | publisher=[http://www.artima.com artima.com] | date=2007-09-10 | access-date=2021-03-03 | archive-date=2019-06-06 | archive-url=https://web.archive.org/web/20190606085140/https://www.artima.com/weblogs/viewpost.jsp?thread=214235 | url-status=live }}</ref>. - -В задачи разработки входит работа по оптимизации GIL<ref>{{Cite web |url=http://mail.python.org/pipermail/python-dev/2009-October/093321.html |title=Python-Dev&#93; Reworking the GIL |access-date=2010-12-07 |archive-date=2011-06-10 |archive-url=https://web.archive.org/web/20110610164607/http://mail.python.org/pipermail/python-dev/2009-October/093321.html |url-status=live }}</ref>. Планируется отказ от GIL, есть черновой вариант PEP 703<ref name="автоссылка1">{{Cite web |url=https://peps.python.org/pep-0703 |title=PEP 703 – Making the Global Interpreter Lock Optional in CPython {{!}} peps.python.org<!-- Заголовок добавлен ботом --> |access-date=2023-10-08 |archive-date=2023-10-13 |archive-url=https://web.archive.org/web/20231013135852/https://peps.python.org/pep-0703/ |url-status=live }}</ref>, но на данный момент есть следующие варианты избавления от GIL: -* Вариант интерпретатора с синхронизацией доступа к отдельным объектам вместо глобальной блокировки<ref>{{Cite web |url=http://www.artima.com/weblogs/viewpost.jsp?thread=211200 |title=Python 3000 FAQ |access-date=2007-08-08 |archive-date=2020-11-09 |archive-url=https://web.archive.org/web/20201109015427/https://www.artima.com/weblogs/viewpost.jsp?thread=211200 |url-status=live }}</ref> из-за частых захватов/освобождений блокировок оказался слишком медленным. -* Реализация потоков через процессы ОС, например, модуль multiprocessing<ref>{{Cite web|url=https://docs.python.org/3/library/multiprocessing.html|title=multiprocessing — Process-based parallelism|website=Python documentation|access-date=2023-10-09|archive-date=2023-10-09|archive-url=https://web.archive.org/web/20231009230311/https://docs.python.org/3/library/multiprocessing.html|url-status=live}}</ref>. -* Отказ от совместного использования изменяемых данных и вызовов внешнего кода. При этом данные дублируются в потоках и их синхронизация (если таковая нужна) лежит на программисте<ref>{{Cite web |url=http://perldoc.perl.org/perlthrtut.html |title=perlthrtut — perldoc.perl.org |access-date=2008-04-10 |archive-date=2008-05-22 |archive-url=https://web.archive.org/web/20080522092213/http://perldoc.perl.org/perlthrtut.html |url-status=live }}</ref>. -* Библиотеки, обеспечивающие собственную организацию поддержки потоков. -* Есть черновой PEP по отказу от GIL в CPython<ref name="автоссылка1" /> - -Радикальным вариантом решения проблемы может быть переход на [[Jython]] и [[IronPython]], работающие на виртуальных машинах Java и .NET/Mono: эти реализации вообще не используют GIL. - -=== Синтаксис и семантика === -Несмотря на то, что одним из заявленных принципов дизайна Python является [[Правило наименьшего удивления|принцип наименьшего удивления]], критики отмечают целый ряд архитектурных решений, которые могут вводить в заблуждение или вызывать недоумение у программистов, привыкших к другим распространённым языкам<ref name="pitfalls">{{cite web |title = zephyrfalcon.org :: labs :: 10 Python pitfalls |url = http://zephyrfalcon.org/labs/python_pitfalls.html |archive-url = https://web.archive.org/web/20130810230937/http://zephyrfalcon.org/labs/python_pitfalls.html |archive-date = 2013-08-10 |url-status = dead }}</ref>. В их числе: -* Отличие в принципе работы оператора присвоения по сравнению со статически-типизированными языками. В Python при присвоении значения копируется ссылка на объект, а не значение. При работе с простыми неизменяемыми типами возникает ощущение изменения значения переменной при присваивании ей значения, однако фактически присваивается ссылка на другое значение, например, при увеличении значения переменной типа <code>int</code> на 1 меняется ссылка, а не увеличивается значение по ссылке. Однако при работе с изменяемыми типами их содержимое можно менять по ссылке, поэтому при присвоении одной переменной ссылки на другую и последующем изменении значения в одной из двух переменных оно изменится в обеих переменных, что хорошо заметно при работе со списками<ref name="pitfalls" /><ref>{{Книга|ссылка=https://books.google.ru/books?id=FOVBDAAAQBAJ&pg=SA3-PA35|автор=Reeta Sahoo, Gagan Sahoo|заглавие=Computer Science with Python|год=2016|место=New Delhi|издательство=New Saraswati House India Pvt Ltd|страницы=3.35—3.36|страниц=458|isbn=978-93-5199-980-5|access-date=2021-01-16|archive-date=2021-01-22|archive-url=https://web.archive.org/web/20210122000110/https://books.google.ru/books?id=FOVBDAAAQBAJ&pg=SA3-PA35|deadlink=no}}</ref>. При этом кортежи хоть и являются неизменяемыми, но могут хранить ссылки на изменяемые объекты, поэтому по факту кортежи тоже можно менять<ref>{{Cite web|lang=en|url=http://radar.oreilly.com/2014/10/python-tuples-immutable-but-potentially-changing.html|title=Python tuples: immutable but potentially changing - O'Reilly Radar|author=Luciano Ramalho|website=radar.oreilly.com|date=2014-10-15|publisher=O'Reilly|archiveurl=https://web.archive.org/web/20210116094945/http://radar.oreilly.com/2014/10/python-tuples-immutable-but-potentially-changing.html|archivedate=2021-01-16|accessdate=2021-01-16|url-status=live}}</ref>; -* Отличие в поведении на некоторых типах «сокращённых» операторов, таких как <code>+=</code> и их развёрнутой записи, хотя в большинстве языков «сокращённый» вариант — это просто краткая запись полного, и семантически они абсолютно эквивалентны. Пример с использованием <code>x +=</code>:<syntaxhighlight lang="python3" line="1"> ->>> x = [1, 2] ->>> y = x ->>> x += [3, 4] ->>> x -[1, 2, 3, 4] ->>> y -[1, 2, 3, 4] -</syntaxhighlight>Аналогичный пример с использованием <code>x = x +</code>:<syntaxhighlight lang="python3"> ->>> x = [1, 2] ->>> y = x ->>> x = x + [3, 4] ->>> x -[1, 2, 3, 4] ->>> y -[1, 2] -</syntaxhighlight> -* Жёсткая трактовка лексической области видимости, подобная используемой в JavaScript: даже если переменная получает значение в последней строке функции, её областью видимости является вся функция. -* Путаница между полями класса и полями объекта: текущее значение поля класса инициализирует одноимённое поле объекта, но не при создании объекта, а при первой записи значения в данное поле.<syntaxhighlight lang="python3"> -class Colored: - color = "red" - -obj1 = Colored() -print(obj1.color) # выводится исходное значение поля КЛАССА -Colored.color = "green" # изменение поля КЛАССА -print(obj1.color) # выводится значение поля КЛАССА -obj1.color = "blue" # изменяется поле ОБЪЕКТА и фиксируется его значение -Colored.color = "yellow" # изменение поля КЛАССА, которое уже не отразится на объекте -print(obj1.color) # выводится поле ОБЪЕКТА - -# Скрипт выведет: -red -green -blue -</syntaxhighlight> -: В примере выше три раза выводится поле color объекта obj1 класса Colored. При этом пока не выполнена запись в это поле, выводится текущее значение ''поля класса'', и в третий раз — значение поля объекта. Такое сохранение связи между полем объекта и класса до первой перезаписи может стать причиной неожиданного эффекта: если в программе меняется значение поля класса, то все объекты, одноимённые поля которых ещё не перезаписаны, окажутся неявно изменены. -* Интуитивно трудно предсказуемое поведение параметров со значением-объектом по умолчанию. Если в качестве инициализатора для параметра по умолчанию указать конструктор объекта, это приведёт к созданию статического объекта, ссылка на который и будет передаваться по умолчанию в каждый вызов<ref>{{Cite web|url=https://docs.python.org/3/reference/compound_stmts.html|title=8. Compound statements — Python 3.7.2 documentation|publisher=docs.python.org|accessdate=2019-02-05|archive-date=2019-11-27|archive-url=https://web.archive.org/web/20191127123528/https://docs.python.org/3/reference/compound_stmts.html|url-status=live}}</ref>. Это может повлечь трудно уловимые ошибки. - -=== Невозможность модификации встроенных классов === -{{Дополнить}} -По сравнению с [[Ruby]] и некоторыми другими языками, в Python отсутствует возможность модифицировать встроенные классы<ref>{{Cite web|url=https://docs.python.org/3/library/stdtypes.html|title=Built-in Types|website=Python documentation|access-date=2023-10-09|archive-date=2020-06-14|archive-url=https://web.archive.org/web/20200614194325/https://docs.python.org/3/library/stdtypes.html|url-status=live}}</ref>, такие, как <code>int, str, float, list</code> и другие. - -== Реализации == - -=== CPython === -{{основная статья|CPython}} -CPython является основной реализацией языка. Он написан на [[Си (язык программирования)|языке Си]] и является переносимым на разные платформы. В основе управления памятью лежит использование комбинации счётчиков ссылок и сборщика мусора, ответственного за поиск циклических захватов ссылок<ref name=":18" />. Хотя язык считается интерпретируемым, на самом деле он компилируется в промежуточный высокоуровневый байт-код<ref>{{Cite web|lang=ru|url=https://leanpub.com/insidethepythonvirtualmachine/read|title=Read Inside The Python Virtual Machine {{!}} Leanpub|author=Obi Ike-Nwosu|website=Inside The Python Virtual Machine|publisher=leanpub.com|archive-url=https://web.archive.org/web/20210129122502/https://leanpub.com/insidethepythonvirtualmachine/read|archive-date=2021-01-29|access-date=2021-03-23|url-status=live}}</ref><ref name=":19" />, который затем исполняется через стековую виртуальную машину<ref name=":18" />. Например, вызов функции <code>print()</code> может быть представлен в следующем виде<ref name=":19">Получено с помощью <code>dis.dis('print("Hello World!")')</code>.</ref>: - -<syntaxhighlight lang="asm"> - 0 0 RESUME 0 - 1 2 PUSH_NULL - 4 LOAD_NAME 0 (print) - 6 LOAD_CONST 0 ('Hello World!') - 8 PRECALL 1 - 12 CALL 1 - 22 RETURN_VALUE - -</syntaxhighlight> - -Имена в языке имеют позднее связывание, в результате чего можно писать обращения к переменным, методам и атрибутам, которых ещё нет, но они должны быть объявлены на момент исполнения кода, использующего их. Каждый объект в Python имеет словарь, представленный хеш-таблицей, через который происходит сопоставление названий атрибутов их значениям. Глобальные переменные также сопоставляются через словарь. Одно обращение к методу или атрибуту может сопровождаться поочерёдным поиском в нескольких словарях<ref name=":18" />. -=== PyPy === -{{Основная статья|PyPy}} -PyPy — реализация Python, написанная на [[RPython]] (подмножество Python, имеющее намного меньше динамических возможностей). Позволяет легко проверять новые возможности. В PyPy, кроме стандартного CPython, включены возможности [[Stackless Python|Stackless]], [[Psyco]], модификация [[Абстрактное синтаксическое дерево|AST]] «на лету» и многое другое. В проект интегрированы возможности анализа Python-кода и трансляция в другие языки и [[байт-код]]ы виртуальных машин ([[Си (язык программирования)|Си]], [[LLVM]], [[Javascript]], .NET с версии 0.9.9). Начиная с 0.9.0, возможна полностью автоматическая трансляция RPython в Си, в результате чего достигается скорость, приемлемая для использования (в 2—3 раза ниже, чем CPython при отключённом [[JIT]] для версии 0.9.9). По умолчанию PyPy поставляется со встроенным JIT-компилятором, с помощью которого он способен работать намного быстрее, чем CPython. - -=== Jython === -{{В планах|дата=2023-02-08}}{{Основная статья|Jython}} -Jython — реализация Python, компилирующая код на Python в [[Байт-код Java|байт-код]] [[Java]], который может быть выполнен [[JVM]]. Также может использоваться для импорта [[Класс (программирование)|класса]], исходный код которого был написан на Java в качестве модуля для Python{{sfn|К. Рейт, Т. Шлюссер|2017|p=23}}. - -=== Другие реализации === -Существуют также другие реализации. -* {{iw|Numba}} — Jit-компилятор на основе LLVM с поддержкой NumPy. -* [[PyS60]]<ref name="PyS60" /> — реализация языка для [[смартфон]]ов фирмы [[Nokia]] на платформе [[Symbian S60|Series 60]]. Не поддерживается -* [[IronPython]] — Python для [[.NET Framework]] и [[Mono]]. Компилирует Python программы в [[MSIL]], таким образом предоставляя полную интеграцию с .NET-системой<ref>{{Cite web |url=http://www.codeplex.com/Wiki/View.aspx?ProjectName=IronPython |title=IronPython |access-date=2007-07-24 |archive-date=2006-08-18 |archive-url=https://web.archive.org/web/20060818015745/http://www.codeplex.com/Wiki/View.aspx?ProjectName=IronPython |url-status=live }}</ref>. -* [[Stackless Python|Stackless]] — также написанная на Си реализация Python. Это не полноценная реализация, а [[патч]]и к CPython. Предоставляет расширенные возможности многопоточного программирования и значительно большую глубину [[рекурсия|рекурсии]]. -* [[Python for .NET]]<ref>{{Cite web |url=http://pythonnet.sourceforge.net/ |title=Python for .NET |access-date=2007-02-10 |archive-date=2007-02-16 |archive-url=https://web.archive.org/web/20070216184915/http://pythonnet.sourceforge.net/ |url-status=live }}</ref> — ещё одна реализация Python для .NET. В отличие от IronPython эта реализация не компилирует Python код в MSIL, а только предоставляет интерпретатор, написанный на [[C Sharp|C#]]. Позволяет использовать .NET-сборки из Python кода. -* [[Jython]] — реализация Python, использующая [[JVM]] в качестве среды исполнения. Позволяет прозрачно использовать [[Java]]-библиотеки. -* [[TinyPy]]<ref>{{Cite web |url=http://www.tinypy.org/ |title=tinypy |access-date=2008-08-21 |archive-date=2008-09-18 |archive-url=https://web.archive.org/web/20080918042926/http://www.tinypy.org/ |url-status=live }}</ref> — минималистическая версия Python. Часть возможностей CPython не реализована. -* [[MicroPython]] — реализация Python 3 для встроенных систем с малым объёмом оперативной памяти<ref>{{Cite web |url=http://micropython.org/ |title=MicroPython |access-date=2014-06-04 |archive-date=2014-06-06 |archive-url=https://web.archive.org/web/20140606021306/http://micropython.org/ |url-status=live }}</ref>. -* [[Brython]]<ref>{{Cite web|url = http://www.brython.info/|title = Сайт проекта Brython|author = |date = |publisher = |access-date = 2014-11-06|archive-date = 2014-10-20|archive-url = https://web.archive.org/web/20141020083048/http://www.brython.info/|url-status = live}}</ref> — реализация языка на клиентском JavaScript, позволяющая писать браузерные скрипты на Python 3. -* [[QPython]]<ref>{{Cite web|url = http://qpython.com/|title = Сайт проекта QPython|access-date = 2015-02-03|archive-date = 2015-02-04|archive-url = https://web.archive.org/web/20150204000601/http://qpython.com/|url-status = live}}</ref> — реализация Python для Android. Проект всё ещё на стадии тестирования, однако на QPython уже портированы некоторые самые необходимые библиотеки. Позволяет и работать в интерактивном режиме. Существует также Qpython3. - -== Специализированные подмножества/расширения Python == -На основе Python было создано несколько специализированных подмножеств языка, в основном предназначенных для статической компиляции в машинный код. Некоторые из них перечислены ниже. -* [[RPython]]<ref>{{Cite web |url=http://codespeak.net/pypy/dist/pypy/doc/coding-guide.html |title=PyPy[coding-guide&#93; |accessdate=2007-07-24 |archiveurl=https://web.archive.org/web/20070707005837/http://codespeak.net/pypy/dist/pypy/doc/coding-guide.html#restricted-python |archivedate=2007-07-07 |url-status=dead }}</ref> — созданная в рамках проекта [[PyPy]] сильно ограниченная реализация Python без динамизма времени исполнения и некоторых других возможностей. Код на RPython можно компилировать во множество других языков/платформ — C, JavaScript, Lisp, .NET<ref>{{Cite web |url=http://codespeak.net/pypy/dist/pypy/doc/carbonpython.html |title=PyPy carbonpython |accessdate=2007-07-24 |archiveurl=https://web.archive.org/web/20070912131432/http://codespeak.net/pypy/dist/pypy/doc/carbonpython.html |archivedate=2007-09-12 |url-status=dead }}</ref>, [[LLVM]]. На RPython написан интерпретатор PyPy. -* [[Cython]]<ref>{{Cite web |url=http://www.cython.org/ |title=Cython: C-Extensions for Python |access-date=2007-07-28 |archive-date=2007-08-11 |archive-url=https://web.archive.org/web/20070811093728/http://www.cython.org/ |url-status=live }}</ref> — ограниченная реализация Python, но несколько меньше, чем RPython. [[Cython]] расширен возможностями статической типизации типами из языка C и позволяет свободно смешивать типизированный и не типизированный код. Предназначен для написания модулей расширений, компилируется в код на языке C. -* [[Nuitka]]<ref>{{Cite web|url=https://nuitka.net/|title=Nuitka the Python Compiler — Nuitka the Python Compiler documentation|website=nuitka.net|access-date=2023-10-09|archive-date=2022-09-03|archive-url=https://web.archive.org/web/20220903042758/https://nuitka.net/|url-status=live}}</ref> — Позволяет транслировать весь код Python в код [[Си (язык программирования)|Си]] или в исполняемые файлы. - -== Инструменты поддержки программирования == - -=== Интерактивный режим === -Подобно [[Лисп|Lisp]] и [[Пролог (язык программирования)|Prolog]], Python может использоваться в интерактивном режиме, при котором введённые с клавиатуры операторы сразу же выполняются, а результат выводится на экран ([[REPL]]). Этот режим удобен как при изучении языка, так и в процессе профессиональной разработки — для быстрого тестирования отдельных фрагментов кода, — так как обеспечивает немедленную обратную связь. Также он позволяет использовать интерпретатор в качестве [[калькулятор]]а с большим набором функций. -* Эталонная реализация Python имеет встроенный интерактивный интерпретатор, работающий в режиме текстового терминала и позволяющий выполнять все основные операции. В интерактивном режиме доступен [[отладчик]] <code>pdb</code> и система помощи (вызывается по <code>help()</code>), работающая для всех модулей, классов и функций, которые содержат строки документации: -: <source lang="python3"> ->>> from math import * # импорт математических функций ->>> help(cos) # помощь по функции cos -Help on built-in function cos in module math: - -cos(x, /) - Return the cosine of x (measured in radians). -</source> -* [[IPython]]<ref>{{Cite web |url=http://ipython.scipy.org/ |title=Архивированная копия |accessdate=2006-06-01 |archiveurl=https://web.archive.org/web/20180804135112/http://ipython.scipy.org/ |archivedate=2018-08-04 |url-status=dead }}</ref> — выходящая под [[лицензия BSD|BSD-лицензией]] кросс-платформенная интерактивная оболочка, предоставляющая расширенную интроспекцию и дополнительные команды. В частности, позволяет передавать исполняемому коду на Python результаты выполнения команд системной командной оболочки. Поддерживает подсветку кода и автоматическое дополнение. -* [[BPython]]<ref>{{Cite web |url=http://www.bpython-interpreter.org/ |title=bpython interpreter |access-date=2011-02-17 |archive-date=2011-05-11 |archive-url=https://web.archive.org/web/20110511020421/http://bpython-interpreter.org/ |url-status=live }}</ref> — расширение стандартной командной оболочки Python с помощью ряда дополнительных модулей. Реализует подсветку синтаксиса, автоматическое дополнение кода с предложением вариантов, автоматическое выравнивание, интеграция с [[Pastebin]], сохранение ввода в файл, восстановление удалённой строки, предложение параметров для функций. - -Почти все IDE для Python поддерживают [[REPL]] для быстрого тестирования. - -=== IDE === -[[Файл:Python's IDLE.png|мини|[[IDLE]]]] -Существует несколько специализированных [[Интегрированная среда разработки|IDE]] для разработки на Python. -* [[Eric]] — полнофункциональный редактор Python и IDE, написанный на Python. Он базируется на кросс-платформенном фреймворке [[Qt]], в качестве компонента редактирования используется [[Scintilla|QScintilla]]. Eric предоставляет возможности ведения проектов, отладки, профилирования, рефакторинга кода, взаимодействия с популярными системами управления версиями, такими как [[Subversion]] и [[Git]]. Расширяется через механизм плагинов. Репозиторий плагинов доступен прямо из среды разработки. Распространяется бесплатно, [[GNU General Public License#GPL v3|лицензия GNU GPL v3]]. -* [[PyCharm]] — полнофункциональная IDE для Python от [[JetBrains]], доступна на платформах Windows, macOS и Linux, существует в бесплатном (Community) и платном (Professional) вариантах. -* {{Не переведено|Wing IDE|Wing IDE}} — линейка Python-IDE от американской фирмы [[Wingware]], включает три варианта: «Wing 101», «Wing Personal», «Wing Pro», из которых первые два бесплатны, последний — платный. Версия Pro обладает всеми необходимыми средствами для профессиональной разработки, включая поддержку проектов, работу с системами управления версиями, расширенные возможности навигации по коду и анализа кода, рефакторинг, поддержка использования [[Django]]. Бесплатные версии предоставляют меньше функций и не выходят за пределы возможностей, доступных в других бесплатных IDE для Python. -* [[Spyder (IDE)|Spyder]] — open-source IDE для Python под [[лицензия MIT|лицензией MIT]], бесплатная, доступна на платформах Windows, Mac OS X и Linux. Особенностью является то, что IDE ориентирована на [[data science]], в ней удобно работать с библиотеками типа SciPy, NumPy, Matplotlib. Spyder поставляется в комплекте с менеджером пакетов [[Anaconda (инсталлятор)|Anaconda]]. В целом обладает качествами стандартной IDE, имеет редактор с подсветкой синтаксиса, автоматическое дополнение кода, обозреватель документации. -* [[Thonny]] — многоплатформенная бесплатная IDE, выпускается под [[лицензия MIT|лицензией MIT]], поддерживается Институтом информатики [[Тартуский университет|Тартуского университета]] в [[Эстония|Эстонии]]. Позиционируется как «Python IDE для новичков», полностью, включая интерпретатор Python, ставится «из коробки» пользователем без административных прав, сразу после установки может использоваться без дополнительных настроек. Предназначена для обучения, имеет улучшенную визуализацию порядка вычисления выражений и вызова функций, динамическую подсветку синтаксических ошибок, простой менеджер пакетов. Для профессионального применения возможностей недостаточно, например, нет поддержки проектов и интеграции с [[Система управления версиями|системами управления версиями]]. -* [[IDLE]]<ref>{{Cite web|url=https://docs.python.org/3/library/idle.html|title=IDLE|website=Python documentation|access-date=2023-10-09|archive-date=2020-06-04|archive-url=https://web.archive.org/web/20200604195234/https://docs.python.org/3/library/idle.html|url-status=live}}</ref> — Встроенный в Python IDE. Очень простой и малофункциональный. - -Помимо этого, существуют плагины для поддержки программирования на Python для универсальных IDE [[Eclipse (среда разработки)|Eclipse]]<ref>{{Cite web|url=https://marketplace.eclipse.org/content/pydev-python-ide-eclipse|title=PyDev - Python IDE for Eclipse|lang=en|website=Eclipse Plugins, Bundles and Products - Eclipse Marketplace|access-date=2023-10-09|archive-date=2023-10-18|archive-url=https://web.archive.org/web/20231018232415/https://marketplace.eclipse.org/content/pydev-python-ide-eclipse|url-status=live}}</ref>, [[KDevelop]]<ref>{{Cite web|url=https://apps.kde.org/kdev-python/|title=KDevelop Python Support|lang=en|website=KDE Applications|access-date=2023-10-09|archive-date=2023-10-04|archive-url=https://web.archive.org/web/20231004024833/https://apps.kde.org/kdev-python/|url-status=live}}</ref>, [[Visual Studio Code]]<ref>{{Cite web|url=https://code.visualstudio.com/docs/languages/python|title=Python in Visual Studio Code|lang=en|website=code.visualstudio.com|access-date=2023-10-09|archive-date=2023-10-18|archive-url=https://web.archive.org/web/20231018232410/https://code.visualstudio.com/docs/languages/python|url-status=live}}</ref> и [[Microsoft Visual Studio]]<ref>{{Cite web|url=https://visualstudio.microsoft.com/vs/features/python/|title=Visual Studio Python IDE - Python Development Tools for Windows|lang=en-US|website=Visual Studio|access-date=2023-10-09|archive-date=2023-10-02|archive-url=https://web.archive.org/web/20231002182149/https://visualstudio.microsoft.com/vs/features/python/|url-status=live}}</ref>, а также имеется поддержка подсветки синтаксиса, авто дополнения кода и подключения средств отладки и запуска приложений для целого ряда распространённых текстовых редакторов. - -== Применение == -[[Файл:Python Powered.png|thumb|Python Powered]] -Python — стабильный и распространённый язык. Он используется во многих проектах и в различных качествах: как основной язык программирования или для создания расширений и интеграции приложений. На Python реализовано большое количество проектов, также он активно используется для создания прототипов будущих программ. - -Python является лёгким в изучении языком, и часто изучается как первый язык<ref name=":2" />, в том числе используется при обучении детей программированию<ref>{{статья|автор=Васильев Денис Алексеевич|заглавие=Методические особенности изучения языка Python школьниками|издание=Символ науки|год=2017|ссылка=https://cyberleninka.ru/article/n/metodicheskie-osobennosti-izucheniya-yazyka-python-shkolnikami|номер=1|archivedate=2021-07-21|archiveurl=https://web.archive.org/web/20210721012157/https://cyberleninka.ru/article/n/metodicheskie-osobennosti-izucheniya-yazyka-python-shkolnikami}}</ref>. Как первый язык он хорошо подходит, поскольку программы на нём близки к естественному языку, на котором люди привыкли думать, а для написания корректной программы требуется минимальное количество ключевых слов. В других же языках, таких как [[C++]], существует большое количество различных синтаксических конструкций и элементов языка, которым приходится уделять внимание вместо изучения алгоритмов<ref name=":11">{{Статья|ссылка=https://iopscience.iop.org/article/10.1088/1742-6596/423/1/012027|автор=A Bogdanchikov, M Zhaparov, R Suliyev|заглавие=Python to learn programming|год=2013-04-10|язык=en|издание=Journal of Physics: Conference Series|месяц=04|число=10|том=423|страницы=012027|issn=1742-6588, 1742-6596|doi=10.1088/1742-6596/423/1/012027|access-date=2021-03-01|archive-date=2021-06-09|archive-url=https://web.archive.org/web/20210609072244/https://hkvalidate.perfdrive.com/?ssa=7e557f91-2a23-4954-9336-4d6aa8eff543&ssb=13723216276&ssc=https%3A%2F%2Fiopscience.iop.org%2Farticle%2F10.1088%2F1742-6596%2F423%2F1%2F012027&ssi=68a9da23-8427-477c-a539-9f5448a945ec&ssk=support@shieldsquare.com&ssm=42114570057895697108641720190350&ssn=b37115f7a9ef8f78371ddc2fc86e93ac7b7d49c27ea8-1bd1-433f-87f254&sso=a8f8ae2a-7b96902d3b52ffbb038f39585ed097cd097eb09d11627f2d&ssp=97250498481623231227162323594126397&ssq=71610532336343094416123363660343109120417&ssr=MjA3LjI0MS4yMjUuMTU4&sst=Mozilla/5.0%20(Windows%20NT%2010.0;%20Win64;%20x64)%20AppleWebKit/537.36%20(KHTML,%20like%20Gecko)%20Chrome/74.0.3729.169%20Safari/537.36&ssv=&ssw=|deadlink=no|archiveurl=https://web.archive.org/web/20210609072244/https://hkvalidate.perfdrive.com/?ssa=7e557f91-2a23-4954-9336-4d6aa8eff543&ssb=13723216276&ssc=https%3A%2F%2Fiopscience.iop.org%2Farticle%2F10.1088%2F1742-6596%2F423%2F1%2F012027&ssi=68a9da23-8427-477c-a539-9f5448a945ec&ssk=support%40shieldsquare.com&ssm=42114570057895697108641720190350&ssn=b37115f7a9ef8f78371ddc2fc86e93ac7b7d49c27ea8-1bd1-433f-87f254&sso=a8f8ae2a-7b96902d3b52ffbb038f39585ed097cd097eb09d11627f2d&ssp=97250498481623231227162323594126397&ssq=71610532336343094416123363660343109120417&ssr=MjA3LjI0MS4yMjUuMTU4&sst=Mozilla%2F5.0%20%28Windows%20NT%2010.0%3B%20Win64%3B%20x64%29%20AppleWebKit%2F537.36%20%28KHTML%2C%20like%20Gecko%29%20Chrome%2F74.0.3729.169%20Safari%2F537.36&ssv=&ssw=}}</ref>. - -Являясь приложением с открытым исходным кодом, интерпретатор Python используется по всему миру и поставляется в составе операционных систем на базе Linux, а также в компьютерах от фирмы [[Apple]]. Python популярен среди индивидуальных разработчиков, но также используется крупными компаниями в достаточно серьёзных продуктах, ориентированных на получение прибыли<ref name=":0" />. На Python написан [[Reddit]]<ref name=":7" /> и Youtube<ref>{{Cite web|url=https://python.plainenglish.io/a-jr-programmer-asked-me-why-google-and-youtube-use-python-f472baf1bab2|title=A Jr Programmer Asked Me Why Google and YouTube Use Python|lang=en|first=Josef|last=Cruz|website=Medium|date=2022-06-07|access-date=2023-10-09|archive-date=2022-06-11|archive-url=https://web.archive.org/web/20220611083439/https://python.plainenglish.io/a-jr-programmer-asked-me-why-google-and-youtube-use-python-f472baf1bab2|url-status=live}}</ref>. В [[Dropbox]]<ref>{{Cite web|url=https://blog.dropbox.com/topics/company/thank-you--guido|title=Thank you, Guido|lang=en|website=blog.dropbox.com|access-date=2023-10-09|archive-date=2021-02-16|archive-url=https://web.archive.org/web/20210216114908/https://blog.dropbox.com/topics/company/thank-you--guido|url-status=live}}</ref> также активно применяется Python, а из-за сложностей динамической типизации и огромного количества кода компания перешла к статической типизации с помощью открытого проекта Mypy<ref>{{Cite web|lang=en|url=https://dropbox.tech/application/our-journey-to-type-checking-4-million-lines-of-python|title=Our journey to type checking 4 million lines of Python|author=Jukka Lehtosalo|website=dropbox.tech|date=2019-09-05|publisher=Dropbox|archiveurl=https://web.archive.org/web/20200922204821/https://dropbox.tech/application/our-journey-to-type-checking-4-million-lines-of-python|archivedate=2020-09-22|accessdate=2020-09-22|url-status=live}}</ref> Также Python активно используется в [[Facebook]]<ref>{{Cite web |url=https://code.facebook.com/posts/1040181199381023/python-in-production-engineering/ |title=Python in production engineering |access-date=2017-01-21 |archive-date=2017-02-02 |archive-url=https://web.archive.org/web/20170202121734/https://code.facebook.com/posts/1040181199381023/python-in-production-engineering/ |url-status=live }}</ref> и [[Instagram]]<ref>{{Cite web |url=https://engineering.instagram.com/what-powers-instagram-hundreds-of-instances-dozens-of-technologies-adf2e22da2ad |title=What Powers Instagram: Hundreds of Instances, Dozens of Technologies |access-date=2017-01-21 |archive-date=2021-06-09 |archive-url=https://web.archive.org/web/20210609072246/https://instagram-engineering.com/what-powers-instagram-hundreds-of-instances-dozens-of-technologies-adf2e22da2ad?gi=7a31ad142d3 |url-status=live }}</ref>. Многие компании используют Python для тестирования аппаратного обеспечения, среди этих компаний значатся [[Intel]], [[Cisco]], [[Hewlett-Packard]] и [[IBM]]. [[Industrial Light & Magic]] и [[Pixar]] используют его при создании анимационных фильмов<ref name=":0" />. - -Язык активно используется компанией [[Google (компания)|Google]] в её поисковой системе, а [[YouTube|Youtube]] в значительной степени написан с использованием Python<ref name=":0">{{Книга|ссылка=https://books.google.ru/books?id=1HxWGezDZcgC&pg=PA8|автор=Mark Lutz|заглавие=Learning Python: Powerful Object-Oriented Programming|год=2009-10-06|язык=en|издательство=O'Reilly Media, Inc.|страницы=7—8|страниц=1218|isbn=978-1-4493-7932-2|access-date=2020-09-21|archive-date=2021-04-10|archive-url=https://web.archive.org/web/20210410140715/https://books.google.ru/books?id=1HxWGezDZcgC&pg=PA8|deadlink=no}}</ref><ref>{{cite web |url = https://opensource.googleblog.com/2017/01/grumpy-go-running-python.html |title = Grumpy: Go running Python! |archive-url = https://web.archive.org/web/20170120051915/https://opensource.googleblog.com/2017/01/grumpy-go-running-python.html |archive-date = 2017-01-20 }} — статья в Google Open Source Blog</ref>. Кроме того, Google спонсирует разработку Python с 2010 года<ref name=":20">{{Cite news|title=Google recommits to the Python ecosystem|author=Christina Cardoza|url=https://sdtimes.com/softwaredev/google-recommits-to-the-python-ecosystem/|website=SD Times|date=12.02.2021|accessdate=2021-04-04|archivedate=2021-02-25|archiveurl=https://web.archive.org/web/20210225035350/https://sdtimes.com/softwaredev/google-recommits-to-the-python-ecosystem/}}</ref><ref>{{Cite news|title=Welcoming Google as a Visionary Sponsor of the PSF|url=https://pyfound.blogspot.com/2021/02/welcoming-google-as-visionary-sponsor.html|website=News from the Python Software Foundation|date=11.02.2021|accessdate=2021-04-04|archivedate=2021-04-09|archiveurl=https://web.archive.org/web/20210409073556/https://pyfound.blogspot.com/2021/02/welcoming-google-as-visionary-sponsor.html}}</ref>, и поддержку [[PyPI]], основной системы распространения пакетов для Python<ref name=":20" /><ref>{{Cite news|title=Google Cloud финансирует экосистему Python|url=https://www.osp.ru/articles/2021/0302/13055821|website=Издательство «Открытые системы»|date=02.03.2021|accessdate=2021-04-04|archivedate=2021-06-09|archiveurl=https://web.archive.org/web/20210609072356/https://www.osp.ru/articles/2021/0302/13055821}}</ref>. - -Сильными сторонами Python являются его модульность и возможность интегрироваться с другими языками программирования, в том числе в составе сложных комплексных приложений и систем<ref>{{Статья|ссылка=https://www.frontiersin.org/articles/10.3389/fninf.2015.00011/full|автор=Eilif Muller, James A. Bednar, Markus Diesmann, Marc-Oliver Gewaltig, Michael Hines|заглавие=Python in neuroscience|год=2015|язык=en|издание=Frontiers in Neuroinformatics|месяц=04|число=14|том=9|issn=1662-5196|doi=10.3389/fninf.2015.00011|archiveurl=https://web.archive.org/web/20201130064502/https://www.frontiersin.org/articles/10.3389/fninf.2015.00011/full|archivedate=2020-11-30|access-date=2021-03-01|deadlink=no}}</ref>. Сочетание простоты и лаконичности с большим количеством возможностей делает Python удобным в качестве [[Скриптовые языки|скриптового языка]]{{Нет АИ|30|03|2021}}. Многие проекты предоставляют прикладной интерфейс программирования на Python для написания скриптов, например, среды 3D-моделирования [[Autodesk Maya]]<ref name=":0" />, [[Blender]]<ref>{{Cite web|lang=en|url=https://docs.blender.org/manual/en/latest/advanced/scripting/introduction.html|title=Scripting & Extending Blender : Introduction|website=Blender Manual|publisher=Blender|archiveurl=https://web.archive.org/web/20200921203043/https://docs.blender.org/manual/en/latest/advanced/scripting/introduction.html|archivedate=2020-09-21|accessdate=2020-09-21|url-status=live}}</ref> и [[Houdini (графическая программа)|Houdini]]<ref>{{Cite web|lang=en|url=https://www.sidefx.com/docs/houdini/hom/index.html|title=Python Scripting|website=www.sidefx.com|accessdate=2020-09-27|archive-date=2020-09-29|archive-url=https://web.archive.org/web/20200929134233/https://www.sidefx.com/docs/houdini/hom/index.html|url-status=live}}</ref>, а также свободная геоинформационная система [[QGIS]]<ref>{{Cite web|lang=en|url=https://gis.ucar.edu/building-plugin-qgis|title=Building a plugin for QGIS|website=Geographic Informations Systems (GIS) Program|publisher=National Center for Atmospheric Research|archiveurl=https://web.archive.org/web/20200923160619/https://gis.ucar.edu/building-plugin-qgis|archivedate=2020-09-23|accessdate=2020-09-23|url-status=live}}</ref>. Некоторые проекты реализуют базовую часть на более производительных языках программирования, а для упрощения работы предоставляют полноценный интерфейс прикладного программирования на Python{{Нет АИ|30|03|2021}}. Так, движок свободного [[видеоредактор]]а [[OpenShot Video Editor|OpenShot]] реализован в виде библиотеки ''libopenshot'', написанной на C++ с использованием библиотек на Си, а все возможности полностью покрыты прикладным интерфейсом программирования Python<ref>{{Cite web|lang=en|url=https://www.kickstarter.com/projects/421164014/openshot-video-editor-for-windows-mac-and-linux|title=OpenShot Video Editor for Windows, Mac, and Linux|author=Jonathan Thomas|date=2020-03-04|publisher=[[Kickstarter]]|archiveurl=https://web.archive.org/web/20200923172045/https://www.kickstarter.com/projects/421164014/openshot-video-editor-for-windows-mac-and-linux/description|archivedate=2020-09-23|accessdate=2020-09-23|url-status=live}}</ref>{{Значимость факта?}}. [[Агентство национальной безопасности США]] использует Python для анализа данных, а [[NASA]] использует его при выполнении научных задач<ref name=":0" />. Из инструментов, используемых в NASA, можно отметить свободный графический симулятор сети {{Не переведено 5|GNS3|3=en|4=Graphical Network Simulator-3}}, который также хорошо зарекомендовал себя в корпоративной среде и используется в технологических компаниях, например, в [[Intel]]<ref>{{Cite web|lang=en-US|url=https://fedoramagazine.org/using-gns3-with-fedora/|title=Using GNS3 with Fedora|website=Fedora Magazine|date=2019-08-28|accessdate=2020-09-22|archive-date=2020-10-01|archive-url=https://web.archive.org/web/20201001161823/https://fedoramagazine.org/using-gns3-with-fedora/|url-status=live}}</ref>. На Python написана также свободная популярная программа нарезки 3D моделей для печати на 3D-принтерах [[Cura]]<ref>{{Cite web |url=https://github.com/Ultimaker/Cura |title=Ultimaker Cura GitHub |access-date=2020-09-19 |archive-date=2020-09-17 |archive-url=https://web.archive.org/web/20200917042356/https://github.com/Ultimaker/Cura |url-status=live }}</ref><ref>{{Cite web|lang=en|url=https://all3dp.com/1/best-3d-slicer-software-3d-printer/|title=2020 Best 3D Printer Slicer Software|author=natol Locker|website=All3DP|date=2020-01-02|publisher=|accessdate=2020-09-24|quote=The list is sorted by popularity (via Alexa rank)|archive-date=2020-08-13|archive-url=https://web.archive.org/web/20200813221813/https://all3dp.com/1/best-3d-slicer-software-3d-printer/|url-status=live}}</ref>. - -Python с пакетами [[NumPy]], [[SciPy]] и [[Matplotlib|MatPlotLib]] активно используется как универсальная среда для научных расчётов в качестве замены распространённым специализированным коммерческим пакетам, таким как [[Matlab]], предоставляя аналогичную функциональность и более низкий порог вхождения<ref>{{Статья|ссылка=https://www.frontiersin.org/articles/10.3389/neuro.11.005.2009/full|автор=Peter Jurica, Cees Van Leeuwen|заглавие=OMPC: an open-source MATLAB®-to-Python compiler|год=2009|язык=English|издание=Frontiers in Neuroinformatics|том=3|issn=1662-5196|doi=10.3389/neuro.11.005.2009|access-date=2020-09-29|archive-date=2020-11-29|archive-url=https://web.archive.org/web/20201129111400/https://www.frontiersin.org/articles/10.3389/neuro.11.005.2009/full|deadlink=no|archivedate=2020-11-29|archiveurl=https://web.archive.org/web/20201129111400/https://www.frontiersin.org/articles/10.3389/neuro.11.005.2009/full}}</ref>. По большей части на Python написана также графическая программа {{Нп3|Veusz|4=Veusz}}<ref>{{Cite web|lang=en|url=https://veusz.github.io/development/|title=Veusz Development|website=Veusz|publisher=Github Pages|archiveurl=https://web.archive.org/web/20201002203816/https://veusz.github.io/development/|archivedate=2020-10-02|accessdate=2020-10-02|url-status=live}}</ref>, позволяющая создавать качественные графики, готовые для размещения в научных публикациях<ref>{{публикация|1=книга|ссылка=https://www.oryxthejournal.org/writing-for-conservation-guide|автор=Fisher, M.|заглавие=Writing for Conservation|год=2019|часть=Plot with a purpose|ссылка часть=https://www.oryxthejournal.org/writing-for-conservation-guide/plot-with-a-purpose.html|язык=en|издательство=Fauna & Flora International, Cambridge|часть архив=https://web.archive.org/web/20201002201841/https://www.oryxthejournal.org/writing-for-conservation-guide/plot-with-a-purpose.html|часть архив дата=2020-10-02|архив дата=2020-11-01|архив=https://web.archive.org/web/20201101045131/https://www.oryxthejournal.org/writing-for-conservation-guide/}}</ref>{{Значимость факта?}}. Библиотека [[Astropy]] — популярный инструмент для астрономических расчётов<ref>{{публикация|статья|ссылка=https://iopscience.iop.org/article/10.3847/1538-3881/aabc4f/pdf|автор=The Astropy Collaboration, A. M. Price-Whelan, B. M. Sipőcz, H. M. Günther, P. L. Lim, S. M. Crawford, S. Conseil, D. L. Shupe, M. W. Craig, N. Dencheva|заглавие=The Astropy Project: Building an Open-science Project and Status of the v2.0 Core Package|год=2018|язык=en|издание=The Astronomical Journal|месяц=08|число=24|том=156|выпуск=3|страницы=123|issn=1538-3881|doi=10.3847/1538-3881/aabc4f|архив=https://web.archive.org/web/20201002210222/https://iopscience.iop.org/article/10.3847/1538-3881/aabc4f/pdf|архив дата=2020-10-03}}</ref>{{Значимость факта?}}. - -Также Python является лучшим языком программирования по использованию в ИИ сфере<ref>{{Cite web|url=https://djangostars.com/blog/why-python-is-good-for-artificial-intelligence-and-machine-learning/|title=8 Reasons Why Python is Good for Artificial Intelligence and Machine Learning|lang=en-US|first=Alexander|last=Ryabtsev|website=Software Development Blog & IT Tech Insights {{!}} Django Stars|date=2019-03-11|access-date=2023-10-09|archive-date=2023-10-18|archive-url=https://web.archive.org/web/20231018232408/https://djangostars.com/blog/why-python-is-good-for-artificial-intelligence-and-machine-learning/|url-status=live}}</ref> - -Также Python подходит для выполнения нестандартных или сложных задач в [[Автоматизация сборки|системах сборки]] проектов, что обусловлено отсутствием необходимости предварительной компиляции исходных файлов. В проекте [[Google C++ Testing Framework|Google Test]] он используется для генерации исходного кода [[mock-объект]]ов для классов языка [[C++]]<ref>{{Cite web|url=https://github.com/google/googletest/blob/b88511ef640c046ec9c7553b383a2aba64c80967/googlemock/scripts/generator/README|title=The Google Mock class generator README|author=|website=[[Google C++ Testing Framework|Google Test]]|date=|publisher=github.com|access-date=2019-02-03|archive-date=2021-06-09|archive-url=https://web.archive.org/web/20210609072349/https://github.com/google/googletest/blob/b88511ef640c046ec9c7553b383a2aba64c80967/googlemock/scripts/generator/README|url-status=live}}</ref>{{Значимость факта?}}. - -Интерпретатор Python может использоваться в качестве мощной командной оболочки и скриптового языка для написания командных файлов ОС. Лёгкость обращения из Python-скриптов к внешним программам и наличие библиотек, дающих доступ к управлению системой, делают Python удобным инструментом для системного администрирования<ref name="GiftJones">{{публикация|книга|автор=Noah Gift, Jeremy M. Jones|заглавие=Python for Unix and Linux System Administration|isbn=978-0-596-51582-9}}</ref>. Он широко используется для этой цели на платформе Linux: обычно Python поставляется с системой, во многих дистрибутивах инсталляторы и визуальный интерфейс системных утилит написаны именно на Python. Используется он и в администрировании других Unix-систем, в частности, в [[Solaris]] и [[macOS]]<ref name="GiftJones" />. [[Кроссплатформенность]] самого языка и библиотек делает его привлекательным для унифицированной автоматизации задач системного администрирования в гетерогенных средах, где совместно применяются компьютеры с операционными системами различных типов. - -Будучи языком общего назначения Python применим почти во всех сферах деятельности. Фактически Python используется практически любой солидной компанией тем или иным образом как для выполнения текущих задач, так и в тестировании, администрировании или в разработке программных продуктов<ref name=":0" />. - -== Примечания == - -=== Комментарии === -{{Примечания|group=К}} - -=== Источники === -{{примечания|2|refs= -<ref name="foreword">{{cite web|url=https://www.python.org/doc/essays/foreword/|title=Foreword for «Programming Python» (1st ed.)|lang=en|accessdate=2021-03-07|url-status=live|archiveurl=https://web.archive.org/web/20210120125441/https://www.python.org/doc/essays/foreword/|archivedate=2021-01-20}}</ref> - -<ref name="PyS60">{{cite web |url = http://wiki.opensource.nokia.com/projects/PyS60 |title = Python for S60 — OpenSource |archive-url = https://web.archive.org/web/20090806081738/http://wiki.opensource.nokia.com/projects/PyS60 |archive-date = 2009-08-06 }}</ref> -}} - -== Литература == -{{викифицировать литературу}} -* {{Публикация|Книга|заглавие=Python. К вершинам мастерства|ref=Рамальо|ссылка=https://books.google.ru/books?id=qVBjDwAAQBAJ|год=2016|автор=Лучано Рамальо|язык=ru|место=|издательство=ДМК Пресс|оригинал язык=en|издание=|оригинал=Fluent Python. O’Reilly, 2015}} -* {{Публикация|книга|заглавие=Автостопом по Python|ref=К. Рейт, Т. Шлюссер|год=2017|автор=Кеннет Рейтц, Таня Шлюссер|язык=ru|ссылка=https://www.google.ru/books/edition/Автостопом_по_Python/ZfcxDwAAQBAJ|издательство=Издательский дом «Питер»|оригинал=The Hitchhiker`s Guide to Python|оригинал ссылка=https://www.google.ru/books/edition/The_Hitchhiker_s_Guide_to_Python/nHDtDAAAQBA|оригинал язык=en|isbn=9785496030236}} -* {{книга|автор=David M. Beazley|заглавие=Python Essential Reference|издание=4th Edition|год=2009|издательство=Addison-Wesley Professional|страниц=717|isbn=978-0672329784|ref=Beazley}} -* {{Книга|заглавие=Parallel Programming with Python|автор=Jan Palach|ссылка=https://books.google.ru/books?id=bE_lAwAAQBAJ|издательство=Packt Publishing Ltd|год=2014|ref=Palach}} -* {{Публикация|книга|заглавие=Python. Лучшие практики и инструменты|ref=Яворски, Зиаде|год=2021|автор= Яворски Михал, Зиаде Тарек|язык=ru|ссылка=https://www.google.ru/books/edition/Python_Лучшие_практики_и/hHswEAAAQBAJ|издательство=Издательский дом «Питер»|оригинал=Expert Python Programming|оригинал ссылка=https://www.google.ru/books/edition/Expert_Python_Programming/2tAwEAAAQBAJ|оригинал язык=en}} -* {{книга|автор = {{comment|Фёдоров, Д. Ю.|Фёдоров, Дмитрий Юрьевич}}|заглавие = Программирование на языке высокого уровня Python|ссылка = https://urait.ru/viewer/programmirovanie-na-yazyke-vysokogo-urovnya-python-492920#page/1|место = Москва|издательство = Издательство Юрайт|год = 2022|страниц = 210|серия = Высшее образование|isbn = 978-5-534-14638-7}} - -== Ссылки == -{{Навигация - | Тема = Python - | Викиучебник = Python - | Викитека = Категория:Python -}} -* [http://www.python.org/ Официальный сайт]{{ref-en}} - -{{Python}} -{{Языки программирования}} -{{ВС}} - - -[[Категория:Python|*]] -[[Категория:Статьи с примерами кода Python]] -[[Категория:Языки с динамической типизацией]] -[[Категория:Языки веб-программирования]] -[[Категория:Высокоуровневые языки программирования]] +СЕКС СЕКС СЕКС СИСЬКИ ПИСКИ ХУИСЬКИ........... '
Новый размер страницы (new_size)
76
Старый размер страницы (old_size)
212945
Изменение размера в правке (edit_delta)
-212869
Добавленные в правке строки (added_lines)
[ 0 => 'СЕКС СЕКС СЕКС СИСЬКИ ПИСКИ ХУИСЬКИ...........' ]
Удалённые в правке строки (removed_lines)
[ 0 => '{{Другие значения}}', 1 => '{{Карточка языка программирования', 2 => '| испытал влияние = [[ABC (язык программирования)|ABC]],<ref name="faq-created">{{cite web |url=https://docs.python.org/faq/general.html#why-was-python-created-in-the-first-place |title=Why was Python created in the first place? |work=General Python FAQ |publisher=Python Software Foundation |access-date=2007-03-22 |archive-date=2012-10-24 |archive-url=https://web.archive.org/web/20121024164224/http://docs.python.org/faq/general.html#why-was-python-created-in-the-first-place |url-status=live }}</ref> [[Ада (язык программирования)|Ada]],<ref>{{cite web|lang=en | url=http://archive.adaic.com/standards/83lrm/html/lrm-11-03.html#11.3 | title=Ada 83 Reference Manual (raise statement) | access-date=2020-01-07 | archive-date=2019-10-22 | archive-url=https://web.archive.org/web/20191022155758/http://archive.adaic.com/standards/83lrm/html/lrm-11-03.html#11.3 | url-status=live }}</ref> [[Алгол 68]],<ref name="98-interview">{{cite web |url=http://www.amk.ca/python/writing/gvr-interview |title=Interview with Guido van Rossum (July 1998) |last=Kuchling |first=Andrew M. |work=amk.ca |date=2006-12-22 |access-date=2012-03-12 |url-status=dead |archive-url=https://web.archive.org/web/20070501105422/http://www.amk.ca/python/writing/gvr-interview |archive-date=2007-05-01}}</ref> [[APL (язык программирования)|APL]],<ref name="python.org">{{cite web|url=https://docs.python.org/3/library/itertools.html|title=itertools — Functions creating iterators for efficient looping — Python 3.7.1 documentation|website=docs.python.org|access-date=2016-11-22|archive-date=2020-06-14|archive-url=https://web.archive.org/web/20200614153629/https://docs.python.org/3/library/itertools.html|url-status=live}}</ref> [[Си (язык программирования)|C]],<ref name="AutoNT-1">{{ cite journal |last=van Rossum |first=Guido |year=1993 |title=An Introduction to Python for UNIX/C Programmers |journal=Proceedings of the NLUUG Najaarsconferentie (Dutch UNIX Users Group) |quote=even though the design of C is far from ideal, its influence on Python is considerable. |citeseerx=10.1.1.38.2023 }}</ref> [[C++]],<ref name="classmix">{{cite web |url=https://docs.python.org/tutorial/classes.html |title=Classes |work=The Python Tutorial |publisher=Python Software Foundation |access-date=2012-02-20 |quote=It is a mixture of the class mechanisms found in C++ and Modula-3 |archive-date=2012-10-23 |archive-url=https://web.archive.org/web/20121023030209/http://docs.python.org/tutorial/classes.html |url-status=live }}</ref> [[Клу]],<ref name="effbot-call-by-object">{{cite web |url=http://effbot.org/zone/call-by-object.htm |title=Call By Object |work=effbot.org |last=Lundh |first=Fredrik |quote=replace "CLU" with "Python", "record" with "instance", and "procedure" with "function or method", and you get a pretty accurate description of Python's object model. |access-date=2017-11-21 |archive-date=2019-11-23 |archive-url=https://web.archive.org/web/20191123043655/http://effbot.org/zone/call-by-object.htm |url-status=live }}</ref> [[Dylan (язык программирования)|Dylan]],<ref name="AutoNT-2">{{cite web |url=https://www.python.org/download/releases/2.3/mro/ |title=The Python 2.3 Method Resolution Order |last=Simionato |first=Michele |publisher=Python Software Foundation |quote=The C3 method itself has nothing to do with Python, since it was invented by people working on Dylan and it is described in a paper intended for lispers |access-date=2014-07-29 |archive-date=2020-08-20 |archive-url=https://web.archive.org/web/20200820231854/https://www.python.org/download/releases/2.3/mro/ |url-status=live }}</ref> [[Haskell]],<ref name="AutoNT-3">{{cite web |url=https://docs.python.org/howto/functional.html |title=Functional Programming HOWTO |last=Kuchling |first=A. M. |work=Python v2.7.2 documentation |publisher=Python Software Foundation |access-date=2012-02-09 |archive-date=2012-10-24 |archive-url=https://web.archive.org/web/20121024163217/http://docs.python.org/howto/functional.html |url-status=live }}</ref> [[Icon (язык программирования)|Icon]],<ref name="AutoNT-4">{{cite web |url=https://www.python.org/dev/peps/pep-0255/ |title=PEP 255&nbsp;– Simple Generators |first1=Neil |last1=Schemenauer |first2=Tim |last2=Peters |first3=Magnus Lie |last3=Hetland |date=2001-05-18 |work=Python Enhancement Proposals |publisher=Python Software Foundation |access-date=2012-02-09 |archive-date=2020-06-05 |archive-url=https://web.archive.org/web/20200605012926/https://www.python.org/dev/peps/pep-0255/ |url-status=live }}</ref> [[Java]],<ref name="AutoNT-5">{{cite web |url=https://www.python.org/dev/peps/pep-0318/ |title=PEP 318&nbsp;– Decorators for Functions and Methods |first1=Kevin D. |last1=Smith |first2=Jim J. |last2=Jewett |first3=Skip |last3=Montanaro |first4=Anthony |last4=Baxter |date=2004-09-02 |work=Python Enhancement Proposals |publisher=Python Software Foundation |access-date=2012-02-24 |archive-date=2020-06-03 |archive-url=https://web.archive.org/web/20200603133734/https://www.python.org/dev/peps/pep-0318/ |url-status=live }}</ref>[[Лисп]],<ref name="AutoNT-6">{{cite web |url=https://docs.python.org/3.2/tutorial/controlflow.html |title=More Control Flow Tools |work=Python 3 documentation |publisher=Python Software Foundation |access-date=2015-07-24 |archive-date=2016-06-04 |archive-url=https://web.archive.org/web/20160604080843/https://docs.python.org/3.2/tutorial/controlflow.html |url-status=live }}</ref> [[Модула-3]],<ref name="classmix" /> [[Perl]], [[Standard ML]]<ref name="python.org"/>', 3 => '| повлиял на = [[Mojo (язык программирования)|Mojo]]<ref>{{Cite web |last=Krill |first=Paul |date=2023-05-04 |title=Mojo language marries Python and MLIR for AI development |url=https://www.infoworld.com/article/3695588/mojo-language-marries-python-and-mlir-for-ai-development.html |access-date=2023-05-05 |website=InfoWorld |language=en |archive-date=5 May 2023 |archive-url=https://web.archive.org/web/20230505064554/https://www.infoworld.com/article/3695588/mojo-language-marries-python-and-mlir-for-ai-development.html |url-status=live }}</ref>', 4 => '}}', 5 => '', 6 => ''''Python''' (<small>[[МФА]]:</small> {{IPA|[ˈpʌɪθ(ə)n]}}; в русском языке встречаются названия '''пито́н'''<ref>{{Cite web |url=http://www.xakep.ru/magazine/xa/117/088/1.asp |title=Мария «Mifrill» Нефёдова, Создатели языков программирования: Они такие разные, но кодинг их объединяет, Хакер № 09/08 (117) |access-date=2012-12-01 |archive-date=2013-07-02 |archive-url=https://web.archive.org/web/20130702190922/http://www.xakep.ru/magazine/xa/117/088/1.asp |url-status=live }}</ref> или '''па́йтон'''<ref>{{книга|автор=Прохоренок Н., Дронов В.|часть=Введение|заглавие=Python 3. Самое необходимое, 2-е изд.|ссылка=https://books.google.ru/books?id=k_6MDwAAQBAJ&lpg=PA11&hl=ru&pg=PA11#v=onepage&q&f=false|издательство=БХВ-Петербург|год=2019|страницы=11|страниц=608|isbn=9785977539944|archivedate=2021-02-12|archiveurl=https://web.archive.org/web/20210212044851/https://books.google.ru/books?id=k_6MDwAAQBAJ&lpg=PA11&hl=ru&pg=PA11#v=onepage&q&f=false}}</ref>) — [[высокоуровневый язык программирования]] общего назначения с [[Динамическая типизация|динамической]] [[Строгая типизация|строгой]] типизацией и автоматическим управлением памятью<ref name=":2">{{Статья|ссылка=https://www.irjet.net/archives/V6/i2/IRJET-V6I2367.pdf|автор=Yogesh Rana|заглавие=Python: Simple though an Important Programming language|год=2019|язык=en|издание=International Research Journal of Engineering and Technology (IRJET)|месяц=02|число=02|том=06|выпуск=2|страницы=1856—1858|issn=2395-0056|archiveurl=https://web.archive.org/web/20210211163417/https://www.irjet.net/archives/V6/i2/IRJET-V6I2367.pdf|archivedate=2021-02-11|access-date=2021-02-11|deadlink=no}}</ref><ref>{{Cite web|lang=en|url=https://wiki.python.org/moin/Why%20is%20Python%20a%20dynamic%20language%20and%20also%20a%20strongly%20typed%20language|title=Why is Python a dynamic language and also a strongly typed language - Python Wiki|author=SkipMontanaro|website=wiki.python.org|date=2012-02-24|archive-url=https://web.archive.org/web/20210314173706/https://wiki.python.org/moin/Why%20is%20Python%20a%20dynamic%20language%20and%20also%20a%20strongly%20typed%20language|archive-date=2021-03-14|access-date=2021-03-14|url-status=live}}</ref>, ориентированный на повышение производительности разработчика, читаемости [[Исходный код|кода]] и его качества, а также на обеспечение переносимости написанных на нём программ<ref name=":1">{{Cite web|lang=en|url=https://www.oreilly.com/library/view/learning-python-3rd/9780596513986/ch01.html|title=A Python Q&A Session|author=Mark Lutz|website=Learning Python, 3rd Edition [Book]|date=2007|publisher=O'Reilly Media, Inc.|archiveurl=https://web.archive.org/web/20210208175236/https://www.oreilly.com/library/view/learning-python-3rd/9780596513986/ch01.html|archivedate=2021-02-08|accessdate=2021-02-11|url-status=live}}</ref>. Язык является полностью [[Объектно-ориентированный язык программирования|объектно-ориентированным]] в том плане, что всё является [[Объект (программирование)|объектами]]<ref name=":2" />. Необычной особенностью языка является выделение [[Блок кода|блоков кода]] отступами<ref>{{Cite web|lang=en|url=https://developers.google.com/edu/python/introduction?hl=ru|title=Python Introduction {{!}}|website=Python Education|date=2018-08-20|publisher=Google Developers|archiveurl=https://web.archive.org/web/20201204155936/https://developers.google.com/edu/python/introduction|archivedate=2020-12-04|accessdate=2021-02-21|url-status=live}}</ref>. [[Синтаксис (программирование)|Синтаксис]] ядра языка минималистичен, за счёт чего на практике редко возникает необходимость обращаться к документации<ref name=":1" />. Сам же язык известен как [[Интерпретируемый язык программирования|интерпретируемый]] и используется в том числе для написания [[скрипт]]ов<ref name=":2" />. Недостатками языка являются зачастую более низкая скорость работы и более высокое потребление памяти написанных на нём программ по сравнению с аналогичным кодом, написанным на [[Компилируемый язык программирования|компилируемых языках]], таких как [[Си (язык программирования)|C]] или [[C++]]<ref name=":2" /><ref name=":1" />.', 7 => '', 8 => 'Python является [[Мультипарадигменный язык программирования|мультипарадигменным языком программирования]], поддерживающим [[Императивное программирование|императивное]], [[Процедурное программирование|процедурное]], [[Структурное программирование|структурное]], [[Объектно-ориентированное программирование|объектно-ориентированное]] программирование<ref name=":2" />, [[метапрограммирование]]<ref name=":12">{{cite web|author=Satwik Kansal|url=https://developer.ibm.com/technologies/analytics/tutorials/ba-metaprogramming-python/|title=Metaprogramming in Python|lang=en|website=[[IBM]]|date=2018-04-05|accessdate=2021-04-14|url-status=live|archiveurl=https://web.archive.org/web/20210227132455/https://developer.ibm.com/technologies/analytics/tutorials/ba-metaprogramming-python/|archivedate=2021-02-27}}</ref>, [[Функциональное программирование|функциональное]] программирование<ref name=":2" /> и [[асинхронное программирование]]<ref name=":23">{{Cite web|url=https://docs.python.org/3/library/asyncio.html|title=asyncio — Asynchronous I/O|website=Python documentation|access-date=2023-10-09|archive-date=2019-05-05|archive-url=https://web.archive.org/web/20190505024126/https://docs.python.org/3/library/asyncio.html|url-status=live}}</ref>. Задачи [[Обобщённое программирование|обобщённого программирования]] решаются за счёт динамической типизации<ref name=":8" /><ref name=":9" />. [[Аспектно-ориентированное программирование]] частично поддерживается через [[Декоратор (шаблон проектирования)|декораторы]]<ref name=":13">{{Cite web|lang=en|url=https://www.oreilly.com/library/view/mastering-object-oriented-python/9781789531367/8cc23b01-44dd-4d1c-8993-f11107febf72.xhtml|title=Aspect-oriented programming|author=Steven F. Lott|website=Mastering Object-Oriented Python - Second Edition|date=2019|publisher=Packt Publishing|archiveurl=https://web.archive.org/web/20210221190643/https://www.oreilly.com/library/view/mastering-object-oriented-python/9781789531367/8cc23b01-44dd-4d1c-8993-f11107febf72.xhtml|archivedate=2021-02-21|accessdate=2021-02-21|url-status=live}}</ref>, более полноценная поддержка обеспечивается дополнительными [[фреймворк]]ами<ref>{{Статья|ссылка=https://core.ac.uk/download/pdf/230920601.pdf|автор=Arne Bachmann, Henning Bergmeyer, Andreas Schreiber|заглавие=Evaluation of aspect-oriented frameworks in Python for extending a project with provenance documentation features|год=2011|язык=en|издание=The Python Papers|том=6|выпуск=3|страницы=1–18|issn=1834-3147|archiveurl=https://web.archive.org/web/20180422011318/http://ojs.pythonpapers.org/index.php/tpp/article/download/218/202|archivedate=2018-04-22|access-date=2021-02-20|deadlink=no}}</ref>. Такие методики как [[Контрактное программирование|контрактное]] и [[логическое программирование]] можно реализовать с помощью библиотек или расширений<ref>{{Книга|язык=en|ссылка=https://books.google.ru/books?id=RkEAEAAAQBAJ&pg=PT47|автор=Steven Cooper|заглавие=Data Science from Scratch: The #1 Data Science Guide for Everything A Data Scientist Needs to Know: Python, Linear Algebra, Statistics, Coding, Applications, Neural Networks, and Decision Trees|год=2018|издательство=Roland Bind|страниц=126|access-date=2021-02-21|archive-date=2021-02-21|archive-url=https://web.archive.org/web/20210221110359/https://books.google.ru/books?id=RkEAEAAAQBAJ&pg=PT47|deadlink=no}}</ref>. Основные архитектурные черты — [[динамическая типизация]], [[сборка мусора (программирование)|автоматическое управление памятью]]<ref name=":2" />, [[Интроспекция в Python|полная интроспекция]], механизм [[обработка исключений|обработки исключений]], поддержка [[многопоточность|многопоточных вычислений]] с глобальной блокировкой интерпретатора ([[Global Interpreter Lock|GIL]])<ref>{{Cite web|lang=en|url=https://www.linuxjournal.com/content/multiprocessing-python|title=Multiprocessing in Python|author=Reuven M. Lerner|website=Linux Journal|date=2018-04-16|archiveurl=https://web.archive.org/web/20210214122407/https://www.linuxjournal.com/content/multiprocessing-python|archivedate=2021-02-14|accessdate=2021-02-14|url-status=live}}</ref>, высокоуровневые [[структура данных|структуры данных]]. Поддерживается разбиение программ на [[Модуль (программирование)|модули]], которые, в свою очередь, могут объединяться в пакеты<ref>{{Cite web|lang=en|url=https://www.oreilly.com/library/view/python-cookbook-3rd/9781449357337/ch10.html|title=10. Modules and Packages - Python Cookbook, 3rd Edition [Book]|author=David Beazley, Brian K. Jones|website=Python Cookbook, 3rd Edition|date=2013|publisher=O'Reilly Media, Inc.|archiveurl=https://web.archive.org/web/20210221072641/https://www.oreilly.com/library/view/python-cookbook-3rd/9781449357337/ch10.html|archivedate=2021-02-21|accessdate=2021-02-21|url-status=live}}</ref>.', 9 => '', 10 => '[[Эталонная реализация|Эталонной реализацией]] Python является интерпретатор [[CPython]], который поддерживает большинство активно используемых платформ<ref>{{Cite web |url=http://www.python.org/about/ |title=About Python |access-date=2007-08-07 |archive-date=2007-08-11 |archive-url=https://web.archive.org/web/20070811215819/http://www.python.org/about/ |url-status=live }}</ref>, являющийся [[Стандарт де-факто|стандартом де-факто]] языка<ref>{{Cite web|lang=en|url=https://wiki.python.org/moin/PythonImplementations|title=PythonImplementations - Python Wiki|website=wiki.python.org|date=2020-07-21|archiveurl=https://web.archive.org/web/20201111215017/https://wiki.python.org/moin/PythonImplementations|archivedate=2020-11-11|accessdate=2021-02-17|url-status=live}}</ref>. Он распространяется под [[свободное программное обеспечение|свободной лицензией]] [[Python Software Foundation License]], позволяющей использовать его без ограничений в любых приложениях, включая [[проприетарное ПО|проприетарные]]<ref>{{Cite web|lang=en|url=https://docs.python.org/3/license.html|title=History and License|website=Python|access-date=2021-05-21|archive-date=2016-12-05|archive-url=https://web.archive.org/web/20161205134352/https://docs.python.org/3/license.html|url-status=live}}</ref>. CPython компилирует исходные тексты в высокоуровневый [[байт-код]], который исполняется в стековой виртуальной машине<ref name=":18">{{Статья|ссылка=https://cs.ucsb.edu/sites/cs.ucsb.edu/files/docs/reports/2010-14.pdf|автор=Mostafa Chandra Krintz, C. Cascaval, D. Edelsohn, P. Nagpurkar, P. Wu|заглавие=Understanding the Potential of Interpreter-based Optimizations for Python|год=2010|язык=en|издание=UCSB Technical Report|месяц=08|число=11|archiveurl=https://web.archive.org/web/20210223142412/https://cs.ucsb.edu/sites/cs.ucsb.edu/files/docs/reports/2010-14.pdf|archivedate=2021-02-23|access-date=2021-02-23|deadlink=no}}</ref>. К другим трём основным реализациям языка относятся [[Jython]] (для [[JVM]]), [[IronPython]] (для [[CLR]]/[[.NET Framework|.NET]]) и [[PyPy]]<ref name=":2" /><ref name=":3" />. PyPy написан на подмножестве языка Python (RPython) и разрабатывался как альтернатива CPython с целью повышения скорости исполнения программ, в том числе за счёт использования [[JIT-компиляция|JIT-компиляции]]<ref name=":3" />. Поддержка версии Python 2 закончилась в 2020 году<ref name="python-8468">{{cite web|url=https://www.python.org/dev/peps/pep-0373/|title=PEP 373 -- Python 2.7 Release Schedule|lang=en|date=2014-03-23|accessdate=2021-03-07|url-status=live|archiveurl=https://web.archive.org/web/20210225041847/https://www.python.org/dev/peps/pep-0373/|archivedate=2021-02-25}}</ref>. На текущий момент активно развивается версия языка Python 3<ref name=":5">{{Статья|ссылка=https://journals.plos.org/ploscompbiol/article?id=10.1371/journal.pcbi.1004867|автор=Berk Ekmekci, Charles E. McAnany, Cameron Mura|заглавие=An Introduction to Programming for Bioscientists: A Python-Based Primer|год=2016|язык=en|издание=PLOS Computational Biology|месяц=07|число=06|том=12|выпуск=6|страницы=e1004867|issn=1553-7358|doi=10.1371/journal.pcbi.1004867|pmid=27271528|archiveurl=https://web.archive.org/web/20210216190549/https://www.ncbi.nlm.nih.gov/pmc/articles/PMC4896647/pdf/pcbi.1004867.pdf|archivedate=2021-02-16|access-date=2021-02-17|deadlink=no}}</ref>. Разработка языка ведётся через предложения по расширению языка '''PEP''' ({{Lang-en|Python Enhancement Proposal}}), в которых описываются нововведения, делаются корректировки согласно обратной связи от сообщества и документируются итоговые решения<ref name=":7">{{Статья|ссылка=http://ijaerd.com/papers/special_papers/IT032.pdf|автор=Kalyani Adawadkar|заглавие=Python Programming - Applications and Future|год=2017|язык=en|издание=International Journal of Advance Engineering and Research Development|месяц=04|выпуск=SIEICON-2017|страницы=1—4|issn=2348-447|archiveurl=https://web.archive.org/web/20200715080906/http://www.ijaerd.com/papers/special_papers/IT032.pdf|archivedate=2020-07-15|access-date=2021-02-20|deadlink=no}}</ref>.', 11 => '', 12 => 'Стандартная библиотека включает большой набор полезных переносимых функций, начиная с возможностей для работы с текстом и заканчивая средствами для написания сетевых приложений. Дополнительные возможности, такие как математическое моделирование, работа с оборудованием, написание веб-приложений или разработка игр, могут реализовываться посредством обширного количества сторонних библиотек, а также интеграцией библиотек, написанных на Си или C++, при этом и сам интерпретатор Python может интегрироваться в проекты, написанные на этих языках<ref name=":2" />. Существует и специализированный [[репозиторий]] программного обеспечения, написанного на Python, — [[PyPI]]<ref name=":10">{{Статья|ссылка=https://papers.ssrn.com/abstract=3426281|автор=Ethan Bommarito, Michael James Bommarito|заглавие=An Empirical Analysis of the Python Package Index (PyPI)|год=2019|язык=en|место=Rochester, NY|издание=Social Science Research Network|издательство=Social Science Research Network|месяц=07|число=25|doi=10.2139/ssrn.3426281|arxiv=arXiv:1907.11073v2|access-date=2021-02-19|archive-date=2021-06-09|archive-url=https://web.archive.org/web/20210609072346/https://papers.ssrn.com/sol3/papers.cfm?abstract_id=3426281|deadlink=no|archivedate=2021-06-09|archiveurl=https://web.archive.org/web/20210609072346/https://papers.ssrn.com/sol3/papers.cfm?abstract_id=3426281}}</ref>. Данный репозиторий предоставляет средства для простой установки пакетов в операционную систему и стал стандартом де-факто для Python<ref>{{Книга|язык=en|ссылка=https://books.google.ru/books?id=O0PfBgAAQBAJ&pg=PA8&lpg=PA8|автор=Pratik Desai|заглавие=Python Programming for Arduino|год=2015|издательство=Packt Publishing Ltd|страницы=8|страниц=400|isbn=978-1-78328-594-5|access-date=2021-02-21|archive-date=2021-02-21|archive-url=https://web.archive.org/web/20210221201536/https://books.google.ru/books?id=O0PfBgAAQBAJ&pg=PA8&lpg=PA8|deadlink=no}}</ref>. По состоянию на 2019 год в нём содержалось более 175 тысяч пакетов<ref name=":10" />.', 13 => '', 14 => 'Python стал одним из самых популярных языков, он используется в [[Анализ данных|анализе данных]], [[Машинное обучение|машинном обучении]], [[DevOps]] и [[Веб-разработка|веб-разработке]], а также в других сферах, включая [[Разработка компьютерных игр|разработку игр]]. За счёт читабельности, простого синтаксиса и отсутствия необходимости в компиляции язык хорошо подходит для обучения программированию, позволяя концентрироваться на изучении алгоритмов, концептов и парадигм. Отладка же и экспериментирование в значительной степени облегчаются тем фактом, что язык является интерпретируемым<ref name=":2" /><ref name=":14">{{Статья|ссылка=https://journals.plos.org/ploscompbiol/article?id=10.1371/journal.pcbi.0030199|автор=Sebastian Bassi|заглавие=A Primer on Python for Life Science Researchers|год=2007|язык=en|издание=PLOS Computational Biology|месяц=11|число=30|том=3|выпуск=11|страницы=e199|issn=1553-7358|doi=10.1371/journal.pcbi.0030199|archiveurl=https://web.archive.org/web/20210313132814/https://journals.plos.org/ploscompbiol/article?id=10.1371%2Fjournal.pcbi.0030199|archivedate=2021-03-13|access-date=2021-03-13|deadlink=no}}</ref>. Применяется язык многими крупными компаниями, такими как [[Google (компания)|Google]] или [[Facebook]]<ref name=":2" />.', 15 => '', 16 => '== История ==', 17 => '{{main|История языка программирования Python}}', 18 => '[[Файл:Python logo 1990s.svg|мини|200px|Логотип, использовавшийся с 1990-х до 2006 года]]', 19 => '[[Файл:Guido van Rossum OSCON 2006.jpg|мини|200px|[[Ван Россум, Гвидо|Гвидо ван Россум]] в 2006 году на OSCON в Портленде (штат Орегон)]]', 20 => 'Задумка по реализации языка появилась в конце [[1980-е|1980-х годов]], а разработка его реализации началась в 1989 году сотрудником голландского института [[Центр математики и информатики|CWI]] [[Гвидо ван Россум]]ом<ref name=":7" />. Для распределённой операционной системы [[Amoeba (операционная система)|Amoeba]] требовался расширяемый [[Сценарный язык|скриптовый язык]], и Гвидо начал разрабатывать Python на досуге, позаимствовав некоторые наработки для языка [[ABC (язык программирования)|ABC]] (Гвидо участвовал в разработке этого языка, ориентированного на обучение программированию). В феврале [[1991 год]]а Гвидо опубликовал исходный текст в [[Группа новостей|группе новостей]] alt.sources<ref>{{Cite web |url=http://svn.python.org/view/*checkout*/python/trunk/Misc/HISTORY |title=Архивированная копия |accessdate=2009-06-01 |archiveurl=https://web.archive.org/web/20160217132249/http://svn.python.org/view/*checkout*/python/trunk/Misc/HISTORY |archivedate=2016-02-17 |url-status=dead }}</ref>. С самого начала Python проектировался как [[объектно-ориентированный язык программирования|объектно-ориентированный язык]].', 21 => '', 22 => 'Гвидо ван Россум назвал язык в честь популярного британского комедийного телешоу [[1970-е|1970-х]] «[[Летающий цирк Монти Пайтона]]»<ref name="AutoNT-24" />, поскольку автор был поклонником этого телешоу, как и многие другие разработчики того времени, а в самом шоу прослеживалась некая параллель с миром компьютерной техники<ref name=":1" />.', 23 => '', 24 => 'Наличие дружелюбного, отзывчивого сообщества пользователей считается, наряду с дизайнерской интуицией Гвидо, одним из факторов успеха Python. Развитие языка происходит согласно чётко регламентированному процессу создания, обсуждения, отбора и реализации документов PEP ({{lang-en|Python Enhancement Proposal}}) — предложений по развитию Python<ref>{{Cite web |url=http://www.python.org/dev/peps/ |title=Index of Python Enhancement Proposals (PEPs) |access-date=2007-01-28 |archive-date=2007-01-28 |archive-url=https://web.archive.org/web/20070128214511/http://www.python.org/dev/peps/ |url-status=live }}</ref>.', 25 => '', 26 => '[[3 декабря]] [[2008 год]]а<ref>{{Cite web |url=http://python.org/download/releases/3.0/ |title=Python 3.0 Release |access-date=2009-06-01 |archive-date=2009-06-02 |archive-url=https://web.archive.org/web/20090602015124/http://www.python.org/download/releases/3.0/ |url-status=live }}</ref>, после длительного тестирования, вышла первая версия Python 3000 (или Python 3.0, также используется [[Аббревиатура|сокращение]] Py3k). В Python 3 устранены многие недостатки архитектуры с максимально возможным (но не полным) сохранением совместимости со старыми версиями Python.', 27 => '', 28 => 'Дата окончания срока поддержки Python 2.7 первоначально была установлена на 2015 год, а затем перенесена на 2020 год из опасения, что большая часть существующего кода не может быть легко перенесена на Python 3<ref>{{cite web |url=https://legacy.python.org/dev/peps/pep-0373/ |title=PEP 373 -- Python 2.7 Release Schedule |work=python.org |access-date=2017-01-09 |archive-date=2020-05-19 |archive-url=https://web.archive.org/web/20200519075520/https://legacy.python.org/dev/peps/pep-0373/ |url-status=live }}</ref><ref>{{cite web |url=https://www.python.org/dev/peps/pep-0466/ |title=PEP 466 -- Network Security Enhancements for Python 2.7.x |work=python.org |access-date=2017-01-09 |archive-date=2020-06-04 |archive-url=https://web.archive.org/web/20200604232833/https://www.python.org/dev/peps/pep-0466/ |url-status=live }}</ref>. Поддержка Python 2 была направлена лишь на уже существующие проекты, новые проекты должны были использовать Python 3<ref name=":5" />. Официально Python 2.7 не поддерживается с 1 января 2020 года, хотя последнее обновление вышло в апреле 2020. Больше никаких исправлений безопасности или других улучшений для Python 2.7 не будет выпущено<ref name="python-8468" /><ref>{{Cite web|url=https://www.python.org/doc/sunset-python-2/|title=Sunsetting Python 2|website=Python.org|language=en|access-date=2019-09-22|archive-date=2020-01-12|archive-url=https://web.archive.org/web/20200112080903/https://www.python.org/doc/sunset-python-2/|url-status=live}}</ref>. С окончанием срока службы Python 2.x поддерживаются только Python 3.6.x и более поздние версии<ref>{{Cite web|url=https://devguide.python.org/#status-of-python-branches|title=Python Developer's Guide — Python Developer's Guide|website=devguide.python.org|access-date=2019-12-17|archive-date=2020-11-09|archive-url=https://web.archive.org/web/20201109032501/https://devguide.python.org/#status-of-python-branches|url-status=live}}</ref>.', 29 => '', 30 => '== Концепция и философия ==', 31 => '{{main|Дзен Пайтона}}', 32 => '[[Файл:Text-x-python.svg|thumb|left|100px|Пиктограмма для файлов .py]]', 33 => 'Язык использует [[динамическая типизация|динамическую типизацию]] вместе с [[подсчёт ссылок|подсчётом ссылок]] и циклический [[сборщик мусора]] для [[Менеджер памяти|менеджмента памяти]]<ref name="Reference_counting">{{Cite web| url=https://docs.python.org/extending/extending.html#reference-counts| title=Extending and Embedding the Python Interpreter: Reference Counts| publisher=Docs.python.org| language=en| access-date=2020-06-05| quote=Since Python makes heavy use of <code>malloc()</code> and <code>free()</code>, it needs a strategy to avoid memory leaks as well as the use of freed memory. The chosen method is called ''reference counting''.| archive-date=2012-10-18| archive-url=https://web.archive.org/web/20121018063230/http://docs.python.org/extending/extending.html#reference-counts| url-status=live}}</ref>. Также есть динамические [[разрешения имён (программирование)|разрешения имён]] ([[Область видимости#Динамическое связывание|динамическое связывание]]), которые связывают имена методов и переменных во время выполнения программы.', 34 => '', 35 => 'Python предлагает поддержку функционального программирования в традициях [[Лисп]]а. Так, в Python есть функции <code>filter</code>, <code>map</code> и <code>reduce</code> (Начиная с python 3, находится в библиотеке <code>itertools</code> <ref>{{Cite web |url=https://docs.python.org/3/whatsnew/3.0.html |title=What’s New In Python 3.0 — Python 3.12.0 documentation<!-- Заголовок добавлен ботом --> |access-date=2023-10-08 |archive-date=2012-11-02 |archive-url=https://web.archive.org/web/20121102053959/https://docs.python.org/3/whatsnew/3.0.html |url-status=live }}</ref>; также из Лиспа были заимствованы понятия [[Характеристика списка|характеристик списков]], [[Ассоциативный массив|ассоциативных массивов]] (словарей), [[Множество (тип данных)|множеств]] и генераторов списков<ref name="AutoNT-59">{{cite web |url=https://www.python.org/dev/peps/pep-0289/ |title=PEP 289&nbsp;– Generator Expressions |last=Hettinger |first=Raymond |date=2002-01-30 |work=Python Enhancement Proposals |publisher=Python Software Foundation |access-date=2012-02-19 |archive-date=2020-06-14 |archive-url=https://web.archive.org/web/20200614153717/https://www.python.org/dev/peps/pep-0289/ |url-status=live }}</ref>. Стандартная библиотека содержит два модуля (itertools и functools), реализующие инструменты, заимствованные из [[Haskell]] и [[Standard ML]]<ref name="AutoNT-18">{{cite web |url=https://docs.python.org/3/library/itertools.html |title=6.5 itertools&nbsp;– Functions creating iterators for efficient looping |publisher=Docs.python.org |access-date=2016-11-22 |archive-date=2020-06-14 |archive-url=https://web.archive.org/web/20200614153629/https://docs.python.org/3/library/itertools.html |url-status=live }}</ref>.', 36 => '', 37 => '{{Якорь|Философия}}', 38 => 'Разработчики языка Python придерживаются определённой философии программирования, называемой «The Zen of Python» («[[Дзен]] Пито́на», или «Дзен Па́йтона»)<ref>{{Cite web |url=http://www.python.org/peps/pep-0020.html |title=PEP 20 — The Zen of Python |access-date=2005-09-23 |archive-date=2005-07-17 |archive-url=https://web.archive.org/web/20050717021621/http://www.python.org/peps/pep-0020.html |url-status=live }}</ref>. Её текст выдаётся [[интерпретатор]]ом Python по команде <code>import this</code> (работает один раз за сессию). Автором этой философии считается [[Петерс, Тим|Тим Петерс]] (Tim Peters).', 39 => '', 40 => '<div style="float:right">', 41 => '{{начало цитаты|источник=Философия начинается так<ref>{{Книга|ссылка=https://books.google.ru/books?id=jLFjDwAAQBAJ&pg=PA64|автор=Бейдер Дэн|заглавие=Чистый Python. Тонкости программирования для профи|год=2018|издательство="Издательский дом ""Питер"""|страницы=64—65|страниц=288|isbn=978-5-4461-0803-9|access-date=2020-09-21|archive-date=2021-04-10|archive-url=https://web.archive.org/web/20210410140709/https://books.google.ru/books?id=jLFjDwAAQBAJ&pg=PA64|deadlink=no}}</ref>}}', 42 => '* Красивое лучше, чем уродливое.', 43 => '* Явное лучше, чем неявное.', 44 => '* Простое лучше, чем сложное.', 45 => '* Сложное лучше, чем запутанное.', 46 => '….', 47 => '{{oq|en|', 48 => '* Beautiful is better than ugly.', 49 => '* Explicit is better than implicit.', 50 => '* Simple is better than complex.', 51 => '* Complex is better than complicated.', 52 => '...', 53 => '}}{{конец цитаты}}', 54 => '</div>', 55 => '', 56 => 'Вместо того, чтобы встроить в ядро Python всю функциональность языка, он был спроектирован таким образом, чтобы быть легко расширяемым. Это сделало язык популярным средством добавления программируемых интерфейсов к существующим приложениям. Видение Гвидо ван Россума маленького ядра с большой стандартной библиотекой и легко расширяемым интерпретатором проистекало из негативного опыта разработки языка [[ABC (язык программирования)|ABC]], который придерживался противоположного подхода<ref name="venners-interview-pt-1">{{cite web |url=http://www.artima.com/intv/pythonP.html |title=The Making of Python |last=Venners |first=Bill |date=2003-01-13 |work=Artima Developer |publisher=Artima |access-date=2007-03-22 |archive-date=2016-09-01 |archive-url=https://web.archive.org/web/20160901183332/http://www.artima.com/intv/pythonP.html |url-status=live }}</ref>.', 57 => '', 58 => 'Python стремится к более простому, менее громоздкому синтаксису и грамматике, предоставляя разработчикам выбор в их методологии кодирования. В отличие от девиза [[Perl]] «[[There’s More Than One Way To Do It|есть несколько способов сделать это]]», Python придерживается философии «должен существовать один — и, желательно, только один — очевидный способ сделать это»<ref name="PEP20">{{cite web |url=https://www.python.org/dev/peps/pep-0020/ |title=PEP 20&nbsp;– The Zen of Python |last=Peters |first=Tim |date=2004-08-19 |work=Python Enhancement Proposals |publisher=Python Software Foundation |access-date=2008-11-24 |archive-date=2018-12-26 |archive-url=https://web.archive.org/web/20181226141127/https://www.python.org/dev/peps/pep-0020/ |url-status=live }}</ref>. {{Нп5|Мартелли, Алекс|Алекс Мартелли|en|Alex Martelli}}, член [[Python Software Foundation]], и автор книг по Python пишет, что «Описывать что-то как „умное“ не считается комплиментом в культуре Python»<ref name="AutoNT-19">{{cite book | url=http://shop.oreilly.com/product/9780596007973.do | title=Python Cookbook, 2nd Edition | publisher=[[O'Reilly Media]] | author=Alex Martelli, Anna Ravenscroft, David Ascher | year=2005 | page=230 | isbn=978-0-596-00797-3 }} {{Wayback|url=http://shop.oreilly.com/product/9780596007973.do |date=20200223171254 }} {{Cite web |url=http://shop.oreilly.com/product/9780596007973.do |title=Источник |access-date=2020-12-28 |archive-date=2020-02-23 |archive-url=https://web.archive.org/web/20200223171254/http://shop.oreilly.com/product/9780596007973.do |url-status=unfit }}</ref>.', 59 => '', 60 => 'Разработчики Python стремятся избежать преждевременной оптимизации и отвергают патчи к некритическим частям эталонной реализации [[CPython]], которые могли бы предложить незначительное увеличение скорости за счёт понятности кода<ref name="AutoNT-20">{{cite web | title=Python Culture | website=ebeab | date=2014-01-21 | url=http://ebeab.com/2014/01/21/python-culture/ | archive-url=https://web.archive.org/web/20140130021902/http://ebeab.com/2014/01/21/python-culture/ | archive-date=2014-01-30 |url-status=dead}}</ref>. Однако есть способы повышения производительности. Если в программе есть узкие места, связанные с выполнением ресурсоёмких операций на центральном процессоре, но не связанные с использованием операций ввода-вывода, то повысить производительность возможно за счёт трансляции программы при помощи [[Cython]] в язык Си и последующей компиляции<ref>{{Книга|ссылка=https://books.google.ru/books?id=gdN5AAAAQBAJ&pg=PA201&lpg=PA201|автор=Mark Summerfield|заглавие=Python in Practice: Create Better Programs Using Concurrency, Libraries, and Patterns|год=2013-08-20|издательство=Addison-Wesley|страницы=201|страниц=326|isbn=978-0-13-337323-3|access-date=2021-01-28|archive-date=2021-06-09|archive-url=https://web.archive.org/web/20210609072351/https://books.google.ru/books?id=gdN5AAAAQBAJ&pg=PA201&lpg=PA201|deadlink=no}}</ref>. Требовательные к вычислительным ресурсам части программы также можно переписывать на язык Си и подключать как отдельные библиотеки с привязками к Python<ref name=":3">{{Статья|ссылка=https://www.sciencedirect.com/science/article/pii/S2213133714000687|автор=J. Akeret, L. Gamper, A. Amara, A. Refregier|заглавие=HOPE: A Python just-in-time compiler for astrophysical computations|год=2015|язык=en|издание=Astronomy and Computing|месяц=04|число=01|том=10|страницы=1–8|issn=2213-1337|doi=10.1016/j.ascom.2014.12.001|arxiv=1410.4345v2|archiveurl=https://web.archive.org/web/20210215210244/https://arxiv.org/pdf/1410.4345.pdf|archivedate=2021-02-15|access-date=2021-02-15|deadlink=no}}</ref>.', 61 => '', 62 => 'Важная цель разработчиков Python — делать его забавным для использования. Это было отражено в названии языка, данном в честь [[Монти Пайтон]]а<ref name="AutoNT-24">{{cite web |url=https://docs.python.org/3/faq/general.html#why-is-it-called-python |title=General Python FAQ |work=Python v2.7.3 documentation |publisher=Docs.python.org |access-date=2020-06-04 |archive-date=2012-10-24 |archive-url=https://web.archive.org/web/20121024164224/http://docs.python.org/faq/general.html#why-is-it-called-python |url-status=live }}</ref>. Также это отражено в иногда игривом подходе к обучающим программам и справочным материалам, таким как примеры программ из документаций, которые используют названия spam и eggs вместо использующихся в документации множества других языков foo и bar<ref>{{Cite web|url=https://insidetech.monster.com/training/articles/8114-15-ways-python-is-a-powerful-force-on-the-web|title=15 Ways Python Is a Powerful Force on the Web|accessdate=2020-12-28|archive-date=2019-05-11|archive-url=https://web.archive.org/web/20190511065650/http://insidetech.monster.com/training/articles/8114-15-ways-python-is-a-powerful-force-on-the-web|url-status=dead}}</ref><ref>{{Cite web|url=https://docs.python.org/3/library/pprint.html|title=8.18. pprint — Data pretty printer — Python 3.8.3 documentation|website=docs.python.org|access-date=2020-12-28|archive-date=2021-01-22|archive-url=https://web.archive.org/web/20210122224848/https://docs.python.org/3/library/pprint.html|url-status=live}}</ref>.', 63 => '', 64 => '== Портируемость ==', 65 => 'Python [[Портирование программного обеспечения|портирован]] и работает почти на всех известных платформах — от [[Карманный персональный компьютер|КПК]] до [[мейнфрейм]]ов. Существуют порты под [[Microsoft Windows]], практически под все варианты [[UNIX]] (включая [[FreeBSD]] и [[Linux]]), [[Android]]<ref>{{cite web|url=http://www.damonkohler.com/2008/12/python-on-android.html|title=Python on Android|publisher=www.damonkohler.com|accessdate=2009-12-19|lang=en|archiveurl=https://www.webcitation.org/5w4n0S15k?url=http://www.damonkohler.com/2008/12/python-on-android.html|archivedate=2011-01-28}}</ref>, [[Plan 9]], [[Mac OS]] и [[macOS]], [[iOS|iPhone OS (iOS)]] 2.0 и выше, [[iPadOS]], [[Palm OS]], [[OS/2]], [[Amiga]], [[HaikuOS]], [[AS/400]], [[OS/390]], [[Windows Mobile]] и [[Symbian]].', 66 => '', 67 => 'По мере устаревания платформы её поддержка в основной ветви языка прекращается. Например, с версии 2.6 прекращена поддержка [[Windows 95]], [[Windows 98]] и [[Windows ME]]<ref>{{cite web|url=http://docs.python.org/whatsnew/2.6.html#port-specific-changes-windows|title=Port-Specific Changes: Windows|work=Python v2.6.1 documentation. What’s New in Python 2.6|publisher=Python Software Foundation|accessdate=2008-12-11|lang=en|archiveurl=https://www.webcitation.org/5w4n1Glim?url=http://docs.python.org/whatsnew/2.6.html#port-specific-changes-windows|archivedate=2011-01-28}}</ref>. В версии 3.5 перестала поддерживаться [[Windows XP]]<ref>{{Cite web|lang=en|url=https://docs.python.org/3.5/using/windows.html|title=3. Using Python on Windows — Python 3.5.9 documentation|author=|website=Python Documentation|date=|publisher=Python Software Foundation|accessdate=2020-06-08|archive-date=2020-10-15|archive-url=https://web.archive.org/web/20201015064442/https://docs.python.org/3.5/using/windows.html|url-status=live}}</ref> В версии 3.9 перестала поддерживаться [[Windows Vista]] и [[Windows 7]]<ref>{{Cite web|lang=en|url=https://bugs.python.org/issue32592|title=Drop support of Windows Vista and 7 in Python 3.9|access-date=2021-01-10|archive-date=2020-11-04|archive-url=https://web.archive.org/web/20201104213940/https://bugs.python.org/issue32592|url-status=live}}</ref>.', 68 => '', 69 => 'При этом, в отличие от многих портируемых систем, для всех основных платформ Python имеет поддержку характерных для данной платформы технологий (например, Microsoft [[Microsoft Component Object Model|COM]]/[[Microsoft Distributed Component Object Model|DCOM]]). Более того, существует специальная версия Python для [[Виртуальная машина Java|виртуальной машины Java]] — [[Jython]], что позволяет интерпретатору выполняться на любой системе, поддерживающей [[Java]], при этом классы [[Java]] могут непосредственно использоваться из Python и даже быть написанными на Python. Также несколько проектов обеспечивают интеграцию с платформой [[Microsoft.NET]], основные из которых — [[IronPython]] и [[Python.NET]].', 70 => '', 71 => '== Типы и структуры данных ==', 72 => '[[Файл:Python 3. The standard type hierarchy.png|thumb]]', 73 => 'Python поддерживает [[динамическая типизация|динамическую типизацию]], то есть тип переменной определяется только во время исполнения. Поэтому вместо «присваивания значения переменной» лучше говорить о «связывании значения с некоторым именем». Также Python поддерживает подсказки типов с помощью аннотаций, добавляющие поддержку [[Последовательная типизация|последовательной типизации]] и позволяющие использовать статический анализ кода<ref>{{Источник информации|ссылка=https://peps.python.org/pep-0484/|заглавие=PEP 484 - Type Hints|язык=en|издание=Python Enhancement Proposals|дата обращения=2023-10-09}}</ref>. Подсказки типов не используются во время компиляции и исполнения кода непосредственно [[CPython]]<ref>{{Источник информации|ссылка=https://books.google.com/books?id=JidnEAAAQBAJ&newbks=0&printsec=frontcover&pg=PT249&dq=python+static+analysis+Type+Hints&hl=ru|авторы=Luciano Ramalho|заглавие=Fluent Python|язык=en|дата=2022-03-31|издатель=O'Reilly Media, Inc.|страницы=253|страниц=972|isbn=978-1-4920-5630-0}}</ref>, но могут использоваться некоторыми библиотеками, например, [[FastAPI]]. К примитивным типам в Python относятся [[булевский тип|булевый]], целое число произвольной длины, число [[плавающая запятая|с плавающей запятой]] и [[комплексное число]]. Из контейнерных типов в Python встроены: [[строковый тип|строка]], [[список (информатика)|список]], [[кортеж (информатика)|кортеж]], [[ассоциативный массив|словарь]] и [[множество (тип данных)|множество]]<ref name=":14" />. Все значения являются объектами, в том числе функции, методы, модули, классы.', 74 => '', 75 => 'Добавить новый тип можно либо написав [[класс (программирование)|класс]] (class), либо определив новый тип в модуле расширения (например, написанном на языке C). Система классов поддерживает [[наследование (программирование)|наследование]] (одиночное и [[множественное наследование|множественное]]) и [[метапрограммирование]]. Возможно наследование от большинства встроенных типов и типов расширений.', 76 => '{|class="wikitable"', 77 => '|+Типы, используемые в Python', 78 => '|-', 79 => '! Тип', 80 => '! [[Неизменяемый объект|Изменяемость]]', 81 => '! Описание', 82 => '! style="width: 23em;" | Примеры', 83 => '|-', 84 => '| <code>bool</code>', 85 => '| Неизменяемый', 86 => '| [[Логический тип]]', 87 => '| {{code|lang=python|True}}<br>{{code|lang=python|False}}', 88 => '|-', 89 => '| <code>bytearray</code>', 90 => '| Изменяемый', 91 => '| Массив байтов', 92 => '| {{code|lang=python|bytearray(b'Some ASCII')}}<br>{{code|lang=python|bytearray(b"Some ASCII")}}<br>{{code|lang=python|bytearray([119, 105, 107, 105])}}', 93 => '|-', 94 => '| <code>bytes</code>', 95 => '| Неизменяемый', 96 => '| Массив байтов', 97 => '| {{code|lang=python|b'Some ASCII'}}<br>{{code|lang=python|b"Some ASCII"}}<br>{{code|lang=python|bytes([119, 105, 107, 105])}}', 98 => '|-', 99 => '| <code>complex</code>', 100 => '| Неизменяемый', 101 => '| [[Комплексное число]]', 102 => '| {{code|lang=python|3+2.7j}}', 103 => '|-', 104 => '| <code>dict</code>', 105 => '| Изменяемый', 106 => '| Словарь ([[ассоциативный массив]]), представляет собой коллекцию пар «ключ—значение»; значение может быть любого типа, ключ должен иметь хешируемый тип', 107 => '| {{code|lang=python|{'key1': 1.0, 3: False} }}<br>{{code|lang=python|{} }}', 108 => '|-', 109 => '| <code>types.EllipsisType</code>', 110 => '| Неизменяемый', 111 => '| {{Не переведено 5|Многоточие (программирование)|Многоточие|en|Ellipsis (computer programming)}} (эллипсис). Используется в основном в [[NumPy]] для сокращённого задания среза многомерного массива. В самом Python присутствует для поддержки пользовательских типов и таких расширений, как NumPy{{Sfn|Рамальо|2016|p=61}}', 112 => '| {{code|lang=python|...}}<br>{{code|lang=python|Ellipsis}}<br>Для [[NumPy]]: <br>{{code|lang=python|x[i, ..., j]}},<br> что эквивалентно<br>{{code|lang=python|x[i, :, :, j]}}{{Sfn|Рамальо|2016|p=61}}', 113 => '|-', 114 => '| <code>float</code>', 115 => '| Неизменяемый', 116 => '| [[Число с плавающей запятой]]. Степень точности зависит от платформы, но на практике обычно реализуется в виде 64-битного 53-разрядного числа<ref>{{Cite web', 117 => ' |title=15. Floating Point Arithmetic: Issues and Limitations — Python 3.8.3 documentation', 118 => ' |url=https://docs.python.org/3.8/tutorial/floatingpoint.html#representation-error', 119 => ' |access-date=2020-06-06', 120 => ' |website=docs.python.org', 121 => ' |quote=Almost all machines today (November 2000) use IEEE-754 floating point arithmetic, and almost all platforms map Python floats to IEEE-754 “double precision”.', 122 => ' |archive-date=2020-06-06', 123 => ' |archive-url=https://web.archive.org/web/20200606113842/https://docs.python.org/3.8/tutorial/floatingpoint.html#representation-error', 124 => ' |url-status=live', 125 => ' }}</ref>', 126 => '|', 127 => '{{code|lang=python|1.414}}', 128 => '|-', 129 => '| <code>frozenset</code>', 130 => '| Неизменяемый', 131 => '| Неупорядочное [[множество (тип данных)|множество]], не содержит дубликатов; может содержать внутри себя различные хешируемые типы данных', 132 => '| {{code|lang=python|frozenset([4.0, 'string', True])}}', 133 => '|-', 134 => '| <code>int</code>', 135 => '| Неизменяемый', 136 => '| [[Множество (тип данных)|Целое число]] неограниченного размера<ref name="pep0237">{{cite web |url=https://www.python.org/dev/peps/pep-0237/ |title=PEP 237&nbsp;– Unifying Long Integers and Integers |author=Moshe Zadka, Guido van Rossum |date=2001-03-11 |work=Python Enhancement Proposals |publisher=Python Software Foundation |access-date=2011-09-24 |archive-date=2020-05-28 |archive-url=https://web.archive.org/web/20200528063237/https://www.python.org/dev/peps/pep-0237/ |url-status=live }}</ref>', 137 => '| {{code|lang=python|42}}', 138 => '|-', 139 => '| <code>list</code>', 140 => '| Изменяемый', 141 => '| [[Список (информатика)|Список]], может содержать внутри себя различные типы данных', 142 => '| {{code|lang=python|[4.0, 'string', True]}}<br>{{code|lang=python|[]}}', 143 => '|-', 144 => '| <code>NoneType</code>{{ref+|Недоступно непосредственно по имени типа.|К|П}}', 145 => '| Неизменяемый', 146 => '| Объект, представляющий собой отсутствие значения, часто называемый {{Не переведено 5|Null pointer|Null|en|Null pointer}} в других языках.', 147 => '| {{code|lang=python|None}}', 148 => '|-', 149 => '| <code>NotImplementedType</code>{{ref+||К|П}}', 150 => '| Неизменяемый', 151 => '| Объект, который возвращается при [[Перегрузка операторов|перегрузке операторов]], когда типы операндов не поддерживаются.', 152 => '| {{code|lang=python|NotImplemented}}', 153 => '|-', 154 => '| <code>range</code>', 155 => '| Неизменяемый', 156 => '| Последовательность целых чисел от какого-то одного значения до другого, обычно используется для повторения операции несколько раз при помощи for<ref>{{cite web |title=Built-in Types |url=https://docs.python.org/3/library/stdtypes.html#typesseq-range |access-date=2019-10-03 |archive-date=2020-06-14 |archive-url=https://web.archive.org/web/20200614194325/https://docs.python.org/3/library/stdtypes.html#typesseq-range |url-status=live }}</ref>', 157 => '| {{code|lang=python|range(1, 10)}}<br>{{code|lang=python|range(10, -5, -2)}}', 158 => '|-', 159 => '| <code>set</code>', 160 => '| Изменяемый', 161 => '| Неупорядочное [[множество (тип данных)|множество]], не содержит дубликатов; может содержать внутри себя различные хешируемые типы данных', 162 => '| {{code|lang=python|{4.0, 'string', True} }}<br>{{code|lang=python|set()}}', 163 => '|-', 164 => '| <code>str</code>', 165 => '| Неизменяемый', 166 => '| [[Строковый тип]]', 167 => '| {{code|lang=python|'Wikipedia'}}<br>{{code|lang=python|"Wikipedia"}}<br><syntaxhighlight lang="python">"""Spanning', 168 => 'multiple', 169 => 'lines"""</syntaxhighlight>', 170 => '|-', 171 => '| <code>tuple</code>', 172 => '| Неизменяемый', 173 => '| [[Кортеж (информатика)|Кортеж]]. Может содержать внутри себя различные типы данных. Может использоваться в качестве неизменяемого списка и в качестве записей с неименованными полями{{Sfn|Рамальо|2016|pp=52—54}}', 174 => '| В качестве неизменяемого списка: <br>{{code|lang=python|(4.0, 'string', True)}}<br>{{code|lang=python|('single element',)}}<br>{{code|lang=python|()}}<br>В качестве записей:<br>{{code|lang=python|lax_coordinates {{=}} (33.9425, -118.408056)}} <br>{{code|lang=python|city, year, pop, chg, area {{=}} ('Tokyo', 2003, 32450, 0.66, 8014)}}{{Sfn|Рамальо|2016|pp=52—54}}', 175 => '|}', 176 => '', 177 => '== Синтаксис и семантика ==', 178 => '{{Основная статья|Синтаксис и семантика Python}}', 179 => '', 180 => '=== Операторы ===', 181 => 'Набор операторов достаточно традиционен.', 182 => '', 183 => '* Условный оператор <code>if</code> (если). При наличии нескольких условий и альтернатив применяется необязательный блок <code>elif</code>(сокращение от else if) который может повторяться в коде неограниченное число раз. Если ни одно из условий не было соблюдено, то выполняется необязательный блок <code>else</code> (иначе).', 184 => '* Оператор цикла <code>while</code>.', 185 => '* Оператор итерации <code>for</code>.', 186 => '* Операторы обработки исключений <code>try</code> — <code>except</code> — <code>else</code> — <code>finally</code>.', 187 => '* Оператор определения класса <code>class</code>.', 188 => '* Оператор определения функции, метода или генератора <code>def</code>. Внутри возможно применение <code>return</code> (возврат) для возврата из функции или метода, а в случае генератора — <code>yield</code> (давать).', 189 => '* Оператор [[Сопоставление с образцом|сопоставления с образцом]] (начиная с Python 3.10) <code>match</code> — <code>case</code>.', 190 => '* Операторы вызова исключений <code>raise</code> и <code>assert</code>.', 191 => '* Оператор <code>pass</code> ничего не делает. Используется для пустых блоков кода.', 192 => '', 193 => '=== Система отступов ===', 194 => 'Одной из интересных синтаксических особенностей языка является выделение [[блок (программирование)|блоков]] кода с помощью отступов (пробелов или табуляций), поэтому в Python отсутствуют [[операторные скобки]] begin/end, как в языке [[Паскаль (язык программирования)|Паскаль]], или фигурные скобки, как в [[Си (язык программирования)|Си]]. Такой «трюк» позволяет сократить количество строк и символов в программе и приучает к «хорошему» стилю программирования. С другой стороны, поведение и даже корректность программы может зависеть от начальных пробелов в тексте. Тем, кто привык программировать на языках с явным выделением начала и конца блоков, такое поведение поначалу может показаться неинтуитивным и неудобным.', 195 => '', 196 => 'Сам Гвидо писал<ref name="foreword" />:', 197 => '{{начало цитаты}}', 198 => 'Наверное, самой спорной особенностью Python является использование отступов для группировки операторов, что взято непосредственно из [[ABC (язык программирования)|ABC]]. Это одна из особенностей языка, которая дорога моему сердцу. Это делает код Python более читабельным двумя способами. Во-первых, использование отступов уменьшает визуальное нагромождение и делает программы короче, тем самым сокращая объём внимания, необходимого для восприятия базовой единицы кода. Во-вторых, это даёт программисту меньше свободы в форматировании, тем самым делая возможным более единообразный стиль, что облегчает чтение чужого кода. (Сравните, например, [[Отступ (программирование)#Отступы в Си|три или четыре различных соглашения]] о размещении фигурных скобок в [[Си (язык программирования)|Си]], каждое из которых имеет сильных сторонников).', 199 => '{{оригинальный текст|en|Perhaps Python's most controversial feature is its use of indentation for statement grouping, which derives directly from ABC. It is one of the language's features that is dearest to my heart. It makes Python code more readable in two ways. First, the use of indentation reduces visual clutter and makes programs shorter, thus reducing the attention span needed to take in a basic unit of code. Second, it allows the programmer less freedom in formatting, thereby enabling a more uniform style, which makes it easier to read someone else's code. (Compare, for instance, the three or four different conventions for the placement of braces in C, each with strong proponents.)}}', 200 => '{{конец цитаты}}', 201 => '', 202 => '=== Выражения ===', 203 => 'Состав, синтаксис, ассоциативность и приоритет операций достаточно привычны для языков программирования и призваны минимизировать употребление скобок. Если сравнивать с математикой, то приоритеты операторов зеркалируют соответствующие в математике, при этом оператор присвоения значения <code>=</code> соответствует типографскому <code>←</code>. Хотя приоритеты операций позволяют не использовать скобки во многих случаях, на анализ больших выражений может тратиться лишнее время, в результате чего в таких случаях выгоднее явно расставлять скобки<ref name=":5" />.', 204 => '', 205 => 'Отдельно стоит упомянуть ''операцию форматирования'' для строк (работает по аналогии с функцией <code>printf()</code> из Си), которая использует тот же символ, что и взятие остатка от деления:', 206 => '<source lang="python">', 207 => '>>> str_var = "world"', 208 => '>>> print("Hello, %s" % str_var)', 209 => 'Hello, world', 210 => '</source>', 211 => '', 212 => 'В версии 3.6 были добавлены ''форматированные строковые литералы'', или ''f-строки,'' которые делают код более читаемым и лаконичным:<syntaxhighlight lang="python3">', 213 => '>>> str_var = "world"', 214 => '>>> print(f"Hello, {str_var}") # вывод с использованием f-строки', 215 => 'Hello, world', 216 => '</syntaxhighlight>Python имеет удобные ''цепочечные сравнения'':', 217 => '<source lang="python">', 218 => '1 <= a < 10 and 1 <= b < 20', 219 => '</source>', 220 => '', 221 => 'Кроме того, логические операции (<code>or</code> и <code>and</code>) являются [[Ленивые вычисления|ленивыми]]: если для вычисления значения операции достаточно первого операнда, этот операнд и является результатом, в противном случае вычисляется второй операнд логической операции. Это основывается на свойствах [[Алгебра логики|алгебры логики]]: например, если один аргумент операции «ИЛИ» (<code>or</code>) является истиной, то и результат этой операции всегда является истиной. В случае, если второй операнд является сложным выражением, это позволяет сократить издержки на его вычисление. Этот факт широко использовался до версии 2.5 вместо условной конструкции:', 222 => '<source lang="python">', 223 => 'a < b and "меньше" or "больше или равно"', 224 => '</source>', 225 => '', 226 => 'Встроенные типы данных, как правило, имеют особый синтаксис для своих литералов (записанных в исходном коде констант):', 227 => '<source lang="python">', 228 => '"строка и Юникод-строка одновременно"', 229 => ''строка и Юникод-строка одновременно'', 230 => '"""тоже строка и Юникод-строка одновременно"""', 231 => 'True or False # булевы литералы', 232 => '3.14 # число с плавающей запятой', 233 => '0b1010 + 0o12 + 0xA # числа в двоичной, восьмеричной и шестнадцатеричной системах счисления', 234 => '1 + 2j # комплексное число', 235 => '[1, 2, "a"] # список', 236 => '(1, 2, "a") # кортеж', 237 => '{'a': 1, 'b': 'B'} # словарь', 238 => '{'a', 6, 8.8} # множество', 239 => 'lambda x: x**2 # анонимная функция', 240 => '(i for i in range(10)) # генератор', 241 => '</source>', 242 => '', 243 => 'Для списков (и других последовательностей) Python предлагает набор операций над срезами. Особенностью является индексация, которая может показаться новичку странной, но раскрывает свою согласованность по мере использования. Индексы элементов списка начинаются с нуля. Запись среза <code>s[N:M]</code> означает, что в срез попадают все элементы от N включительно до M, не включая. При этом индекс можно не указывать. Например, запись <code>s[:M]</code> означает, что в срез попадают все элементы с самого начала; запись <code>s[N:]</code> означает, что попадают все элементы до конца среза; запись <code>s[:]</code> означает, что попадают все элементы с начала и до конца.', 244 => '', 245 => '=== Имена ===', 246 => 'Имя (идентификатор) может начинаться с буквы любого алфавита в [[Юникод]]е любого регистра или подчёркивания, после чего в имени можно использовать и цифры. В качестве имени нельзя использовать ключевые слова (их список можно узнать по <code>import keyword; print(keyword.kwlist)</code>) и нежелательно переопределять встроенные имена. Имена, начинающиеся с символа подчёркивания, имеют специальное значение<ref>{{cite web|url=http://docs.python.org/reference/lexical_analysis.html#reserved-classes-of-identifiers|title=2.3.2. Reserved classes of identifiers|work=Python documentation|date=2009-10-18|archiveurl=https://www.webcitation.org/5w4n2As6O?url=http://docs.python.org/reference/lexical_analysis.html#reserved-classes-of-identifiers|archivedate=2011-01-28}}</ref>.', 247 => '', 248 => 'В каждой точке программы интерпретатор имеет доступ к трём [[пространство имён (программирование)|пространствам имён]] (то есть отображениям имён в объекты): локальному, глобальному и встроенному.', 249 => '', 250 => '''Области видимости'' имён могут быть вложенными друг в друга (внутри определяемой функции видны имена из окружающего блока кода). На практике с областями видимости и связыванием имён связано несколько правил «хорошего тона», о которых можно подробнее узнать из документации.', 251 => '', 252 => '=== Строки документации ===', 253 => 'Python предлагает механизм [[Техническая документация|документирования]] кода pydoc. В начало каждого модуля, класса, функции вставляется строка документации — ''{{не переведено|docstring||en|docstring}}''. Строки документации остаются в коде на момент времени исполнения, и в язык встроен доступ к документации<ref>{{Cite web |url=http://softwaremaniacs.org/blog/2005/12/08/django/ |title=…целостность больших проектов на Python строится на двух вещах: тесты и doc-строка |access-date=2008-10-31 |archive-date=2008-10-21 |archive-url=https://web.archive.org/web/20081021094143/http://softwaremaniacs.org/blog/2005/12/08/django/ |url-status=live }}</ref>(переменная <code>__doc__</code>), что используется современными IDE ([[Интегрированная среда разработки]]) (например, [[Eclipse (среда разработки)|Eclipse]]).', 254 => '', 255 => 'В интерактивном режиме можно получить помощь, сгенерировать гипертекстовую документацию по целому модулю или даже применить ''{{не переведено|doctest||en|doctest}}'' для автоматического тестирования модуля.', 256 => '', 257 => '== [[Парадигма программирования|Парадигмы программирования]] ==', 258 => 'Python — [[мультипарадигменный язык программирования]]. Полностью поддерживаются [[Объектно-ориентированное программирование|объектно-ориентированное]], [[структурное программирование|структурное]]<ref name=":6">{{Cite web|lang=en|url=http://facweb.cs.depaul.edu/sjost/it211/documents/structured.htm|title=Structured Programming Details|author=Steve D. Jost|website=[[Университет Де Поля]]|date=2019|access-date=2021-02-17|archive-date=2020-04-29|archive-url=https://web.archive.org/web/20200429100316/http://facweb.cs.depaul.edu/sjost/it211/documents/structured.htm|url-status=live}}</ref>, [[Обобщённое программирование|обобщённое]], [[Функциональное программирование|функциональное]] программирование<ref name=":2" /> и [[метапрограммирование]]<ref name=":12" />. Базовая поддержка [[Аспектно-ориентированное программирование|аспектно-ориентированного]] программирования реализуется за счёт метапрограммирования<ref name=":13" />. Множество других методик, в том числе [[контрактное программирование|контрактное]]<ref name="AutoNT-15">{{cite web |url=http://www.nongnu.org/pydbc/ |title=PyDBC: method preconditions, method postconditions and class invariants for Python |access-date=2011-09-24 |archive-date=2019-11-23 |archive-url=https://web.archive.org/web/20191123231931/http://www.nongnu.org/pydbc/ |url-status=live }}</ref><ref name="AutoNT-16">{{cite web |url=http://www.wayforward.net/pycontract/ |title=Contracts for Python |access-date=2011-09-24 |archive-date=2020-06-15 |archive-url=https://web.archive.org/web/20200615173404/http://www.wayforward.net/pycontract/ |url-status=live }}</ref> и [[логическое программирование]]<ref name="AutoNT-17">{{cite web |url=https://sites.google.com/site/pydatalog/ |title=PyDatalog |access-date=2012-07-22 |archive-date=2020-06-13 |archive-url=https://web.archive.org/web/20200613160231/https://sites.google.com/site/pydatalog/ |url-status=live }}</ref> можно реализовать с помощью расширений.', 259 => '', 260 => '=== [[Объектно-ориентированное программирование]] ===', 261 => 'Дизайн языка Python построен вокруг объектно-ориентированной модели программирования. Реализация [[Объектно-ориентированное программирование|ООП]] в Python является хорошо продуманной, но вместе с тем достаточно специфической по сравнению с другими [[Объектно-ориентированный язык программирования|объектно-ориентированными языками]]. В языке всё является объектами — либо экземплярами классов, либо экземплярами метаклассов. Исключением является базовый встроенный метакласс <code>'''type'''</code>. Таким образом, классы на самом деле являются экземплярами метаклассов, а производные метаклассы являются экземплярами метакласса <code>'''type'''</code>. Метаклассы являются частью концепции метапрограммирования и предоставляют возможность управления наследованием классов, что позволяет создавать абстрактные классы, регистрировать классы или добавлять в них какой-либо программный интерфейс в рамках [[Библиотека (программирование)|библиотеки]] или [[фреймворк]]а<ref name=":12" />.', 262 => '', 263 => 'Классы по своей сути представляют план или описание того, как создать объект, и хранят в себе описание атрибутов объекта и методов для работы с ним. Парадигма ООП основывается на [[Инкапсуляция (программирование)|инкапсуляции]], [[Наследование (программирование)|наследовании]] и [[Полиморфизм (информатика)|полиморфизме]]<ref name=":15" />. Инкапсуляция в Python представлена возможностью хранения публичных и скрытых [[Поле класса|атрибутов]] (полей) в объекте с предоставлением [[Метод (программирование)|методов]] для работы с ними<ref name=":15" />, при этом на самом деле все атрибуты являются публичными, но для пометки скрытых атрибутов существует соглашение об именовании<ref name=":16" />. Наследование позволяет создавать производные объекты без необходимости повторного написания кода, а полиморфизм заключается в возможности переопределения любых методов объекта (в Python все методы являются [[Виртуальный метод|виртуальными]]<ref name=":16">{{Cite web|lang=en|url=https://docs.python.org/3/tutorial/classes.html|title=9. Classes|website=Python 3.9.2 documentation|publisher=docs.python.org|archive-url=https://web.archive.org/web/20210314111300/https://docs.python.org/3/tutorial/classes.html|archive-date=2021-03-14|access-date=2021-03-14|url-status=live}}</ref>), а также в перегрузке [[Перегрузка процедур и функций|методов]] и [[Перегрузка операторов|операторов]]. Перегрузка методов в Python реализуется за счёт возможности вызова одного и того же метода с разным набором аргументов<ref name=":15">{{Cite web|lang=en|url=https://developer.ibm.com/languages/python/tutorials/object-oriented-programming-in-python/|title=Object-oriented programming in Python|website=IBM Developer|date=2020-10-20|publisher=ibm.com|archive-url=https://web.archive.org/web/20210311194854/https://developer.ibm.com/languages/python/tutorials/object-oriented-programming-in-python/|archive-date=2021-03-11|access-date=2021-03-11|url-status=live}}</ref>. Особенностью Python является возможность модифицировать классы после их объявления, добавляя в них новые атрибуты и методы<ref name=":5" />, также можно модифицировать и сами объекты, в результате чего классы могут использоваться как структуры для хранения произвольных данных<ref name=":16" />.', 264 => '', 265 => 'В Python поддерживается множественное наследование. Само по себе множественное наследование является сложным, и его реализации сталкиваются с проблемами разрешения коллизий имён между родительскими классами и с возможным повторным наследованием от одного и того же класса в иерархии. В Python методы вызываются согласно порядку разрешения методов (MRO), который основан на алгоритме [[C3-линеаризация|C3-линеаризации]]<ref>{{Статья|ссылка=https://thesai.org/Publications/ViewPaper?Volume=8&Issue=6&Code=IJACSA&SerialNo=14|автор=Fawzi Albalooshi, Amjad Mahmood|заглавие=A Comparative Study on the Effect of Multiple Inheritance Mechanism in Java, C++, and Python on Complexity and Reusability of Code|год=2017|язык=en|издание=International Journal of Advanced Computer Science and Applications (IJACSA)|том=8|выпуск=6|issn=2156-5570|doi=10.14569/IJACSA.2017.080614|archiveurl=https://web.archive.org/web/20200710024816/https://thesai.org/Downloads/Volume8No6/Paper_14-A_Comparative_Study_on_the_Effect_of_Multiple.pdf|archivedate=2020-07-10|access-date=2021-03-12|deadlink=no}}</ref>, в обычных случаях при написании программ не требуется знать принцип работы данного алгоритма, понимание же может потребоваться при создании нетривиальных иерархий классов<ref>{{Cite web|lang=en|url=https://www.python.org/download/releases/2.3/mro/|title=The Python 2.3 Method Resolution Order|author=Michele Simionato|website=Python.org|archive-url=https://web.archive.org/web/20210314152959/https://www.python.org/download/releases/2.3/mro/|archive-date=2021-03-14|access-date=2021-03-14|url-status=live}}</ref>.', 266 => '', 267 => 'Возможности и особенности, специфичные для Python:', 268 => '', 269 => '* Специальные методы, управляющие жизненным циклом объекта: конструкторы, деструкторы.', 270 => '* Перегрузка операторов (всех, кроме <code>is, '.', '='</code> и символьных логических).', 271 => '* Свойства (имитация поля с помощью функций).', 272 => '* Управление доступом к полям (эмуляция полей и методов, частичный доступ, и т. п.).', 273 => '* Методы для управления наиболее распространёнными операциями (истинностное значение, <code>len()</code>, глубокое копирование, [[сериализация]], итерация по объекту, …).', 274 => '* Полная [[Интроспекция (программирование)|интроспекция]].', 275 => '* Классовые и статические методы, классовые поля.', 276 => '* Классы, вложенные в функции и классы.', 277 => '* Возможность модифицировать объекты во время исполнения программы.', 278 => '', 279 => '=== [[Обобщённое программирование]] ===', 280 => 'Языки с поддержкой динамической типизации и объектно-ориентированного программирования обычно не рассматриваются в рамках обобщённого программирования, поскольку задачи обобщённого программирования решаются за счёт отсутствия ограничений на типы данных<ref name=":8">{{Статья|ссылка=https://link.springer.com/chapter/10.1007/978-3-642-45404-2_5|автор=Alexandre Bergel, Lorenzo Bettini|заглавие=Generic Programming in Pharo|год=2013|ответственный=José Cordeiro, Slimane Hammoudi, Marten van Sinderen|язык=en|место=Berlin, Heidelberg|издание=Software and Data Technologies|издательство=Springer|страницы=66–79|isbn=978-3-642-45404-2|doi=10.1007/978-3-642-45404-2_5|archiveurl=https://web.archive.org/web/20210213175706/https://link.springer.com/chapter/10.1007/978-3-642-45404-2_5|archivedate=2021-02-13|access-date=2021-02-13|deadlink=no}}</ref><ref name=":9">{{Статья|ссылка=https://arxiv.org/pdf/2011.02626v1.pdf|автор=R. Peschke, K. Nishimura, G. Varner|заглавие=ARGG-HDL: A High Level Python BasedObject-Oriented HDL Framework|год=2020|язык=en|издание=IEEE Transactions on Nuclear Science|тип=pre-print|месяц=10|arxiv=011.02626v1|access-date=2021-02-13|archive-date=2020-11-07|archive-url=https://web.archive.org/web/20201107012516/https://arxiv.org/pdf/2011.02626v1.pdf|deadlink=no|archivedate=2020-11-07|archiveurl=https://web.archive.org/web/20201107012516/https://arxiv.org/pdf/2011.02626v1.pdf}}</ref>. В Python обобщённое программирование со строгой типизацией достигается использованием средств языка совместно со внешними анализаторами кода<ref>{{Cite web|lang=en|url=https://www.python.org/dev/peps/pep-0484/|title=PEP 484 -- Type Hints|website=Python.org|date=2014-09-24|archiveurl=https://web.archive.org/web/20210209180311/https://www.python.org/dev/peps/pep-0484/|archivedate=2021-02-09|accessdate=2021-02-13|url-status=live}}</ref>, такими как Mypy<ref>{{Cite web|lang=en|url=https://mypy.readthedocs.io/en/stable/generics.html|title=Generics|author=Jukka Lehtosalo|website=Mypy 0.800 documentation|date=2016|publisher=Read the Docs|archiveurl=https://web.archive.org/web/20210213135624/https://mypy.readthedocs.io/en/stable/generics.html|archivedate=2021-02-13|accessdate=2021-02-13|url-status=live}}</ref>.', 281 => '', 282 => '=== [[Функциональное программирование]] ===', 283 => 'Несмотря на то, что Python изначально не задумывался как язык функционального программирования{{sfn|Рамальо|2016|pp=188—191}}, он поддерживает функциональный стиль программирования, в частности<ref name=":4">{{Книга|автор=David Mertz|заглавие=Functional Programming in Python|год=2015|издательство=O'Reilly|isbn=978-1491928561|язык=en}}</ref>:', 284 => '', 285 => '* функция является объектом первого класса,', 286 => '* функции высших порядков,', 287 => '* рекурсия,', 288 => '* фокус на работу со [[Список (информатика)|списками]],', 289 => '* аналог [[Замыкание (программирование)|замыканий]],', 290 => '* частичное применение функции с помощью метода <code>partial()</code>,', 291 => '* возможность реализации других средств на самом языке (например, [[карринг]]).', 292 => '', 293 => 'Однако, в отличие от большинства языков, непосредственно ориентированных на функциональное программирование, Python не является [[Чистота языка программирования|чистым языком программирования]] и код не защищён от [[Побочный эффект (программирование)|побочных эффектов]]<ref name=":4" />{{sfn|Рамальо|2016|p=273}}.', 294 => '', 295 => 'В стандартной библиотеке Python существуют специальные пакеты <code>operator</code> и <code>functools</code> для функционального программирования{{sfn|Рамальо|2016|pp=188—191}}.', 296 => '', 297 => '=== [[Метапрограммирование]] ===', 298 => '{{В планах|дата=2023-02-08}}', 299 => 'Python поддерживает [[метапрограммирование]]{{Sfn|Рамальо|2016|pp=613—708}}<ref name=":12" />.', 300 => '', 301 => '=== [[Асинхронное программирование]] ===', 302 => '{{Заготовка раздела|Асинхронное программирование на Python}}', 303 => 'Python, начиная с 3.5, стал поддерживать асинхронное программирование. Появились операторы <code>async</code> и <code>await</code>, а также библиотека <code>asyncio</code><ref name=":23" /><syntaxhighlight lang="python3">', 304 => 'import asyncio', 305 => '', 306 => 'async def main():', 307 => ' print('Hello ...')', 308 => ' await asyncio.sleep(1)', 309 => ' print('... World!')', 310 => '', 311 => 'asyncio.run(main())', 312 => '</syntaxhighlight><code>async</code> является атрибутом, который создает [[Асинхронное программирование|асинхронную]] функцию<ref name=":23" />', 313 => '', 314 => '<code>await</code> позволяет выполнять асинхронные генераторы<ref name=":23" />', 315 => '', 316 => '== Возможности ==', 317 => '', 318 => '=== [[Модуль (программирование)|Модули]] и пакеты ===', 319 => 'Программное обеспечение (приложение или библиотека) на Python оформляется в виде модулей, которые в свою очередь могут быть собраны в ''пакеты''. Модули могут располагаться как в [[Каталог (файловая система)|каталогах]], так и в [[ZIP|ZIP-архивах]]. Модули могут быть двух типов по своему происхождению: модули, написанные на «чистом» Python, и модули расширения (extension modules), написанные на других языках программирования. Например, в стандартной библиотеке есть «чистый» модуль pickle и его аналог на Си: cPickle. Модуль оформляется в виде отдельного файла, а пакет — в виде отдельного каталога. Подключение модуля к программе осуществляется оператором <code>import</code>. После импорта модуль представлен отдельным объектом, дающим доступ к пространству имён модуля. В ходе выполнения программы модуль можно перезагрузить функцией <code>reload()</code>.', 320 => '', 321 => '=== [[Интроспекция (программирование)|Интроспекция]] ===', 322 => 'Python поддерживает полную [[Интроспекция (программирование)|интроспекцию]] времени исполнения<ref>{{статья| автор= Патрик О'Брайен| заглавие= Руководство по интроспекции на Python| оригинал= | ссылка= http://www.citforum.ru/programming/python/introspec.shtml| язык= | ответственный= [http://www.iso.ru/ Intersoft Lab]| archivedate= 2021-07-21| archiveurl= https://web.archive.org/web/20210721011912/http://citforum.ru/programming/python/introspec.shtml}}</ref>. Это означает, что для любого объекта можно получить всю информацию о его внутренней структуре.', 323 => '', 324 => 'Применение интроспекции является важной частью того, что называют [[Pythonic style]], и широко применяется в библиотеках и [[фреймворк]]ах Python, таких как [[PyRO]], [[PLY]], [[Cherry]], [[Django]] и др., значительно экономя время использующего их программиста.', 325 => '', 326 => 'Необходимые для интроспекции данные хранятся в специальных атрибутах. Так, например, получить все пользовательские атрибуты большинства объектов можно из специального атрибута — словаря (или другого объекта, предоставляющего интерфейс <code>dict</code>) <code>__dict__</code>', 327 => '', 328 => '<source lang="python">', 329 => ' >>> class x(object):pass', 330 => ' ....', 331 => ' >>> f = x()', 332 => ' >>> f.attr = 12', 333 => ' >>> print(f.__dict__)', 334 => ' {'attr': 12}', 335 => ' >>> print(x.__dict__) # т.к. классы тоже являются экземплярами объекта type', 336 => ' # то и они поддерживают этот тип интроспекции', 337 => ' {'__dict__': <attribute '__dict__' of 'x' objects>, '__module__'.......', 338 => '</source>', 339 => '', 340 => 'Есть также другие атрибуты, имена и назначение которых зависят от объекта:', 341 => '', 342 => '<source lang="python">', 343 => ' >>> def f():pass', 344 => ' ....', 345 => ' >>> f.func_code.co_code # получение байтокода функции', 346 => ' 'd\x00\x00S'', 347 => ' >>> f.__class__ # специальный атрибут - ссылка на класс данного объекта', 348 => ' <type 'function'>', 349 => '</source>', 350 => '', 351 => 'Подавляющее большинство атрибутов, поддерживающих интроспекцию, является классовым, и их, в свою очередь, можно получить из <code>obj.__class__.__dict__</code>. Часть информации, унаследованную от базового класса, все объекты используют совместно, что позволяет экономить память.', 352 => '', 353 => 'Для удобства получения интроспективной информации в Python есть модуль <code>inspect</code>{{sfn|Beazley|2009|pp=222—225}}.', 354 => '', 355 => '<source lang="python">', 356 => ' >>> def f(x,y = 10,**mp):pass', 357 => ' ...', 358 => ' >>> inspect.getargspec(f)', 359 => ' (['x', 'y'], None, 'mp', (10,))', 360 => '</source>', 361 => '', 362 => 'С помощью модуля <code>new</code> возможен обратный процесс — построения объекта из составных частей на этапе исполнения', 363 => '', 364 => '<source lang="python">', 365 => ' >>> def f(i): return j + i', 366 => ' ....', 367 => ' >>> j = 2', 368 => ' >>> f(1)', 369 => ' 3', 370 => ' >>> import new', 371 => ' >>> g = new.function(f.func_code, {'j': 23})', 372 => ' >>> g(1)', 373 => ' 24', 374 => '</source>', 375 => '', 376 => '=== [[Обработка исключений]] ===', 377 => 'Обработка исключений поддерживается в Python посредством операторов <code>try, except, else, finally, raise</code>, образующих блок обработки исключения. В общем случае блок выглядит следующим образом:', 378 => '<source lang="python">', 379 => 'try:', 380 => ' # Здесь код, который может вызвать исключение', 381 => ' raise Exception("message") # Exception, это один из стандартных типов исключения (всего лишь класс),', 382 => ' # может использоваться любой другой, в том числе свой', 383 => 'except (Тип исключения1, Тип исключения2, …) as Переменная:', 384 => ' # Код в блоке выполняется, если тип исключения совпадает с одним из типов', 385 => ' # (Тип исключения1, Тип исключения2, …) или является наследником одного', 386 => ' # из этих типов.', 387 => ' # Полученное исключение доступно в необязательной Переменной.', 388 => 'except (Тип исключения3, Тип исключения4, …) as Переменная:', 389 => ' # Количество блоков except не ограничено', 390 => ' raise # Сгенерировать исключение "поверх" полученного; без параметров - повторно сгенерировать полученное', 391 => 'except:', 392 => ' # Будет выполнено при любом исключении, не обработанном типизированными блоками except', 393 => 'else:', 394 => ' # Код блока выполняется, если не было поймано исключений.', 395 => 'finally:', 396 => ' # Будет исполнено в любом случае, возможно после соответствующего', 397 => ' # блока except или else', 398 => '</source>', 399 => 'Совместное использование <code>else, except</code> и <code>finally</code> стало возможно только начиная с Python 2.5. Информация о текущем исключении всегда доступна через <code>sys.exc_info()</code>. Кроме значения исключения, Python также сохраняет состояние стека вплоть до точки возбуждения исключения — так называемый traceback.', 400 => '', 401 => 'В отличие от компилируемых языков программирования, в Python использование исключения не приводит к значительным накладным расходам (а зачастую даже позволяет ускорить исполнение программ) и очень широко используется. Исключения согласуются с философией Python (10-й пункт «[[#Философия|дзена Python]]» — «Ошибки никогда не должны умалчиваться») и являются одним из средств поддержки «[[Утиная типизация|утиной типизации]]».', 402 => '', 403 => 'Иногда вместо явной обработки исключений удобнее использовать блок [[Python#Управление контекстом выполнения|<code>with</code>]] (доступен, начиная с Python 2.5).', 404 => '', 405 => '=== [[Итератор]]ы ===', 406 => 'В программах на Python широко используются итераторы. Цикл <code>for</code> может работать как с последовательностью, так и с итератором. Большинство коллекций предоставляют итераторы, итераторы могут также определяться пользователем для собственных объектов. Модуль <code>itertools</code> стандартной библиотеки содержит средства работы с итераторами.', 407 => '', 408 => '=== [[Генератор (программирование)|Генераторы]] ===', 409 => 'Одной из интересных возможностей языка являются '''генераторы''' — функции, сохраняющие внутреннее состояние: значения локальных переменных и текущую инструкцию (см. также: [[сопрограмма|сопрограммы]]). Генераторы могут использоваться как [[Итератор (программирование)|итераторы]] для структур данных и для [[ленивые вычисления|ленивых вычислений]].', 410 => '', 411 => 'При вызове генератора функция немедленно возвращает объект-итератор, который хранит текущую точку исполнения и состояние локальных переменных функции. При запросе следующего значения (посредством метода <code>next()</code>, неявно вызываемого в цикле <code>for</code>) генератор продолжает исполнение функции от предыдущей точки остановки до следующего оператора <code>yield</code> или <code>return</code>.', 412 => '', 413 => 'В Python 2.4 появились '''генераторные выражения''' — выражения, дающие в результате генератор. Генераторные выражения позволяют сэкономить память там, где иначе требовалось бы использовать список с промежуточными результатами:', 414 => '<source lang="python">', 415 => '>>> sum(i for i in range(1, 100) if i % 2 != 0)', 416 => '2500', 417 => '</source>', 418 => 'В этом примере суммируются все нечётные числа от 1 до 99.', 419 => '', 420 => 'Начиная с версии 2.5, Python поддерживает полноценные сопроцедуры: теперь в генератор можно передавать значения с помощью метода <code>send()</code> и возбуждать в его контексте исключения с помощью метода <code>throw()</code>.', 421 => '', 422 => 'Также Python поддерживает вложенные генераторы. Например, для создания двумерного массива нужно разместить генератор списка, являющегося строкой, внутри генератора всех строк: <code>[[0 for j in range(m)] for i in range(n)]</code>', 423 => '', 424 => '=== Управление контекстом выполнения ===', 425 => 'В Python 2.5 появились средства для управления контекстом выполнения блока кода — оператор <code>with</code> и модуль <code>contextlib</code>. См.: [[v:Практика по языку Python/Примеры программ на языке Python#Управление контекстом выполнения|пример]].', 426 => '', 427 => 'Оператор может применяться в тех случаях, когда до и после некоторых действий должны обязательно выполняться некоторые другие действия, независимо от возбуждённых в блоке исключений или операторов <code>return</code>: файлы должны быть закрыты, ресурсы освобождены, перенаправление стандартного ввода вывода закончено и т. п. Оператор улучшает читаемость кода, а значит, помогает предотвращать ошибки.', 428 => '', 429 => '=== Декораторы ===', 430 => '{{не путать|Декоратор (шаблон проектирования)|одноимённым шаблоном проектирования}}', 431 => '{{В планах|дата=2023-02-08}}', 432 => 'Декораторы функций — вызываемые объекты, которые принимают другую функцию в качестве аргумента. Декораторы функций могут производить операции с функцией и возвращают либо саму функцию, либо другую заменяющую её функцию или вызываемый объект. То есть, если в коде ранее был прописан декоратор, названный decorate, то следующий код{{sfn|Рамальо|2016|pp=214—246}}:', 433 => '', 434 => ': <syntaxhighlight lang="python">', 435 => '@decorate', 436 => 'def target():', 437 => ' print('running target()')', 438 => '</syntaxhighlight>', 439 => '', 440 => 'эквивалентен этому{{sfn|Рамальо|2016|pp=214—246}}:', 441 => '', 442 => ': <syntaxhighlight lang="python">', 443 => 'def target():', 444 => ' print('running target()')', 445 => 'target = decorate(target)', 446 => '</syntaxhighlight>', 447 => '', 448 => 'Это позволяет сократить использование кода.', 449 => '', 450 => 'Пример использования декоратора функции{{sfn|Рамальо|2016|pp=214—246}}:', 451 => '', 452 => ': <syntaxhighlight lang="pycon">', 453 => '>>> def deco(func):', 454 => '... def inner():', 455 => '... print('running inner()')', 456 => '... return inner', 457 => '…', 458 => '>>> @deco', 459 => '... def target():', 460 => '... print('running target()')', 461 => '>>> target()', 462 => 'running inner()', 463 => '>>> target', 464 => '<function deco.<locals>.inner at 0.10063b598>', 465 => '</syntaxhighlight>', 466 => '', 467 => 'Существуют декораторы классов{{sfn|Рамальо|2016|pp=686—688}}.', 468 => '', 469 => '=== [[Регулярные выражения]] ===', 470 => 'Формат регулярных выражений унаследован из [[Perl]] с некоторыми отличиями. Для их использования требуется импортировать модуль <code>re</code><ref>{{Cite web |url=https://docs.python.org/3/library/re.html |title=6.2. re — Regular expression operations — Python 3.5.1 documentation |access-date=2016-05-11 |archive-date=2018-07-18 |archive-url=https://web.archive.org/web/20180718132241/https://docs.python.org/3/library/re.html |url-status=live }}</ref>, являющийся частью стандартной библиотеки.', 471 => '', 472 => '== Стандартная библиотека ==', 473 => '[[Файл:Python batteries included.jpg|thumb| Python поставляется «[[Стандартная библиотека Python|с батарейками в комплекте]]». Такую метафору использовали разработчики, чтобы подчеркнуть богатую стандартную библиотеку языка<ref>{{Cite news|title=PEP 206 -- Python Advanced Library|author=A.M. Kuchling|url=https://www.python.org/dev/peps/pep-0206/|website=Python.org|date=14.07.2000|accessdate=2021-04-04|archivedate=2021-05-05|archiveurl=https://web.archive.org/web/20210505003659/https://www.python.org/dev/peps/pep-0206/}}</ref>]]', 474 => '', 475 => 'Богатая стандартная [[Библиотека (программирование)|библиотека]] является одной из привлекательных сторон Python. Здесь имеются средства для работы со многими [[Протокол передачи данных|сетевыми протоколами]] и форматами [[Интернет]]а, например, модули для написания [[Веб-сервер|HTTP-серверов]] и клиентов, для разбора и создания почтовых сообщений, для работы с [[XML]] и т. п. Набор модулей для работы с [[операционная система|операционной системой]] позволяет писать кросс-платформенные приложения. Существуют модули для работы с [[регулярное выражение|регулярными выражениями]], текстовыми [[кодировка]]ми, [[мультимедиа|мультимедийными]] форматами, [[криптография|криптографическими]] протоколами, архивами, [[Сериализация|сериализации]] данных, поддержка [[Юнит-тестирование|юнит-тестирования]] и др.<ref>{{Cite web|url=https://docs.python.org/3/library/index.html|title=The Python Standard Library|website=Python documentation|access-date=2023-10-09|archive-date=2023-06-06|archive-url=https://web.archive.org/web/20230606041152/https://docs.python.org/3/library/index.html|url-status=live}}</ref>', 476 => '', 477 => 'Если модулей стандартной библиотеки не хватает, то есть возможность использовать другие каналы получения библиотек. Одним из каналов распространения и обновления пакетов для Python является [[PyPI]] ({{lang-en|Python Package Index}})<ref>{{Cite web|url=https://pypi.org/|title=PyPI · Индекс пакета Python|lang=ru|website=PyPI|access-date=2023-10-09|archive-date=2017-06-03|archive-url=https://web.archive.org/web/20170603211126/https://pypi.org/|url-status=live}}</ref>.', 478 => '', 479 => '== Сторонние библиотеки ==', 480 => '{{Основная статья|Сторонние библиотеки Python}}', 481 => 'Здесь перечислены самые популярные библиотеки Python:', 482 => '', 483 => '* Искусственный интеллект - [[TensorFlow]]', 484 => '* Работа с базами данных - [[Сторонние библиотеки Python#Сторонние библиотеки Python|Библиотеки для работы с базами данных]]', 485 => '* Математические вычисления - [[NumPy]]', 486 => '* Веб-вычисления - [[Django]]', 487 => '* Создание игр - [[Pygame]]', 488 => '', 489 => '== Примеры программ ==', 490 => 'В статье «[[v:Практика по языку Python/Примеры программ на языке Python|Примеры программ на языке Python]]» [[Викиверситет]]а собраны примеры небольших программ, демонстрирующих некоторые возможности языка Python и его стандартной библиотеки.', 491 => '', 492 => 'Программа «[[Hello, world!|Hello World!]]» может быть написана одной строкой:<syntaxhighlight lang="python3">', 493 => 'print("Hello World!")', 494 => '</syntaxhighlight>', 495 => '', 496 => 'Вычисление [[факториал]]а числа 10 (10!):', 497 => '<syntaxhighlight lang="python3">', 498 => 'def factorial(n):', 499 => ' if n < 0:', 500 => ' raise ArithmeticError('Факториал отрицательного числа.')', 501 => ' f = 1', 502 => ' for i in range (2, n + 1):', 503 => ' f *= i', 504 => ' return f', 505 => '', 506 => 'print(factorial(10)) # 3628800', 507 => '', 508 => '</syntaxhighlight>', 509 => '', 510 => 'Реализация с помощью [[рекурсия|рекурсии]]:', 511 => '<syntaxhighlight lang="python3">', 512 => 'def factorial(n):', 513 => ' if n < 0:', 514 => ' raise ArithmeticError('Факториал отрицательного числа.')', 515 => ' if n == 0 or n == 1:', 516 => ' return 1', 517 => ' else:', 518 => ' return factorial(n - 1) * n', 519 => '', 520 => 'print(factorial(10))', 521 => '</syntaxhighlight>', 522 => '', 523 => '== Профилирование и оптимизация кода ==', 524 => 'В стандартной библиотеке Python имеется [[Профилирование (информатика)|профайлер]] (модуль <code>profile</code>), который можно использовать для сбора статистики о времени работы отдельных функций. Для решения вопроса о том, какой вариант кода работает быстрее, можно использовать модуль <code>timeit</code>. Производимые в следующей программе измерения позволяют выяснить, какой из вариантов [[Конкатенация|конкатенации]] строк более эффективен<ref name=":22">{{Cite web|url=https://wiki.python.org/moin/PythonSpeed/PerformanceTips|title=PythonSpeed/PerformanceTips - Python Wiki|website=wiki.python.org|access-date=2023-10-09|archive-date=2023-10-18|archive-url=https://web.archive.org/web/20231018232415/https://wiki.python.org/moin/PythonSpeed/PerformanceTips|url-status=live}}</ref>:', 525 => '<syntaxhighlight lang="python">', 526 => 'from timeit import Timer', 527 => '', 528 => 'tmp = "Python 3.2.2 (default, Jun 12 2011, 15:08:59) [MSC v.1500 32 bit (Intel)] on win32."', 529 => '', 530 => 'def case1(): # А. инкрементальные конкатенации в цикле', 531 => ' s = ""', 532 => ' for i in range(10000):', 533 => ' s += tmp', 534 => '', 535 => 'def case2(): # Б. через промежуточный список и метод join', 536 => ' s = []', 537 => ' for i in range(10000):', 538 => ' s.append(tmp)', 539 => ' s = "".join(s)', 540 => '', 541 => 'def case3(): # В. списковое выражение и метод join', 542 => ' return "".join([tmp for i in range(10000)])', 543 => '', 544 => 'def case4(): # Г. генераторное выражение и метод join', 545 => ' return "".join(tmp for i in range(10000))', 546 => '', 547 => 'for v in range(1,5):', 548 => ' print (Timer("func()","from __main__ import case%s as func" % v).timeit(200))', 549 => '</syntaxhighlight>', 550 => 'Как и в любом языке программирования, в Python имеются свои приёмы [[оптимизация (информатика)|оптимизации]] кода. Оптимизировать код можно исходя из различных (часто конкурирующих друг с другом) критериев (увеличение быстродействия, уменьшение объёма требуемой оперативной памяти, компактность исходного кода и т. д.). Чаще всего программы оптимизируют по времени исполнения.', 551 => '', 552 => 'Здесь есть несколько очевидных для опытных программистов правил<ref name=":22" />.', 553 => '', 554 => '* Не нужно оптимизировать программу, если скорость её выполнения достаточна.', 555 => '* Используемый алгоритм имеет определённую [[Временная сложность алгоритма|временную сложность]], поэтому перед оптимизацией кода программы стоит сначала пересмотреть алгоритм.', 556 => '* Стоит использовать готовые и отлаженные функции и модули, даже если для этого нужно немного обработать данные. Например, в Python есть встроенная функция <code>sorted()</code>.', 557 => '* [[Профилирование (информатика)|Профилирование]] поможет выяснить узкие места. Оптимизацию нужно начинать с них.', 558 => '', 559 => 'Python имеет следующие особенности и связанные с ними правила оптимизации<ref name=":22" />.', 560 => '', 561 => '* Вызов функций является достаточно дорогостоящей операцией, поэтому внутри вложенных циклов нужно стараться избегать вызова функций или, например, переносить цикл в функции. Функция, обрабатывающая последовательность, эффективнее, чем обработка той же последовательности в цикле вызовом функции.', 562 => '* Старайтесь вынести из глубоко вложенного цикла всё, что можно вычислить во внешних циклах. Доступ к локальным переменным более быстрый, чем к глобальным или чем доступ к полям.', 563 => '* Оптимизатор '''psyco''' может помочь ускорить работу модуля программы при условии, что модуль не использует динамических свойств языка Python.', 564 => '* В случае, если модуль проводит массированную обработку данных и оптимизация алгоритма и кода не помогает, можно переписать [[Критический участок кода|критические участки]], скажем, на языке Си или Pyrex.', 565 => '', 566 => 'Инструмент под названием Pychecker<ref>{{Cite web |url=http://pychecker.sourceforge.net/ |title=PyChecker: a python source code checking tool |access-date=2007-02-03 |archive-date=2007-02-02 |archive-url=https://web.archive.org/web/20070202224013/http://pychecker.sourceforge.net/ |url-status=live }}</ref> поможет проанализировать исходный код на Python и выдать рекомендации по найденным проблемам (например, неиспользуемые имена, изменение сигнатуры метода при его перегрузке и т. п.). В ходе такого статического анализа исходного кода могут быть выявлены и ошибки. Pylint<ref>{{Cite web |url=http://www.logilab.org/view?rql=Any%20X%20WHERE%20X%20eid%20857 |title=pylint (analyzes Python source code looking for bugs and signs of poor quality.) (Logilab.org) |access-date=2007-02-03 |archive-date=2007-02-12 |archive-url=https://web.archive.org/web/20070212050018/http://www.logilab.org/view%3Frql%3DAny%2520X%2520WHERE%2520X%2520eid%2520857 |url-status=live }}</ref> призван решать близкие задачи, но имеет уклон в сторону проверки стиля кода, поиска [[код с запашком|кода с запашком]]<ref>{{Cite web|url=https://pylint.readthedocs.io/en/stable/|title=Pylint 3.0.1 documentation|website=pylint.readthedocs.io|access-date=2023-10-09|archive-date=2023-10-18|archive-url=https://web.archive.org/web/20231018232406/https://pylint.readthedocs.io/en/stable/|url-status=live}}</ref>.', 567 => '', 568 => '== Сравнение с другими языками ==', 569 => 'Выбор языка обычно зависит от решаемых задач, особенностей языков и наличия библиотек, требуемых для решения задачи. Одна и та же задача, написанная на разных языках, может сильно разниться по эффективности исполнения, в том числе различия могут быть и при исполнении в разных операционных системах или при использовании разных компиляторов. В общем случае языки можно поделить на интерпретируемые (скриптовые), компилируемые в промежуточное представление и компилируемые, что влияет на производительность и потребление памяти. Python принято относить к интерпретируемым. Также отдельные языки могут иметь свои сильные стороны, в случае Python выделяется лёгкость в написании программ<ref name=":17" />.', 570 => '', 571 => '=== [[C++]] и [[Java]] ===', 572 => 'Python сравнивается с C++/Java с точки зрения лаконичности, простоты и гибкости Python<ref name=":11" />. Можно сравнить «[[Hello, world]]»-программы, записанные на каждом из языков<ref name=":11" />.', 573 => '', 574 => '{| class="wikitable"', 575 => '|+ Сравнение программ «Hello, world!»', 576 => '|-', 577 => '! C++<ref name=":11" /> !! Java<ref name=":11" /> !! Python<ref name=":11" />', 578 => '|-', 579 => '| <source lang="C++">', 580 => '#include <iostream>', 581 => 'int main() {', 582 => ' std::cout << "Hello, world!" << std::endl;', 583 => ' return 0;', 584 => '}', 585 => '</source> || <source lang="Java">', 586 => 'public class HelloClass {', 587 => ' public static void main(String[] args) {', 588 => ' System.out.println("Hello, world!");', 589 => ' }', 590 => '}', 591 => '</source> || <source lang="Python">', 592 => 'print("Hello, world!")', 593 => '</source>', 594 => '|}', 595 => '', 596 => 'Касательно ООП, в Python, в отличие от C++ и Java, отсутствуют модификаторы доступа к полям и методам класса, атрибуты и поля у объектов могут создаваться на лету в ходе исполнения программы, а все методы являются виртуальными. По сравнению с Java Python позволяет также перегружать операторы, что даёт возможность использовать выражения близкие к естественным<ref name=":11" />. В совокупности подход к ООП в Python упрощает программирование, делает код более понятным и одновременно добавляет гибкости языку<ref name=":11" />. С другой стороны, скорость выполнения кода на Python (как и других интерпретируемых языков) значительно ниже, чем скорость выполнения аналогичного кода на C++<ref>{{Статья|ссылка=https://arxiv.org/pdf/2001.02491.pdf|автор=Pascal Fua, Krzysztof Lis|заглавие=Comparing Python, Go, and C++ on the N-Queens Problem|год=2020|издание=Computer Vision Laboratory, EPFL|access-date=2021-03-02|archive-date=2020-03-12|archive-url=https://web.archive.org/web/20200312235010/https://arxiv.org/pdf/2001.02491.pdf|deadlink=no|archivedate=2020-03-12|archiveurl=https://web.archive.org/web/20200312235010/https://arxiv.org/pdf/2001.02491.pdf}}</ref> и обычно ожидается ниже, чем в Java<ref>{{Cite web|lang=en|url=https://www.python.org/doc/essays/comparisons/|title=Comparing Python to Other Languages|author=Guido van Rossum|website=Python.org|date=1997|archive-url=https://web.archive.org/web/20210316045507/https://www.python.org/doc/essays/comparisons/|archive-date=2021-03-16|access-date=2021-03-16|url-status=live}}</ref>. Код на C++ получается производительнее Python, при этом занимает больше строк. Согласно исследованиям алгоритмов, применяемых в [[Биоинформатика|биоинформатике]], Python показал себя более гибким чем C++, а Java оказалась компромиссным решением между производительностью C++ и гибкостью Python<ref name=":17">{{Статья|ссылка=https://doi.org/10.1186/1471-2105-9-82|автор=Mathieu Fourment, Michael R. Gillings|заглавие=A comparison of common programming languages used in bioinformatics|год=2008|язык=en|издание=BMC Bioinformatics|месяц=02|число=05|том=9|выпуск=1|страницы=82|issn=1471-2105|doi=10.1186/1471-2105-9-82|archiveurl=https://web.archive.org/web/20210319180836/https://bmcbioinformatics.biomedcentral.com/articles/10.1186/1471-2105-9-82|archivedate=2021-03-19|access-date=2021-03-19|deadlink=no}}</ref>.', 597 => '', 598 => 'В Java и Python все объекты создаются в [[Куча (память)|куче]], в то время как C++ позволяет создавать объекты как в куче, так и на [[Стек вызовов|стеке]], в зависимости от используемого синтаксиса<ref>{{Статья|ссылка=https://www.ncbi.nlm.nih.gov/pmc/articles/PMC3933420/|автор=Muhammad Shoaib Farooq, Sher Afzal Khan, Farooq Ahmad, Saeed Islam, Adnan Abid|заглавие=An Evaluation Framework and Comparative Analysis of the Widely Used First Programming Languages|год=2014|язык=en|издание=PLoS ONE|месяц=02|число=24|том=9|выпуск=2|issn=1932-6203|doi=10.1371/journal.pone.0088941|pmid=24586449|archiveurl=https://web.archive.org/web/20210315195631/https://www.ncbi.nlm.nih.gov/pmc/articles/PMC3933420/|archivedate=2021-03-15|access-date=2021-03-15|deadlink=no}}</ref>. На производительность также влияет способ доступа к данным в памяти. В C++ и Java доступ к данным происходит по постоянным смещениям в памяти, в то время как в Python — через [[Хеш-таблица|хеш-таблицы]]. Использование [[Указатель (тип данных)|указателей]] в C++ может быть довольно сложным для понимания среди новичков, и овладение навыками правильного использования указателей может занять некоторое время<ref name=":17" />.', 599 => '', 600 => '=== [[Go]] ===', 601 => '{{Дополнить}}', 602 => 'Go и Python — кардинально различающиеся языки, тем не менее, они часто сравниваются один с другим из-за общей ниши — бэкэнда веб-приложений. По выражению Джейсона Кинкэйда, Go объединяет «производительность и безопасность компилируемых языков, таких как C++, со скоростью разработки на динамических языках, таких как Python»<ref name="AutoNT-94">{{cite news |url=https://techcrunch.com/2009/11/10/google-go-language/ |title=Google's Go: A New Programming Language That's Python Meets C++ |last=Kincaid |first=Jason |date=10 November 2009 |work=TechCrunch |access-date=2010-01-29 |accessdate=2021-02-16 |archivedate=2010-01-18 |archiveurl=https://web.archive.org/web/20100118014358/http://www.techcrunch.com/2009/11/10/google-go-language/ }}</ref>. В какой-то мере это действительно так: Go изначально разработан как строго статически типизированный компилируемый язык, поддерживающий максимум возможностей динамических языков, при котором ещё можно обеспечить эффективную компиляцию и сохранить производительность компилируемых программ.', 603 => 'Общими для обоих языков является использование автоматического управления памятью, наличие встроенных динамических коллекций (массивов и словарей), поддержка срезов, развитый механизм модулей, простой и минималистичный синтаксис. Различий гораздо больше, и не всегда можно однозначно указать, в пользу какого из языков они говорят.', 604 => '', 605 => '; Динамические возможности.', 606 => ': Если Python является полностью динамическим языком и практически любые элементы программы могут меняться во время исполнения, включая конструирование «на лету» новых типов и модификацию существующих, то Go — статический язык с достаточно ограниченными возможностями рефлексии, работающей только в отношении созданных при разработке типов данных. В некоторой мере заменой динамических возможностей в Go является кодогенерация, обеспечиваемая простотой синтаксиса и наличием необходимых инструментов и системных библиотек. Также в Go 1.18 добавили поддержку средств обобщённого программирования (generics)<ref>{{Cite web|lang=en|url=https://go.dev/doc/go1.18|title=Go 1.18 Release Notes - The Go Programming Language|website=go.dev|access-date=2023-05-27|archive-date=2023-05-27|archive-url=https://web.archive.org/web/20230527171309/https://go.dev/doc/go1.18|url-status=live}}</ref>.', 607 => '', 608 => '=== [[Perl]] ===', 609 => 'Оба языка являются интерпретируемыми, компилируются в промежуточное представление, которое затем отправляется на исполнение. В случае Python генерируется промежуточный байт-код, а компилятор Perl генерирует синтаксическое дерево. Управление памятью в обоих языках автоматическое, а сами языки используются как скриптовые и хорошо подходят для написания веб-приложений. Подход в написания кода Python предполагает лучшее понимание [[Исходный код|листинга программы]] в ущерб производительности, тогда как в Perl больше свободы в синтаксисе, что может привести к тому что программы на Perl становятся нечитабельны для программистов, не работающих с данным языком<ref name=":17" />.', 610 => '', 611 => '=== [[MATLAB]] и [[R (язык программирования)|R]] ===', 612 => '{{В планах|дата=2023-02-08}}Python, MATLAB и R используются в обработке данных и в обучении студентов основам математики и статистики. R является языком для выполнения статистических расчётов, в то время как MATLAB может считаться языком программирования наряду с Python<ref>{{Статья|ссылка=http://www.jds-online.com/files/150%E5%AE%8C%E6%88%90V.pdf|автор=Ceyhun Ozgur, Taylor Colliau, Grace Rogers, Zachariah Hughes, Elyse “Bennie” Myer-Tyson|заглавие=MatLab vs. Python vs. R|год=2017|язык=en|издание=Journal of Data Science|том=15|страницы=355—372|issn=1680-743X|archiveurl=https://web.archive.org/web/20210411143915/http://www.jds-online.com/files/150%E5%AE%8C%E6%88%90V.pdf|archivedate=2021-04-11|access-date=2021-04-11|deadlink=no}}</ref>.', 613 => '', 614 => '=== Языки, на которые повлиял Python ===', 615 => 'Python, как весьма популярный язык программирования, повлиял на следующие языки:', 616 => '* [[CoffeeScript]] имеет синтаксис, вдохновлённый Python<ref>{{Книга|ссылка=https://archive.org/details/littlebookoncoff0000macc|автор=Alex MacCaw|заглавие=The Little Book on CoffeeScript|ответственный=|год=2012|место=|издательство=O'Reilly|страницы=|страниц=|isbn=9781449321055}}</ref>.', 617 => '* [[ECMAScript]]/[[JavaScript]] заимствовал итераторы и генераторы из Python<ref name="AutoNT-93">{{cite web |url=http://wiki.ecmascript.org/doku.php?id=proposals:iterators_and_generators |archive-url=https://web.archive.org/web/20071020082650/http://wiki.ecmascript.org/doku.php?id=proposals:iterators_and_generators |url-status=dead|archive-date=2007-10-20 |title=Proposals: iterators and generators [ES4 Wiki&#93; |publisher=wiki.ecmascript.org |access-date=2008-11-24 }}</ref>.', 618 => '* [[Go]], при сильнейших идеологических различиях, заимствовал у динамических языков, таких как Python, встроенные словари, динамические массивы, срезы.', 619 => '* [[Groovy]] был создан с мотивацией привнести философию Python на [[Java]]<ref name="AutoNT-95">{{cite web |last=Strachan |first=James |date=2003-08-29 |title=Groovy&nbsp;– the birth of a new dynamic language for the Java platform |url=http://radio.weblogs.com/0112098/2003/08/29.html |access-date=2007-06-11 |archive-url=https://web.archive.org/web/20070405085722/http://radio.weblogs.com/0112098/2003/08/29.html |archive-date=2007-04-05 |url-status=dead}}</ref>.', 620 => '* [[Julia (язык программирования)|Julia]] была задумана как «такая же пригодная для общего программирования, как и Python»<ref name="Julia">{{cite web| title= Why We Created Julia| date= 2012-02| website= Julia website| url= https://julialang.org/blog/2012/02/why-we-created-julia| access-date= 2014-06-05| quote= We want something as usable for general programming as Python [...]| archive-date= 2020-05-02| archive-url= https://web.archive.org/web/20200502144010/https://julialang.org/blog/2012/02/why-we-created-julia/| url-status= live}}</ref>.', 621 => '* [[Nim]] использует систему отступов и аналогичный синтаксис<ref>{{cite web |url=https://www.infoworld.com/article/3157745/application-development/nim-language-draws-from-best-of-python-rust-go-and-lisp.html |title=Nim language draws from best of Python, Rust, Go, and Lisp |first=Serdar |last=Yegulalp |date=2017-01-16 |website=InfoWorld |quote=Nim's syntax is strongly reminiscent of Python's, as it uses indented code blocks and some of the same syntax (such as the way if/elif/then/else blocks are constructed). |access-date=2021-02-16 |archive-date=2018-10-13 |archive-url=https://web.archive.org/web/20181013211847/https://www.infoworld.com/article/3157745/application-development/nim-language-draws-from-best-of-python-rust-go-and-lisp.html |url-status=live }}</ref>.', 622 => '* [[Ruby]] — [[Юкихиро Мацумото]], создатель языка, сказал: «Я хотел скриптовый язык, который был бы более мощным, чем Perl, и более объектно-ориентированным, чем Python. Вот почему я решил создать свой собственный язык»<ref name="linuxdevcenter">{{cite web |url=http://www.linuxdevcenter.com/pub/a/linux/2001/11/29/ruby.html |title=An Interview with the Creator of Ruby |publisher=Linuxdevcenter.com |access-date=2012-12-03 |archive-date=2018-04-28 |archive-url=https://web.archive.org/web/20180428150410/http://www.linuxdevcenter.com/pub/a/linux/2001/11/29/ruby.html |url-status=live }}</ref>.', 623 => '* [[Swift (язык программирования)|Swift]] во время разработки брал идеи структуры языка из Python, а также из [[Objective-C]], [[Rust (язык программирования)|Rust]], [[Haskell]], [[Ruby]], [[C Sharp|C#]], [[CLU]]<ref>{{cite web |url=http://nondot.org/sabre |title=Chris Lattner's Homepage |publisher=Chris Lattner |first=Chris |last=Lattner |author-link=Chris Lattner |date=2014-06-03 |access-date=2014-06-03 |quote=I started work on the Swift Programming Language in July of 2010. I implemented much of the basic language structure, with only a few people knowing of its existence. A few other (amazing) people started contributing in earnest late in 2011, and it became a major focus for the Apple Developer Tools group in July 2013 [...] drawing ideas from Objective-C, Rust, Haskell, Ruby, Python, C#, CLU, and far too many others to list. |archive-date=2015-12-22 |archive-url=https://web.archive.org/web/20151222150510/http://nondot.org/sabre/ |url-status=live }}</ref>.', 624 => '', 625 => '== Критика ==', 626 => '', 627 => '=== Низкое быстродействие ===', 628 => 'Классический Python имеет общий со многими другими [[Интерпретируемый язык программирования|интерпретируемыми языками]] недостаток — сравнительно невысокую скорость выполнения программ<ref name="alioth-benchmark">{{cite web|url=http://shootout.alioth.debian.org/u32/benchmark.php?test=all&lang=python&lang2=gpp&box=1|title=Python / C++ GNU g++|work=Computer Language Benchmarks Game|accessdate=2009-07-01|archiveurl=https://www.webcitation.org/5w4n30Deb?url=http://shootout.alioth.debian.org/u32/benchmark.php?test=all|archivedate=2011-01-28}}</ref>. В некоторой степени ситуацию улучшает кеширование [[байт-код]]а (расширения <code>.pyc</code> и, до версии 3.5, <code>.pyo</code>), которое позволяет интерпретатору не тратить время на синтаксический разбор текста модулей при каждом запуске.', 629 => '', 630 => 'Существуют реализации языка Python, вводящие высокопроизводительные [[Виртуальная машина|виртуальные машины]] в качестве бэкенда компилятора. Примерами таких реализаций может служить [[PyPy]], базирующийся на RPython, более ранней инициативой является проект [[Parrot]]. Ожидается, что использование виртуальной машины типа [[LLVM]] приведёт к тем же результатам, что и использование аналогичных подходов для реализаций языка Java, где низкая вычислительная производительность в основном преодолена<ref>{{Cite web|lang=en |url=https://arstechnica.com/open-source/news/2009/03/google-launches-project-to-boost-python-performance-by-5x.ars |title=Ars Technica report on Unladen Swallow goals |access-date=2017-10-29 |archive-date=2012-05-01 |archive-url=https://web.archive.org/web/20120501010841/http://arstechnica.com/open-source/news/2009/03/google-launches-project-to-boost-python-performance-by-5x.ars |url-status=live }}</ref>. Однако нельзя забывать, что динамический характер Python делает неизбежными дополнительные накладные расходы при исполнении программ, что ограничивает производительность Python-систем независимо от применяемых технологий. Вследствие этого для написания критических участков кода используются низкоуровневые языки, интеграция с которыми обеспечивается множеством программ и библиотек.', 631 => '', 632 => 'Тем не менее, Python портирован на некоторые относительно малопроизводительные платформы<ref>{{Cite web|url=http://micropython.org/|title=MicroPython - Python for microcontrollers|lang=en|website=micropython.org|access-date=2023-10-09|archive-date=2014-06-06|archive-url=https://web.archive.org/web/20140606021306/http://micropython.org/|url-status=live}}</ref>.', 633 => '', 634 => '=== Глобальная блокировка интерпретатора (GIL) ===', 635 => '[[Файл:GIL description.gif|thumb|250px|Схематичное изображение работы потоков под GIL. Зелёный — поток, удерживающий GIL, красные — блокированные потоки]]', 636 => '{{main|Global Interpreter Lock}}', 637 => 'Интерпретатор Python в [[CPython]] (а также [[Stackless Python|Stackless]] и [[PyPy]]{{Sfn|Яворски, Зиаде|2021|p=466}}) использует потоко-небезопасные данные, во избежание разрушения которых при совместной модификации из разных потоков применяется глобальная блокировка интерпретатора — GIL (Global Interpreter Lock){{sfn|Palach|2014|pp=16—17}}: в ходе исполнения кода поток интерпретатора блокирует GIL, выполняет в течение фиксированного времени (по умолчанию 5 миллисекунд{{ref+|Значение в секундах можно получить с помощью команды sys.getswitchinterval()<ref>{{Cite web|url=https://docs.python.org/3/library/sys.html#sys.getswitchinterval|title=sys#sys.getswitchinterval()|website=Документация Python|access-date=2021-10-25|archive-date=2021-10-25|archive-url=https://web.archive.org/web/20211025160501/https://docs.python.org/3/library/sys.html#sys.getswitchinterval|url-status=live}}</ref> и изменить во время работы программы с помощью sys.setswitchinterval()<ref>{{Cite web|url=https://docs.python.org/3/library/sys.html#sys.setswitchinterval|title=sys#sys.setswitchinterval()|website=Документация Python|access-date=2021-10-25|archive-date=2021-10-25|archive-url=https://web.archive.org/web/20211025160501/https://docs.python.org/3/library/sys.html#sys.setswitchinterval|url-status=live}}</ref>|К}}) некоторое количество инструкций, после чего освобождает блокировку и приостанавливается, давая возможность работать другим потокам. GIL также освобождается во время ввода-вывода, изменения и проверки состояния синхронизирующих примитивов, при исполнении кода расширений, не обращающихся к данным интерпретатора, например, [[NumPy]]/[[SciPy]]. Таким образом, в каждый момент времени в одном процессе интерпретатора Python может исполняться только один поток кода на Python, независимо от числа доступных процессорных ядер.', 638 => '', 639 => 'Потери производительности от GIL зависят от характера программ и архитектуры системы. Большинство программ является однопоточными, либо запускает всего несколько потоков, из которых часть в каждый конкретный момент простаивает в ожидании. Персональные компьютеры обычно имеют небольшое количество процессорных ядер, которые загружены параллельно исполняющимися в системе процессами, так что реальные потери производительности на персональных компьютерах из-за GIL невелики. Но в серверных приложениях может быть удобно использовать десятки и сотни (а то и больше) параллельных потоков (например, в системах массового обслуживания, где каждый поток обрабатывает данные для отдельного пользовательского запроса), а серверы на конец 2010-х годов нередко имеют десятки и даже сотни процессорных ядер, то есть технически могут обеспечить этим потокам физически одновременное исполнение; в таких условиях GIL может приводить к действительно значительному снижению общей производительности, так как лишает программу возможности полноценно использовать ресурсы многоядерных систем.', 640 => '', 641 => 'Гвидо ван Россум говорил, что GIL «не так уж и плох» и он будет в CPython до тех пор, пока «кто-то другой» не представит реализацию Python без GIL, с которой бы однопоточные скрипты работали так же быстро<ref>{{cite web | url=http://mail.python.org/pipermail/python-3000/2007-May/007414.html | author=[[Guido van Rossum]] | title=the future of the GIL | publisher=[http://mail.python.org Python Mailing Lists] | date=2007-05-08 | access-date=2021-03-03 | archive-date=2020-11-09 | archive-url=https://web.archive.org/web/20201109025224/https://mail.python.org/pipermail/python-3000/2007-May/007414.html | url-status=live }}</ref><ref>{{cite web | url=http://www.artima.com/weblogs/viewpost.jsp?thread=214235 | author=Guido van Rossum | title=It isn't Easy to Remove the GIL | publisher=[http://www.artima.com artima.com] | date=2007-09-10 | access-date=2021-03-03 | archive-date=2019-06-06 | archive-url=https://web.archive.org/web/20190606085140/https://www.artima.com/weblogs/viewpost.jsp?thread=214235 | url-status=live }}</ref>.', 642 => '', 643 => 'В задачи разработки входит работа по оптимизации GIL<ref>{{Cite web |url=http://mail.python.org/pipermail/python-dev/2009-October/093321.html |title=Python-Dev&#93; Reworking the GIL |access-date=2010-12-07 |archive-date=2011-06-10 |archive-url=https://web.archive.org/web/20110610164607/http://mail.python.org/pipermail/python-dev/2009-October/093321.html |url-status=live }}</ref>. Планируется отказ от GIL, есть черновой вариант PEP 703<ref name="автоссылка1">{{Cite web |url=https://peps.python.org/pep-0703 |title=PEP 703 – Making the Global Interpreter Lock Optional in CPython {{!}} peps.python.org<!-- Заголовок добавлен ботом --> |access-date=2023-10-08 |archive-date=2023-10-13 |archive-url=https://web.archive.org/web/20231013135852/https://peps.python.org/pep-0703/ |url-status=live }}</ref>, но на данный момент есть следующие варианты избавления от GIL:', 644 => '* Вариант интерпретатора с синхронизацией доступа к отдельным объектам вместо глобальной блокировки<ref>{{Cite web |url=http://www.artima.com/weblogs/viewpost.jsp?thread=211200 |title=Python 3000 FAQ |access-date=2007-08-08 |archive-date=2020-11-09 |archive-url=https://web.archive.org/web/20201109015427/https://www.artima.com/weblogs/viewpost.jsp?thread=211200 |url-status=live }}</ref> из-за частых захватов/освобождений блокировок оказался слишком медленным.', 645 => '* Реализация потоков через процессы ОС, например, модуль multiprocessing<ref>{{Cite web|url=https://docs.python.org/3/library/multiprocessing.html|title=multiprocessing — Process-based parallelism|website=Python documentation|access-date=2023-10-09|archive-date=2023-10-09|archive-url=https://web.archive.org/web/20231009230311/https://docs.python.org/3/library/multiprocessing.html|url-status=live}}</ref>.', 646 => '* Отказ от совместного использования изменяемых данных и вызовов внешнего кода. При этом данные дублируются в потоках и их синхронизация (если таковая нужна) лежит на программисте<ref>{{Cite web |url=http://perldoc.perl.org/perlthrtut.html |title=perlthrtut — perldoc.perl.org |access-date=2008-04-10 |archive-date=2008-05-22 |archive-url=https://web.archive.org/web/20080522092213/http://perldoc.perl.org/perlthrtut.html |url-status=live }}</ref>.', 647 => '* Библиотеки, обеспечивающие собственную организацию поддержки потоков.', 648 => '* Есть черновой PEP по отказу от GIL в CPython<ref name="автоссылка1" />', 649 => '', 650 => 'Радикальным вариантом решения проблемы может быть переход на [[Jython]] и [[IronPython]], работающие на виртуальных машинах Java и .NET/Mono: эти реализации вообще не используют GIL.', 651 => '', 652 => '=== Синтаксис и семантика ===', 653 => 'Несмотря на то, что одним из заявленных принципов дизайна Python является [[Правило наименьшего удивления|принцип наименьшего удивления]], критики отмечают целый ряд архитектурных решений, которые могут вводить в заблуждение или вызывать недоумение у программистов, привыкших к другим распространённым языкам<ref name="pitfalls">{{cite web |title = zephyrfalcon.org :: labs :: 10 Python pitfalls |url = http://zephyrfalcon.org/labs/python_pitfalls.html |archive-url = https://web.archive.org/web/20130810230937/http://zephyrfalcon.org/labs/python_pitfalls.html |archive-date = 2013-08-10 |url-status = dead }}</ref>. В их числе:', 654 => '* Отличие в принципе работы оператора присвоения по сравнению со статически-типизированными языками. В Python при присвоении значения копируется ссылка на объект, а не значение. При работе с простыми неизменяемыми типами возникает ощущение изменения значения переменной при присваивании ей значения, однако фактически присваивается ссылка на другое значение, например, при увеличении значения переменной типа <code>int</code> на 1 меняется ссылка, а не увеличивается значение по ссылке. Однако при работе с изменяемыми типами их содержимое можно менять по ссылке, поэтому при присвоении одной переменной ссылки на другую и последующем изменении значения в одной из двух переменных оно изменится в обеих переменных, что хорошо заметно при работе со списками<ref name="pitfalls" /><ref>{{Книга|ссылка=https://books.google.ru/books?id=FOVBDAAAQBAJ&pg=SA3-PA35|автор=Reeta Sahoo, Gagan Sahoo|заглавие=Computer Science with Python|год=2016|место=New Delhi|издательство=New Saraswati House India Pvt Ltd|страницы=3.35—3.36|страниц=458|isbn=978-93-5199-980-5|access-date=2021-01-16|archive-date=2021-01-22|archive-url=https://web.archive.org/web/20210122000110/https://books.google.ru/books?id=FOVBDAAAQBAJ&pg=SA3-PA35|deadlink=no}}</ref>. При этом кортежи хоть и являются неизменяемыми, но могут хранить ссылки на изменяемые объекты, поэтому по факту кортежи тоже можно менять<ref>{{Cite web|lang=en|url=http://radar.oreilly.com/2014/10/python-tuples-immutable-but-potentially-changing.html|title=Python tuples: immutable but potentially changing - O'Reilly Radar|author=Luciano Ramalho|website=radar.oreilly.com|date=2014-10-15|publisher=O'Reilly|archiveurl=https://web.archive.org/web/20210116094945/http://radar.oreilly.com/2014/10/python-tuples-immutable-but-potentially-changing.html|archivedate=2021-01-16|accessdate=2021-01-16|url-status=live}}</ref>;', 655 => '* Отличие в поведении на некоторых типах «сокращённых» операторов, таких как <code>+=</code> и их развёрнутой записи, хотя в большинстве языков «сокращённый» вариант — это просто краткая запись полного, и семантически они абсолютно эквивалентны. Пример с использованием <code>x +=</code>:<syntaxhighlight lang="python3" line="1">', 656 => '>>> x = [1, 2]', 657 => '>>> y = x', 658 => '>>> x += [3, 4]', 659 => '>>> x', 660 => '[1, 2, 3, 4]', 661 => '>>> y', 662 => '[1, 2, 3, 4]', 663 => '</syntaxhighlight>Аналогичный пример с использованием <code>x = x +</code>:<syntaxhighlight lang="python3">', 664 => '>>> x = [1, 2]', 665 => '>>> y = x', 666 => '>>> x = x + [3, 4]', 667 => '>>> x', 668 => '[1, 2, 3, 4]', 669 => '>>> y', 670 => '[1, 2]', 671 => '</syntaxhighlight>', 672 => '* Жёсткая трактовка лексической области видимости, подобная используемой в JavaScript: даже если переменная получает значение в последней строке функции, её областью видимости является вся функция.', 673 => '* Путаница между полями класса и полями объекта: текущее значение поля класса инициализирует одноимённое поле объекта, но не при создании объекта, а при первой записи значения в данное поле.<syntaxhighlight lang="python3">', 674 => 'class Colored:', 675 => ' color = "red"', 676 => '', 677 => 'obj1 = Colored()', 678 => 'print(obj1.color) # выводится исходное значение поля КЛАССА', 679 => 'Colored.color = "green" # изменение поля КЛАССА', 680 => 'print(obj1.color) # выводится значение поля КЛАССА', 681 => 'obj1.color = "blue" # изменяется поле ОБЪЕКТА и фиксируется его значение', 682 => 'Colored.color = "yellow" # изменение поля КЛАССА, которое уже не отразится на объекте', 683 => 'print(obj1.color) # выводится поле ОБЪЕКТА', 684 => '', 685 => '# Скрипт выведет: ', 686 => 'red', 687 => 'green', 688 => 'blue', 689 => '</syntaxhighlight>', 690 => ': В примере выше три раза выводится поле color объекта obj1 класса Colored. При этом пока не выполнена запись в это поле, выводится текущее значение ''поля класса'', и в третий раз — значение поля объекта. Такое сохранение связи между полем объекта и класса до первой перезаписи может стать причиной неожиданного эффекта: если в программе меняется значение поля класса, то все объекты, одноимённые поля которых ещё не перезаписаны, окажутся неявно изменены.', 691 => '* Интуитивно трудно предсказуемое поведение параметров со значением-объектом по умолчанию. Если в качестве инициализатора для параметра по умолчанию указать конструктор объекта, это приведёт к созданию статического объекта, ссылка на который и будет передаваться по умолчанию в каждый вызов<ref>{{Cite web|url=https://docs.python.org/3/reference/compound_stmts.html|title=8. Compound statements — Python 3.7.2 documentation|publisher=docs.python.org|accessdate=2019-02-05|archive-date=2019-11-27|archive-url=https://web.archive.org/web/20191127123528/https://docs.python.org/3/reference/compound_stmts.html|url-status=live}}</ref>. Это может повлечь трудно уловимые ошибки.', 692 => '', 693 => '=== Невозможность модификации встроенных классов ===', 694 => '{{Дополнить}}', 695 => 'По сравнению с [[Ruby]] и некоторыми другими языками, в Python отсутствует возможность модифицировать встроенные классы<ref>{{Cite web|url=https://docs.python.org/3/library/stdtypes.html|title=Built-in Types|website=Python documentation|access-date=2023-10-09|archive-date=2020-06-14|archive-url=https://web.archive.org/web/20200614194325/https://docs.python.org/3/library/stdtypes.html|url-status=live}}</ref>, такие, как <code>int, str, float, list</code> и другие.', 696 => '', 697 => '== Реализации ==', 698 => '', 699 => '=== CPython ===', 700 => '{{основная статья|CPython}}', 701 => 'CPython является основной реализацией языка. Он написан на [[Си (язык программирования)|языке Си]] и является переносимым на разные платформы. В основе управления памятью лежит использование комбинации счётчиков ссылок и сборщика мусора, ответственного за поиск циклических захватов ссылок<ref name=":18" />. Хотя язык считается интерпретируемым, на самом деле он компилируется в промежуточный высокоуровневый байт-код<ref>{{Cite web|lang=ru|url=https://leanpub.com/insidethepythonvirtualmachine/read|title=Read Inside The Python Virtual Machine {{!}} Leanpub|author=Obi Ike-Nwosu|website=Inside The Python Virtual Machine|publisher=leanpub.com|archive-url=https://web.archive.org/web/20210129122502/https://leanpub.com/insidethepythonvirtualmachine/read|archive-date=2021-01-29|access-date=2021-03-23|url-status=live}}</ref><ref name=":19" />, который затем исполняется через стековую виртуальную машину<ref name=":18" />. Например, вызов функции <code>print()</code> может быть представлен в следующем виде<ref name=":19">Получено с помощью <code>dis.dis('print("Hello World!")')</code>.</ref>:', 702 => '', 703 => '<syntaxhighlight lang="asm">', 704 => ' 0 0 RESUME 0', 705 => ' 1 2 PUSH_NULL', 706 => ' 4 LOAD_NAME 0 (print)', 707 => ' 6 LOAD_CONST 0 ('Hello World!')', 708 => ' 8 PRECALL 1', 709 => ' 12 CALL 1', 710 => ' 22 RETURN_VALUE', 711 => '', 712 => '</syntaxhighlight>', 713 => '', 714 => 'Имена в языке имеют позднее связывание, в результате чего можно писать обращения к переменным, методам и атрибутам, которых ещё нет, но они должны быть объявлены на момент исполнения кода, использующего их. Каждый объект в Python имеет словарь, представленный хеш-таблицей, через который происходит сопоставление названий атрибутов их значениям. Глобальные переменные также сопоставляются через словарь. Одно обращение к методу или атрибуту может сопровождаться поочерёдным поиском в нескольких словарях<ref name=":18" />.', 715 => '=== PyPy ===', 716 => '{{Основная статья|PyPy}}', 717 => 'PyPy — реализация Python, написанная на [[RPython]] (подмножество Python, имеющее намного меньше динамических возможностей). Позволяет легко проверять новые возможности. В PyPy, кроме стандартного CPython, включены возможности [[Stackless Python|Stackless]], [[Psyco]], модификация [[Абстрактное синтаксическое дерево|AST]] «на лету» и многое другое. В проект интегрированы возможности анализа Python-кода и трансляция в другие языки и [[байт-код]]ы виртуальных машин ([[Си (язык программирования)|Си]], [[LLVM]], [[Javascript]], .NET с версии 0.9.9). Начиная с 0.9.0, возможна полностью автоматическая трансляция RPython в Си, в результате чего достигается скорость, приемлемая для использования (в 2—3 раза ниже, чем CPython при отключённом [[JIT]] для версии 0.9.9). По умолчанию PyPy поставляется со встроенным JIT-компилятором, с помощью которого он способен работать намного быстрее, чем CPython.', 718 => '', 719 => '=== Jython ===', 720 => '{{В планах|дата=2023-02-08}}{{Основная статья|Jython}}', 721 => 'Jython — реализация Python, компилирующая код на Python в [[Байт-код Java|байт-код]] [[Java]], который может быть выполнен [[JVM]]. Также может использоваться для импорта [[Класс (программирование)|класса]], исходный код которого был написан на Java в качестве модуля для Python{{sfn|К. Рейт, Т. Шлюссер|2017|p=23}}.', 722 => '', 723 => '=== Другие реализации ===', 724 => 'Существуют также другие реализации.', 725 => '* {{iw|Numba}} — Jit-компилятор на основе LLVM с поддержкой NumPy.', 726 => '* [[PyS60]]<ref name="PyS60" /> — реализация языка для [[смартфон]]ов фирмы [[Nokia]] на платформе [[Symbian S60|Series 60]]. Не поддерживается', 727 => '* [[IronPython]] — Python для [[.NET Framework]] и [[Mono]]. Компилирует Python программы в [[MSIL]], таким образом предоставляя полную интеграцию с .NET-системой<ref>{{Cite web |url=http://www.codeplex.com/Wiki/View.aspx?ProjectName=IronPython |title=IronPython |access-date=2007-07-24 |archive-date=2006-08-18 |archive-url=https://web.archive.org/web/20060818015745/http://www.codeplex.com/Wiki/View.aspx?ProjectName=IronPython |url-status=live }}</ref>.', 728 => '* [[Stackless Python|Stackless]] — также написанная на Си реализация Python. Это не полноценная реализация, а [[патч]]и к CPython. Предоставляет расширенные возможности многопоточного программирования и значительно большую глубину [[рекурсия|рекурсии]].', 729 => '* [[Python for .NET]]<ref>{{Cite web |url=http://pythonnet.sourceforge.net/ |title=Python for .NET |access-date=2007-02-10 |archive-date=2007-02-16 |archive-url=https://web.archive.org/web/20070216184915/http://pythonnet.sourceforge.net/ |url-status=live }}</ref> — ещё одна реализация Python для .NET. В отличие от IronPython эта реализация не компилирует Python код в MSIL, а только предоставляет интерпретатор, написанный на [[C Sharp|C#]]. Позволяет использовать .NET-сборки из Python кода.', 730 => '* [[Jython]] — реализация Python, использующая [[JVM]] в качестве среды исполнения. Позволяет прозрачно использовать [[Java]]-библиотеки.', 731 => '* [[TinyPy]]<ref>{{Cite web |url=http://www.tinypy.org/ |title=tinypy |access-date=2008-08-21 |archive-date=2008-09-18 |archive-url=https://web.archive.org/web/20080918042926/http://www.tinypy.org/ |url-status=live }}</ref> — минималистическая версия Python. Часть возможностей CPython не реализована.', 732 => '* [[MicroPython]] — реализация Python 3 для встроенных систем с малым объёмом оперативной памяти<ref>{{Cite web |url=http://micropython.org/ |title=MicroPython |access-date=2014-06-04 |archive-date=2014-06-06 |archive-url=https://web.archive.org/web/20140606021306/http://micropython.org/ |url-status=live }}</ref>.', 733 => '* [[Brython]]<ref>{{Cite web|url = http://www.brython.info/|title = Сайт проекта Brython|author = |date = |publisher = |access-date = 2014-11-06|archive-date = 2014-10-20|archive-url = https://web.archive.org/web/20141020083048/http://www.brython.info/|url-status = live}}</ref> — реализация языка на клиентском JavaScript, позволяющая писать браузерные скрипты на Python 3.', 734 => '* [[QPython]]<ref>{{Cite web|url = http://qpython.com/|title = Сайт проекта QPython|access-date = 2015-02-03|archive-date = 2015-02-04|archive-url = https://web.archive.org/web/20150204000601/http://qpython.com/|url-status = live}}</ref> — реализация Python для Android. Проект всё ещё на стадии тестирования, однако на QPython уже портированы некоторые самые необходимые библиотеки. Позволяет и работать в интерактивном режиме. Существует также Qpython3.', 735 => '', 736 => '== Специализированные подмножества/расширения Python ==', 737 => 'На основе Python было создано несколько специализированных подмножеств языка, в основном предназначенных для статической компиляции в машинный код. Некоторые из них перечислены ниже.', 738 => '* [[RPython]]<ref>{{Cite web |url=http://codespeak.net/pypy/dist/pypy/doc/coding-guide.html |title=PyPy[coding-guide&#93; |accessdate=2007-07-24 |archiveurl=https://web.archive.org/web/20070707005837/http://codespeak.net/pypy/dist/pypy/doc/coding-guide.html#restricted-python |archivedate=2007-07-07 |url-status=dead }}</ref> — созданная в рамках проекта [[PyPy]] сильно ограниченная реализация Python без динамизма времени исполнения и некоторых других возможностей. Код на RPython можно компилировать во множество других языков/платформ — C, JavaScript, Lisp, .NET<ref>{{Cite web |url=http://codespeak.net/pypy/dist/pypy/doc/carbonpython.html |title=PyPy carbonpython |accessdate=2007-07-24 |archiveurl=https://web.archive.org/web/20070912131432/http://codespeak.net/pypy/dist/pypy/doc/carbonpython.html |archivedate=2007-09-12 |url-status=dead }}</ref>, [[LLVM]]. На RPython написан интерпретатор PyPy.', 739 => '* [[Cython]]<ref>{{Cite web |url=http://www.cython.org/ |title=Cython: C-Extensions for Python |access-date=2007-07-28 |archive-date=2007-08-11 |archive-url=https://web.archive.org/web/20070811093728/http://www.cython.org/ |url-status=live }}</ref> — ограниченная реализация Python, но несколько меньше, чем RPython. [[Cython]] расширен возможностями статической типизации типами из языка C и позволяет свободно смешивать типизированный и не типизированный код. Предназначен для написания модулей расширений, компилируется в код на языке C.', 740 => '* [[Nuitka]]<ref>{{Cite web|url=https://nuitka.net/|title=Nuitka the Python Compiler — Nuitka the Python Compiler documentation|website=nuitka.net|access-date=2023-10-09|archive-date=2022-09-03|archive-url=https://web.archive.org/web/20220903042758/https://nuitka.net/|url-status=live}}</ref> — Позволяет транслировать весь код Python в код [[Си (язык программирования)|Си]] или в исполняемые файлы.', 741 => '', 742 => '== Инструменты поддержки программирования ==', 743 => '', 744 => '=== Интерактивный режим ===', 745 => 'Подобно [[Лисп|Lisp]] и [[Пролог (язык программирования)|Prolog]], Python может использоваться в интерактивном режиме, при котором введённые с клавиатуры операторы сразу же выполняются, а результат выводится на экран ([[REPL]]). Этот режим удобен как при изучении языка, так и в процессе профессиональной разработки — для быстрого тестирования отдельных фрагментов кода, — так как обеспечивает немедленную обратную связь. Также он позволяет использовать интерпретатор в качестве [[калькулятор]]а с большим набором функций.', 746 => '* Эталонная реализация Python имеет встроенный интерактивный интерпретатор, работающий в режиме текстового терминала и позволяющий выполнять все основные операции. В интерактивном режиме доступен [[отладчик]] <code>pdb</code> и система помощи (вызывается по <code>help()</code>), работающая для всех модулей, классов и функций, которые содержат строки документации:', 747 => ': <source lang="python3">', 748 => '>>> from math import * # импорт математических функций', 749 => '>>> help(cos) # помощь по функции cos', 750 => 'Help on built-in function cos in module math:', 751 => '', 752 => 'cos(x, /)', 753 => ' Return the cosine of x (measured in radians).', 754 => '</source>', 755 => '* [[IPython]]<ref>{{Cite web |url=http://ipython.scipy.org/ |title=Архивированная копия |accessdate=2006-06-01 |archiveurl=https://web.archive.org/web/20180804135112/http://ipython.scipy.org/ |archivedate=2018-08-04 |url-status=dead }}</ref> — выходящая под [[лицензия BSD|BSD-лицензией]] кросс-платформенная интерактивная оболочка, предоставляющая расширенную интроспекцию и дополнительные команды. В частности, позволяет передавать исполняемому коду на Python результаты выполнения команд системной командной оболочки. Поддерживает подсветку кода и автоматическое дополнение.', 756 => '* [[BPython]]<ref>{{Cite web |url=http://www.bpython-interpreter.org/ |title=bpython interpreter |access-date=2011-02-17 |archive-date=2011-05-11 |archive-url=https://web.archive.org/web/20110511020421/http://bpython-interpreter.org/ |url-status=live }}</ref> — расширение стандартной командной оболочки Python с помощью ряда дополнительных модулей. Реализует подсветку синтаксиса, автоматическое дополнение кода с предложением вариантов, автоматическое выравнивание, интеграция с [[Pastebin]], сохранение ввода в файл, восстановление удалённой строки, предложение параметров для функций.', 757 => '', 758 => 'Почти все IDE для Python поддерживают [[REPL]] для быстрого тестирования.', 759 => '', 760 => '=== IDE ===', 761 => '[[Файл:Python's IDLE.png|мини|[[IDLE]]]]', 762 => 'Существует несколько специализированных [[Интегрированная среда разработки|IDE]] для разработки на Python.', 763 => '* [[Eric]] — полнофункциональный редактор Python и IDE, написанный на Python. Он базируется на кросс-платформенном фреймворке [[Qt]], в качестве компонента редактирования используется [[Scintilla|QScintilla]]. Eric предоставляет возможности ведения проектов, отладки, профилирования, рефакторинга кода, взаимодействия с популярными системами управления версиями, такими как [[Subversion]] и [[Git]]. Расширяется через механизм плагинов. Репозиторий плагинов доступен прямо из среды разработки. Распространяется бесплатно, [[GNU General Public License#GPL v3|лицензия GNU GPL v3]].', 764 => '* [[PyCharm]] — полнофункциональная IDE для Python от [[JetBrains]], доступна на платформах Windows, macOS и Linux, существует в бесплатном (Community) и платном (Professional) вариантах.', 765 => '* {{Не переведено|Wing IDE|Wing IDE}} — линейка Python-IDE от американской фирмы [[Wingware]], включает три варианта: «Wing 101», «Wing Personal», «Wing Pro», из которых первые два бесплатны, последний — платный. Версия Pro обладает всеми необходимыми средствами для профессиональной разработки, включая поддержку проектов, работу с системами управления версиями, расширенные возможности навигации по коду и анализа кода, рефакторинг, поддержка использования [[Django]]. Бесплатные версии предоставляют меньше функций и не выходят за пределы возможностей, доступных в других бесплатных IDE для Python.', 766 => '* [[Spyder (IDE)|Spyder]] — open-source IDE для Python под [[лицензия MIT|лицензией MIT]], бесплатная, доступна на платформах Windows, Mac OS X и Linux. Особенностью является то, что IDE ориентирована на [[data science]], в ней удобно работать с библиотеками типа SciPy, NumPy, Matplotlib. Spyder поставляется в комплекте с менеджером пакетов [[Anaconda (инсталлятор)|Anaconda]]. В целом обладает качествами стандартной IDE, имеет редактор с подсветкой синтаксиса, автоматическое дополнение кода, обозреватель документации.', 767 => '* [[Thonny]] — многоплатформенная бесплатная IDE, выпускается под [[лицензия MIT|лицензией MIT]], поддерживается Институтом информатики [[Тартуский университет|Тартуского университета]] в [[Эстония|Эстонии]]. Позиционируется как «Python IDE для новичков», полностью, включая интерпретатор Python, ставится «из коробки» пользователем без административных прав, сразу после установки может использоваться без дополнительных настроек. Предназначена для обучения, имеет улучшенную визуализацию порядка вычисления выражений и вызова функций, динамическую подсветку синтаксических ошибок, простой менеджер пакетов. Для профессионального применения возможностей недостаточно, например, нет поддержки проектов и интеграции с [[Система управления версиями|системами управления версиями]].', 768 => '* [[IDLE]]<ref>{{Cite web|url=https://docs.python.org/3/library/idle.html|title=IDLE|website=Python documentation|access-date=2023-10-09|archive-date=2020-06-04|archive-url=https://web.archive.org/web/20200604195234/https://docs.python.org/3/library/idle.html|url-status=live}}</ref> — Встроенный в Python IDE. Очень простой и малофункциональный.', 769 => '', 770 => 'Помимо этого, существуют плагины для поддержки программирования на Python для универсальных IDE [[Eclipse (среда разработки)|Eclipse]]<ref>{{Cite web|url=https://marketplace.eclipse.org/content/pydev-python-ide-eclipse|title=PyDev - Python IDE for Eclipse|lang=en|website=Eclipse Plugins, Bundles and Products - Eclipse Marketplace|access-date=2023-10-09|archive-date=2023-10-18|archive-url=https://web.archive.org/web/20231018232415/https://marketplace.eclipse.org/content/pydev-python-ide-eclipse|url-status=live}}</ref>, [[KDevelop]]<ref>{{Cite web|url=https://apps.kde.org/kdev-python/|title=KDevelop Python Support|lang=en|website=KDE Applications|access-date=2023-10-09|archive-date=2023-10-04|archive-url=https://web.archive.org/web/20231004024833/https://apps.kde.org/kdev-python/|url-status=live}}</ref>, [[Visual Studio Code]]<ref>{{Cite web|url=https://code.visualstudio.com/docs/languages/python|title=Python in Visual Studio Code|lang=en|website=code.visualstudio.com|access-date=2023-10-09|archive-date=2023-10-18|archive-url=https://web.archive.org/web/20231018232410/https://code.visualstudio.com/docs/languages/python|url-status=live}}</ref> и [[Microsoft Visual Studio]]<ref>{{Cite web|url=https://visualstudio.microsoft.com/vs/features/python/|title=Visual Studio Python IDE - Python Development Tools for Windows|lang=en-US|website=Visual Studio|access-date=2023-10-09|archive-date=2023-10-02|archive-url=https://web.archive.org/web/20231002182149/https://visualstudio.microsoft.com/vs/features/python/|url-status=live}}</ref>, а также имеется поддержка подсветки синтаксиса, авто дополнения кода и подключения средств отладки и запуска приложений для целого ряда распространённых текстовых редакторов.', 771 => '', 772 => '== Применение ==', 773 => '[[Файл:Python Powered.png|thumb|Python Powered]]', 774 => 'Python — стабильный и распространённый язык. Он используется во многих проектах и в различных качествах: как основной язык программирования или для создания расширений и интеграции приложений. На Python реализовано большое количество проектов, также он активно используется для создания прототипов будущих программ.', 775 => '', 776 => 'Python является лёгким в изучении языком, и часто изучается как первый язык<ref name=":2" />, в том числе используется при обучении детей программированию<ref>{{статья|автор=Васильев Денис Алексеевич|заглавие=Методические особенности изучения языка Python школьниками|издание=Символ науки|год=2017|ссылка=https://cyberleninka.ru/article/n/metodicheskie-osobennosti-izucheniya-yazyka-python-shkolnikami|номер=1|archivedate=2021-07-21|archiveurl=https://web.archive.org/web/20210721012157/https://cyberleninka.ru/article/n/metodicheskie-osobennosti-izucheniya-yazyka-python-shkolnikami}}</ref>. Как первый язык он хорошо подходит, поскольку программы на нём близки к естественному языку, на котором люди привыкли думать, а для написания корректной программы требуется минимальное количество ключевых слов. В других же языках, таких как [[C++]], существует большое количество различных синтаксических конструкций и элементов языка, которым приходится уделять внимание вместо изучения алгоритмов<ref name=":11">{{Статья|ссылка=https://iopscience.iop.org/article/10.1088/1742-6596/423/1/012027|автор=A Bogdanchikov, M Zhaparov, R Suliyev|заглавие=Python to learn programming|год=2013-04-10|язык=en|издание=Journal of Physics: Conference Series|месяц=04|число=10|том=423|страницы=012027|issn=1742-6588, 1742-6596|doi=10.1088/1742-6596/423/1/012027|access-date=2021-03-01|archive-date=2021-06-09|archive-url=https://web.archive.org/web/20210609072244/https://hkvalidate.perfdrive.com/?ssa=7e557f91-2a23-4954-9336-4d6aa8eff543&ssb=13723216276&ssc=https%3A%2F%2Fiopscience.iop.org%2Farticle%2F10.1088%2F1742-6596%2F423%2F1%2F012027&ssi=68a9da23-8427-477c-a539-9f5448a945ec&ssk=support@shieldsquare.com&ssm=42114570057895697108641720190350&ssn=b37115f7a9ef8f78371ddc2fc86e93ac7b7d49c27ea8-1bd1-433f-87f254&sso=a8f8ae2a-7b96902d3b52ffbb038f39585ed097cd097eb09d11627f2d&ssp=97250498481623231227162323594126397&ssq=71610532336343094416123363660343109120417&ssr=MjA3LjI0MS4yMjUuMTU4&sst=Mozilla/5.0%20(Windows%20NT%2010.0;%20Win64;%20x64)%20AppleWebKit/537.36%20(KHTML,%20like%20Gecko)%20Chrome/74.0.3729.169%20Safari/537.36&ssv=&ssw=|deadlink=no|archiveurl=https://web.archive.org/web/20210609072244/https://hkvalidate.perfdrive.com/?ssa=7e557f91-2a23-4954-9336-4d6aa8eff543&ssb=13723216276&ssc=https%3A%2F%2Fiopscience.iop.org%2Farticle%2F10.1088%2F1742-6596%2F423%2F1%2F012027&ssi=68a9da23-8427-477c-a539-9f5448a945ec&ssk=support%40shieldsquare.com&ssm=42114570057895697108641720190350&ssn=b37115f7a9ef8f78371ddc2fc86e93ac7b7d49c27ea8-1bd1-433f-87f254&sso=a8f8ae2a-7b96902d3b52ffbb038f39585ed097cd097eb09d11627f2d&ssp=97250498481623231227162323594126397&ssq=71610532336343094416123363660343109120417&ssr=MjA3LjI0MS4yMjUuMTU4&sst=Mozilla%2F5.0%20%28Windows%20NT%2010.0%3B%20Win64%3B%20x64%29%20AppleWebKit%2F537.36%20%28KHTML%2C%20like%20Gecko%29%20Chrome%2F74.0.3729.169%20Safari%2F537.36&ssv=&ssw=}}</ref>.', 777 => '', 778 => 'Являясь приложением с открытым исходным кодом, интерпретатор Python используется по всему миру и поставляется в составе операционных систем на базе Linux, а также в компьютерах от фирмы [[Apple]]. Python популярен среди индивидуальных разработчиков, но также используется крупными компаниями в достаточно серьёзных продуктах, ориентированных на получение прибыли<ref name=":0" />. На Python написан [[Reddit]]<ref name=":7" /> и Youtube<ref>{{Cite web|url=https://python.plainenglish.io/a-jr-programmer-asked-me-why-google-and-youtube-use-python-f472baf1bab2|title=A Jr Programmer Asked Me Why Google and YouTube Use Python|lang=en|first=Josef|last=Cruz|website=Medium|date=2022-06-07|access-date=2023-10-09|archive-date=2022-06-11|archive-url=https://web.archive.org/web/20220611083439/https://python.plainenglish.io/a-jr-programmer-asked-me-why-google-and-youtube-use-python-f472baf1bab2|url-status=live}}</ref>. В [[Dropbox]]<ref>{{Cite web|url=https://blog.dropbox.com/topics/company/thank-you--guido|title=Thank you, Guido|lang=en|website=blog.dropbox.com|access-date=2023-10-09|archive-date=2021-02-16|archive-url=https://web.archive.org/web/20210216114908/https://blog.dropbox.com/topics/company/thank-you--guido|url-status=live}}</ref> также активно применяется Python, а из-за сложностей динамической типизации и огромного количества кода компания перешла к статической типизации с помощью открытого проекта Mypy<ref>{{Cite web|lang=en|url=https://dropbox.tech/application/our-journey-to-type-checking-4-million-lines-of-python|title=Our journey to type checking 4 million lines of Python|author=Jukka Lehtosalo|website=dropbox.tech|date=2019-09-05|publisher=Dropbox|archiveurl=https://web.archive.org/web/20200922204821/https://dropbox.tech/application/our-journey-to-type-checking-4-million-lines-of-python|archivedate=2020-09-22|accessdate=2020-09-22|url-status=live}}</ref> Также Python активно используется в [[Facebook]]<ref>{{Cite web |url=https://code.facebook.com/posts/1040181199381023/python-in-production-engineering/ |title=Python in production engineering |access-date=2017-01-21 |archive-date=2017-02-02 |archive-url=https://web.archive.org/web/20170202121734/https://code.facebook.com/posts/1040181199381023/python-in-production-engineering/ |url-status=live }}</ref> и [[Instagram]]<ref>{{Cite web |url=https://engineering.instagram.com/what-powers-instagram-hundreds-of-instances-dozens-of-technologies-adf2e22da2ad |title=What Powers Instagram: Hundreds of Instances, Dozens of Technologies |access-date=2017-01-21 |archive-date=2021-06-09 |archive-url=https://web.archive.org/web/20210609072246/https://instagram-engineering.com/what-powers-instagram-hundreds-of-instances-dozens-of-technologies-adf2e22da2ad?gi=7a31ad142d3 |url-status=live }}</ref>. Многие компании используют Python для тестирования аппаратного обеспечения, среди этих компаний значатся [[Intel]], [[Cisco]], [[Hewlett-Packard]] и [[IBM]]. [[Industrial Light & Magic]] и [[Pixar]] используют его при создании анимационных фильмов<ref name=":0" />.', 779 => '', 780 => 'Язык активно используется компанией [[Google (компания)|Google]] в её поисковой системе, а [[YouTube|Youtube]] в значительной степени написан с использованием Python<ref name=":0">{{Книга|ссылка=https://books.google.ru/books?id=1HxWGezDZcgC&pg=PA8|автор=Mark Lutz|заглавие=Learning Python: Powerful Object-Oriented Programming|год=2009-10-06|язык=en|издательство=O'Reilly Media, Inc.|страницы=7—8|страниц=1218|isbn=978-1-4493-7932-2|access-date=2020-09-21|archive-date=2021-04-10|archive-url=https://web.archive.org/web/20210410140715/https://books.google.ru/books?id=1HxWGezDZcgC&pg=PA8|deadlink=no}}</ref><ref>{{cite web |url = https://opensource.googleblog.com/2017/01/grumpy-go-running-python.html |title = Grumpy: Go running Python! |archive-url = https://web.archive.org/web/20170120051915/https://opensource.googleblog.com/2017/01/grumpy-go-running-python.html |archive-date = 2017-01-20 }} — статья в Google Open Source Blog</ref>. Кроме того, Google спонсирует разработку Python с 2010 года<ref name=":20">{{Cite news|title=Google recommits to the Python ecosystem|author=Christina Cardoza|url=https://sdtimes.com/softwaredev/google-recommits-to-the-python-ecosystem/|website=SD Times|date=12.02.2021|accessdate=2021-04-04|archivedate=2021-02-25|archiveurl=https://web.archive.org/web/20210225035350/https://sdtimes.com/softwaredev/google-recommits-to-the-python-ecosystem/}}</ref><ref>{{Cite news|title=Welcoming Google as a Visionary Sponsor of the PSF|url=https://pyfound.blogspot.com/2021/02/welcoming-google-as-visionary-sponsor.html|website=News from the Python Software Foundation|date=11.02.2021|accessdate=2021-04-04|archivedate=2021-04-09|archiveurl=https://web.archive.org/web/20210409073556/https://pyfound.blogspot.com/2021/02/welcoming-google-as-visionary-sponsor.html}}</ref>, и поддержку [[PyPI]], основной системы распространения пакетов для Python<ref name=":20" /><ref>{{Cite news|title=Google Cloud финансирует экосистему Python|url=https://www.osp.ru/articles/2021/0302/13055821|website=Издательство «Открытые системы»|date=02.03.2021|accessdate=2021-04-04|archivedate=2021-06-09|archiveurl=https://web.archive.org/web/20210609072356/https://www.osp.ru/articles/2021/0302/13055821}}</ref>.', 781 => '', 782 => 'Сильными сторонами Python являются его модульность и возможность интегрироваться с другими языками программирования, в том числе в составе сложных комплексных приложений и систем<ref>{{Статья|ссылка=https://www.frontiersin.org/articles/10.3389/fninf.2015.00011/full|автор=Eilif Muller, James A. Bednar, Markus Diesmann, Marc-Oliver Gewaltig, Michael Hines|заглавие=Python in neuroscience|год=2015|язык=en|издание=Frontiers in Neuroinformatics|месяц=04|число=14|том=9|issn=1662-5196|doi=10.3389/fninf.2015.00011|archiveurl=https://web.archive.org/web/20201130064502/https://www.frontiersin.org/articles/10.3389/fninf.2015.00011/full|archivedate=2020-11-30|access-date=2021-03-01|deadlink=no}}</ref>. Сочетание простоты и лаконичности с большим количеством возможностей делает Python удобным в качестве [[Скриптовые языки|скриптового языка]]{{Нет АИ|30|03|2021}}. Многие проекты предоставляют прикладной интерфейс программирования на Python для написания скриптов, например, среды 3D-моделирования [[Autodesk Maya]]<ref name=":0" />, [[Blender]]<ref>{{Cite web|lang=en|url=https://docs.blender.org/manual/en/latest/advanced/scripting/introduction.html|title=Scripting & Extending Blender : Introduction|website=Blender Manual|publisher=Blender|archiveurl=https://web.archive.org/web/20200921203043/https://docs.blender.org/manual/en/latest/advanced/scripting/introduction.html|archivedate=2020-09-21|accessdate=2020-09-21|url-status=live}}</ref> и [[Houdini (графическая программа)|Houdini]]<ref>{{Cite web|lang=en|url=https://www.sidefx.com/docs/houdini/hom/index.html|title=Python Scripting|website=www.sidefx.com|accessdate=2020-09-27|archive-date=2020-09-29|archive-url=https://web.archive.org/web/20200929134233/https://www.sidefx.com/docs/houdini/hom/index.html|url-status=live}}</ref>, а также свободная геоинформационная система [[QGIS]]<ref>{{Cite web|lang=en|url=https://gis.ucar.edu/building-plugin-qgis|title=Building a plugin for QGIS|website=Geographic Informations Systems (GIS) Program|publisher=National Center for Atmospheric Research|archiveurl=https://web.archive.org/web/20200923160619/https://gis.ucar.edu/building-plugin-qgis|archivedate=2020-09-23|accessdate=2020-09-23|url-status=live}}</ref>. Некоторые проекты реализуют базовую часть на более производительных языках программирования, а для упрощения работы предоставляют полноценный интерфейс прикладного программирования на Python{{Нет АИ|30|03|2021}}. Так, движок свободного [[видеоредактор]]а [[OpenShot Video Editor|OpenShot]] реализован в виде библиотеки ''libopenshot'', написанной на C++ с использованием библиотек на Си, а все возможности полностью покрыты прикладным интерфейсом программирования Python<ref>{{Cite web|lang=en|url=https://www.kickstarter.com/projects/421164014/openshot-video-editor-for-windows-mac-and-linux|title=OpenShot Video Editor for Windows, Mac, and Linux|author=Jonathan Thomas|date=2020-03-04|publisher=[[Kickstarter]]|archiveurl=https://web.archive.org/web/20200923172045/https://www.kickstarter.com/projects/421164014/openshot-video-editor-for-windows-mac-and-linux/description|archivedate=2020-09-23|accessdate=2020-09-23|url-status=live}}</ref>{{Значимость факта?}}. [[Агентство национальной безопасности США]] использует Python для анализа данных, а [[NASA]] использует его при выполнении научных задач<ref name=":0" />. Из инструментов, используемых в NASA, можно отметить свободный графический симулятор сети {{Не переведено 5|GNS3|3=en|4=Graphical Network Simulator-3}}, который также хорошо зарекомендовал себя в корпоративной среде и используется в технологических компаниях, например, в [[Intel]]<ref>{{Cite web|lang=en-US|url=https://fedoramagazine.org/using-gns3-with-fedora/|title=Using GNS3 with Fedora|website=Fedora Magazine|date=2019-08-28|accessdate=2020-09-22|archive-date=2020-10-01|archive-url=https://web.archive.org/web/20201001161823/https://fedoramagazine.org/using-gns3-with-fedora/|url-status=live}}</ref>. На Python написана также свободная популярная программа нарезки 3D моделей для печати на 3D-принтерах [[Cura]]<ref>{{Cite web |url=https://github.com/Ultimaker/Cura |title=Ultimaker Cura GitHub |access-date=2020-09-19 |archive-date=2020-09-17 |archive-url=https://web.archive.org/web/20200917042356/https://github.com/Ultimaker/Cura |url-status=live }}</ref><ref>{{Cite web|lang=en|url=https://all3dp.com/1/best-3d-slicer-software-3d-printer/|title=2020 Best 3D Printer Slicer Software|author=natol Locker|website=All3DP|date=2020-01-02|publisher=|accessdate=2020-09-24|quote=The list is sorted by popularity (via Alexa rank)|archive-date=2020-08-13|archive-url=https://web.archive.org/web/20200813221813/https://all3dp.com/1/best-3d-slicer-software-3d-printer/|url-status=live}}</ref>.', 783 => '', 784 => 'Python с пакетами [[NumPy]], [[SciPy]] и [[Matplotlib|MatPlotLib]] активно используется как универсальная среда для научных расчётов в качестве замены распространённым специализированным коммерческим пакетам, таким как [[Matlab]], предоставляя аналогичную функциональность и более низкий порог вхождения<ref>{{Статья|ссылка=https://www.frontiersin.org/articles/10.3389/neuro.11.005.2009/full|автор=Peter Jurica, Cees Van Leeuwen|заглавие=OMPC: an open-source MATLAB®-to-Python compiler|год=2009|язык=English|издание=Frontiers in Neuroinformatics|том=3|issn=1662-5196|doi=10.3389/neuro.11.005.2009|access-date=2020-09-29|archive-date=2020-11-29|archive-url=https://web.archive.org/web/20201129111400/https://www.frontiersin.org/articles/10.3389/neuro.11.005.2009/full|deadlink=no|archivedate=2020-11-29|archiveurl=https://web.archive.org/web/20201129111400/https://www.frontiersin.org/articles/10.3389/neuro.11.005.2009/full}}</ref>. По большей части на Python написана также графическая программа {{Нп3|Veusz|4=Veusz}}<ref>{{Cite web|lang=en|url=https://veusz.github.io/development/|title=Veusz Development|website=Veusz|publisher=Github Pages|archiveurl=https://web.archive.org/web/20201002203816/https://veusz.github.io/development/|archivedate=2020-10-02|accessdate=2020-10-02|url-status=live}}</ref>, позволяющая создавать качественные графики, готовые для размещения в научных публикациях<ref>{{публикация|1=книга|ссылка=https://www.oryxthejournal.org/writing-for-conservation-guide|автор=Fisher, M.|заглавие=Writing for Conservation|год=2019|часть=Plot with a purpose|ссылка часть=https://www.oryxthejournal.org/writing-for-conservation-guide/plot-with-a-purpose.html|язык=en|издательство=Fauna & Flora International, Cambridge|часть архив=https://web.archive.org/web/20201002201841/https://www.oryxthejournal.org/writing-for-conservation-guide/plot-with-a-purpose.html|часть архив дата=2020-10-02|архив дата=2020-11-01|архив=https://web.archive.org/web/20201101045131/https://www.oryxthejournal.org/writing-for-conservation-guide/}}</ref>{{Значимость факта?}}. Библиотека [[Astropy]] — популярный инструмент для астрономических расчётов<ref>{{публикация|статья|ссылка=https://iopscience.iop.org/article/10.3847/1538-3881/aabc4f/pdf|автор=The Astropy Collaboration, A. M. Price-Whelan, B. M. Sipőcz, H. M. Günther, P. L. Lim, S. M. Crawford, S. Conseil, D. L. Shupe, M. W. Craig, N. Dencheva|заглавие=The Astropy Project: Building an Open-science Project and Status of the v2.0 Core Package|год=2018|язык=en|издание=The Astronomical Journal|месяц=08|число=24|том=156|выпуск=3|страницы=123|issn=1538-3881|doi=10.3847/1538-3881/aabc4f|архив=https://web.archive.org/web/20201002210222/https://iopscience.iop.org/article/10.3847/1538-3881/aabc4f/pdf|архив дата=2020-10-03}}</ref>{{Значимость факта?}}.', 785 => '', 786 => 'Также Python является лучшим языком программирования по использованию в ИИ сфере<ref>{{Cite web|url=https://djangostars.com/blog/why-python-is-good-for-artificial-intelligence-and-machine-learning/|title=8 Reasons Why Python is Good for Artificial Intelligence and Machine Learning|lang=en-US|first=Alexander|last=Ryabtsev|website=Software Development Blog & IT Tech Insights {{!}} Django Stars|date=2019-03-11|access-date=2023-10-09|archive-date=2023-10-18|archive-url=https://web.archive.org/web/20231018232408/https://djangostars.com/blog/why-python-is-good-for-artificial-intelligence-and-machine-learning/|url-status=live}}</ref>', 787 => '', 788 => 'Также Python подходит для выполнения нестандартных или сложных задач в [[Автоматизация сборки|системах сборки]] проектов, что обусловлено отсутствием необходимости предварительной компиляции исходных файлов. В проекте [[Google C++ Testing Framework|Google Test]] он используется для генерации исходного кода [[mock-объект]]ов для классов языка [[C++]]<ref>{{Cite web|url=https://github.com/google/googletest/blob/b88511ef640c046ec9c7553b383a2aba64c80967/googlemock/scripts/generator/README|title=The Google Mock class generator README|author=|website=[[Google C++ Testing Framework|Google Test]]|date=|publisher=github.com|access-date=2019-02-03|archive-date=2021-06-09|archive-url=https://web.archive.org/web/20210609072349/https://github.com/google/googletest/blob/b88511ef640c046ec9c7553b383a2aba64c80967/googlemock/scripts/generator/README|url-status=live}}</ref>{{Значимость факта?}}.', 789 => '', 790 => 'Интерпретатор Python может использоваться в качестве мощной командной оболочки и скриптового языка для написания командных файлов ОС. Лёгкость обращения из Python-скриптов к внешним программам и наличие библиотек, дающих доступ к управлению системой, делают Python удобным инструментом для системного администрирования<ref name="GiftJones">{{публикация|книга|автор=Noah Gift, Jeremy M. Jones|заглавие=Python for Unix and Linux System Administration|isbn=978-0-596-51582-9}}</ref>. Он широко используется для этой цели на платформе Linux: обычно Python поставляется с системой, во многих дистрибутивах инсталляторы и визуальный интерфейс системных утилит написаны именно на Python. Используется он и в администрировании других Unix-систем, в частности, в [[Solaris]] и [[macOS]]<ref name="GiftJones" />. [[Кроссплатформенность]] самого языка и библиотек делает его привлекательным для унифицированной автоматизации задач системного администрирования в гетерогенных средах, где совместно применяются компьютеры с операционными системами различных типов.', 791 => '', 792 => 'Будучи языком общего назначения Python применим почти во всех сферах деятельности. Фактически Python используется практически любой солидной компанией тем или иным образом как для выполнения текущих задач, так и в тестировании, администрировании или в разработке программных продуктов<ref name=":0" />.', 793 => '', 794 => '== Примечания ==', 795 => '', 796 => '=== Комментарии ===', 797 => '{{Примечания|group=К}}', 798 => '', 799 => '=== Источники ===', 800 => '{{примечания|2|refs=', 801 => '<ref name="foreword">{{cite web|url=https://www.python.org/doc/essays/foreword/|title=Foreword for «Programming Python» (1st ed.)|lang=en|accessdate=2021-03-07|url-status=live|archiveurl=https://web.archive.org/web/20210120125441/https://www.python.org/doc/essays/foreword/|archivedate=2021-01-20}}</ref>', 802 => '', 803 => '<ref name="PyS60">{{cite web |url = http://wiki.opensource.nokia.com/projects/PyS60 |title = Python for S60 — OpenSource |archive-url = https://web.archive.org/web/20090806081738/http://wiki.opensource.nokia.com/projects/PyS60 |archive-date = 2009-08-06 }}</ref>', 804 => '}}', 805 => '', 806 => '== Литература ==', 807 => '{{викифицировать литературу}}', 808 => '* {{Публикация|Книга|заглавие=Python. К вершинам мастерства|ref=Рамальо|ссылка=https://books.google.ru/books?id=qVBjDwAAQBAJ|год=2016|автор=Лучано Рамальо|язык=ru|место=|издательство=ДМК Пресс|оригинал язык=en|издание=|оригинал=Fluent Python. O’Reilly, 2015}}', 809 => '* {{Публикация|книга|заглавие=Автостопом по Python|ref=К. Рейт, Т. Шлюссер|год=2017|автор=Кеннет Рейтц, Таня Шлюссер|язык=ru|ссылка=https://www.google.ru/books/edition/Автостопом_по_Python/ZfcxDwAAQBAJ|издательство=Издательский дом «Питер»|оригинал=The Hitchhiker`s Guide to Python|оригинал ссылка=https://www.google.ru/books/edition/The_Hitchhiker_s_Guide_to_Python/nHDtDAAAQBA|оригинал язык=en|isbn=9785496030236}}', 810 => '* {{книга|автор=David M. Beazley|заглавие=Python Essential Reference|издание=4th Edition|год=2009|издательство=Addison-Wesley Professional|страниц=717|isbn=978-0672329784|ref=Beazley}}', 811 => '* {{Книга|заглавие=Parallel Programming with Python|автор=Jan Palach|ссылка=https://books.google.ru/books?id=bE_lAwAAQBAJ|издательство=Packt Publishing Ltd|год=2014|ref=Palach}}', 812 => '* {{Публикация|книга|заглавие=Python. Лучшие практики и инструменты|ref=Яворски, Зиаде|год=2021|автор= Яворски Михал, Зиаде Тарек|язык=ru|ссылка=https://www.google.ru/books/edition/Python_Лучшие_практики_и/hHswEAAAQBAJ|издательство=Издательский дом «Питер»|оригинал=Expert Python Programming|оригинал ссылка=https://www.google.ru/books/edition/Expert_Python_Programming/2tAwEAAAQBAJ|оригинал язык=en}}', 813 => '* {{книга|автор = {{comment|Фёдоров, Д. Ю.|Фёдоров, Дмитрий Юрьевич}}|заглавие = Программирование на языке высокого уровня Python|ссылка = https://urait.ru/viewer/programmirovanie-na-yazyke-vysokogo-urovnya-python-492920#page/1|место = Москва|издательство = Издательство Юрайт|год = 2022|страниц = 210|серия = Высшее образование|isbn = 978-5-534-14638-7}}', 814 => '', 815 => '== Ссылки ==', 816 => '{{Навигация', 817 => ' | Тема = Python', 818 => ' | Викиучебник = Python', 819 => ' | Викитека = Категория:Python', 820 => '}}', 821 => '* [http://www.python.org/ Официальный сайт]{{ref-en}}', 822 => '', 823 => '{{Python}}', 824 => '{{Языки программирования}}', 825 => '{{ВС}}', 826 => '', 827 => '', 828 => '[[Категория:Python|*]]', 829 => '[[Категория:Статьи с примерами кода Python]]', 830 => '[[Категория:Языки с динамической типизацией]]', 831 => '[[Категория:Языки веб-программирования]]', 832 => '[[Категория:Высокоуровневые языки программирования]]' ]
Была ли правка сделана через выходной узел сети Tor (tor_exit_node)
false
Unix-время изменения (timestamp)
'1708501726'
Название базы данных вики (wiki_name)
'ruwiki'
Языковой код вики (wiki_language)
'ru'