Coming Soon!
This is going to be another great website hosted by PythonAnywhere.
PythonAnywhere lets you host, run, and code Python in the cloud. Our free plan gives you access to machines with everything already set up for you. You can develop and host your website or any other code directly from your browser without having to install software or manage your own server.
Need more power? Upgraded plans start at $5/month.
Developer info
Hi! If this is your PythonAnywhere-hosted site, then you’re almost there — you just need to create a web app to handle this domain.
Python Syntax
В предыдущей статье рассмотрели достоинства и недостатки ЯП Python, установили интерпретатор python3 и написали первую программу Hello, world!.
В сегодняшней статье расммотрим синтаксис языка, модель динамической типизации.
Синтаксис языка Python
Идентификаторы
Идентификаторы в Python — это имена, используемые для определения переменных, функций, классов, модулей и других объектов. Идентификатор начинается с букв A-Z или a-z, либо знака подчеркивания (_), после чего следует ноль или больше букв, знаков подчеркивания или цифр от 0 до 9.
Никогда не создавайте свою собственную переменную с именем (_), так как это имя зарезервировано самим интерпретатором.
В идентификаторах Python не используются знаки @, $ и %. Так же – Python чувствителен к регистру символов, т.е. Manpower и manpower являются двумя различными именами (идентификаторами).
Зарезервированные имена
В списке ниже приведены имена, которые зарезервированы в Python, и их использование не допускается в использовании определения констант, переменных или любых других пользовательских именах. Все зарезервированные слова содержат только строчные буквы:
| and | del | from | not | while |
| as | elif | global | or | with |
| assert | else | if | pass | yield |
| break | except | import | ||
| class | exec | in | raise | |
| continue | finally | is | return | |
| def | for | lambda | try |
Список зарезервированых имен можно так же получить следующим образом:
Строки и отступы
Одно из самых важных замечаний для тех, кто начал изучать Python – это то, что в нём при обозначении границ блоков кода для классов и функций, а так же для управления потоками, не используются привычные некоторым фигурные скобки. Вместо этого – в Python используются отступы строк.
Количество отступов в начале строки не имеет значения, но все операторы внутри такого блока должны иметь их одинаковое количество.
Например, оба блока в примере ниже выполнены правильно:
А вот второй блок в следующем примере – приведёт к ошибке интерпретатора IndentationError: unexpected indent:
Таким образом, все линии, имеющие одинаковое количество отступов от начала строки будут формировать блок кода.
Многострочные операторы
Операторы и операнды в Python как правило заканчиваются новой строкой. Однако, есть возможность использовать знак продолжения строки (\) для обозначения того, что строка продолжается. Например:
Операнды, заключённые в скобки [], <> или () не нуждаются в использовании такого символа. Например:
Что бы представлять себе разницу между “оператором” и “операндом” при выполнении “операции” – посмотрите на эту картинку:
Кавычки в Python
В Python используются одинарные (‘), двойные (") и тройные (»’ или """) кавычки для обозначения строковых литералов (или просто – строк).
Тройные кавычки могут использоваться для охвата многострочного текста.
Комментарии в Python
Хеш-тег (#), который не находится внутри строки задаёт начало комментария. Все символы после # и до конца строки являются частью комментария, и Python игнорирует их.
Приведённый выше код даст такой результат:
Комментарии так же можно размещать и на одной строке после операторов или выражения, например:
Многострочные комментарии можно создать так:
Пустые строки
Пустые строки, или строки содержащие только пробелы, или строки с комментариями, игнорируются интерпретатором.
В интерактивной сессии интерпретатора, необходимо ввести пустую строку для завершения многострочного оператора.
Более подробно о том, как правильно оформлять код Python можно прочитать в PEP8!
PEP (python enhanced proposal) — заявки на улучшение языка Python.
Модель динамической типизации
В одном из примеров мы не объявляли тип переменной либо её саму:
У вас может возникнуть вопрос, как же интерператор Python узнает, что речь идет о строке? И вообще, как Python узнает, что есть что?
Для того, чтобы ответить на эти вопросы, необходимо рассмотреть как работает динамическая типизация в Python. Типы данных в Python определяются автоматически во время выполнения, а не в результате объявлений в программном коде. Это означает, что вам не требуется заранее объявлять переменные (эту концепцию проще понять, если иметь в виду, что все сводится к переменным, объектам и ссылкам между ними).
Создание переменной
Переменная (т.е. имя или идентификатор), такая как name, создается автоматически, когда в программном коде ей впервые присваивается некоторое значение. Все последующие операции присваивания просто изменяют значение, ассоциированное с уже созданным именем.
Типы переменных
Переменные не имеют никакой информации о типе или ограничениях, связанных с ними. Понятие типа присущие объектам, а не именам. Переменные универсальны по своей природе — они всегда являются всего лишь ссылками на конкретные объекты в конкретные моменты времени.
Использование переменной
Когда переменная участвует в выражении, ее имя замещается объектом, на который она в настоящий момент ссылается, независимо от того, что это за объект. Кроме того, прежде чем переменную можно будет использовать, ей должно быть присвоено значение — использование неицициализированной переменной приведет к ошибке (NameError: name ‘name’ is not defined).
Для того чтобы понимать что происходит при присваивании некого значения переменной, рассмотрим такой пример:
Python выполнит эту инструкцию в три этапа, концептуально.
- Cоздается объект, представляющий число 3.
- Создается пременная a, если она еще отсутствует.
- В переменную a записывается ссылка на вновь созданный объект, представляющий число 3.
Информация о типе хранится в объекте, но не в переменной.
Допустим, у нас есть следующий пример:
Как уже указывалось ранее, имена не имеют типов, тип — это свойство объекта, а не имени. В предыдущем листинге просто изменяется ссылка на объект. Все что можно сказать о перменных в языка Python — это то, что они создаются на конкретные объекты в конкретные моменты времени.
Объекты знают, к какому типу они относятся, — каждый объект содержит поле, в котором хранится информация о его типе. Целочисленный объект 3, например, будет содержать значение 3 плюс информацию, которая сообщит интерпретатору Python, что объект является целым числом (строго говоря — это указатель на объект с названием int). Описатель типа для строки ‘spam’ указывает на строковой тип (с именем str). Поскольку информация о типе хранится в объектах, ее не нужно хранить в переменных.
У кого-то может возникнуть вопрос: что происходит с прежними значениями, когда выполняется новое присваивание? Например, что произойдет с объектом 3 после выполнения следующих инструкций:
Основная выгода от сборки мусора состоит в том, что вы может свободно распоряжаться объектами, не будучи обязаны освбождать память в своем сценарии.
Когда имя ассоциируется с новым объектом, интепретатор Python освобождает память, занимаемую предыдущим объектом (если на него не ссылается какое-либо другое имя или объект). Такое автоматическое освобождение памяти, занимаемой объектами, называется сборкой мусора (garbage collection).
Разделяемые ссылки
До сих пор мы рассматривали вариант, когда ссылка на объект присваивается единственной переменной. Теперь введем в действие еще одну переменную и посмотрим, что происходит с именами и объектами в это случае:

В языке Python это называется разделяемая ссылка — несколько имен ссылаются на один и тот же объект.
Далее добавим еще одну инструкцию:
В результате выполнения этой инструкции создается новый объект, представляющий строку ‘spam’, а ссылка на него записывается в переменную a. Однако эти действия не оказывают влияния на переменную b — она по-прежнему ссылается на первый объект, целое число 3. В результате схема взаимоотношений приобретает вид:

То же самое произошло бы, если бы ссылка на объект ‘spam’ вместо переменной a была присвоена переменной b — изменилась бы только переменная b, но не а. Аналогичная ситуация возникает, даже если тип объекта не изменяется. Например, рассмотрим следующие три инструкции:
В этой последовательности происходит те же самые события: интепретатор Python создает переменную a и записывает в нее ссылку на объект 3. После этого он создает переменную b и записывает в нее ту же ссылку, что хранится в переменной a. Наконец, последняя инструкция создает совершенно новый объект (в данном случае — целое число 5, которое является результатом выполнения операции сложения). Это не приводит к изменению переменной b. В действительности нет никакого способа перезаписать значение объекта 3, целые числа относятся к категории неизменяемых (подробнее о категориях и типов данных далее), и поэтому эти объекты невозможно изменить.
Разделяемые ссылки и изменяемые объекты
Как будет показано дальше в этом цикле статей, существуют такие объекты и операции, которые приводят к изменению самих объектов. Например, операции присваивания значения элементу списка фактически изменяют сам список вместо того, чтобы создавать совершенно новый объект списка. При работе с объектами, допускающими такие изменения, необходимо быть особенно внимательными при использовании разделяемых ссылок, так как изменение одного имени может отразиться на других именах.
Возьмем в качестве примера объекты списков (будут рассмотрены подробно в следующей части). Списки, поддерживают возможность присваивания значений элементам, — это просто коллекция объектов, которые в программном коде записываются как литералы в квадратных скобках:
В данном случае L1 — это список, содержащий объекты 2, 3 и 4. Доступ к элементам списка осуществляется по их индексам; так, L1[0] — ссылается на объект 2, т.е. на первый элемент в списке L1. Cписки являются полноценными объектами, такими же, как целые числа и строки. После выполнения двух приведенных выше инструкций L1 и L2 будут ссылаться на один и тот же объект, так же, как переменные a и b в примере выше. Точно так же, если теперь добавить еще одну инструкцию:
Переменная L1 будет ссылаться на другой объект, а L2 по-прежнему будет ссылаться на первоначальный список. Однако если синтаксис последней инструкции немного изменить, эффект получится другим:
Здесь мы не изменяем сам объект L1, изменяется компонент объекта, на который ссылается L1. Данное изменение затронуло часть самого объекта списка. Поскольку объект списка разделяется разными переменными, то изменения в самом списке затрагивают не только L1, т.е. следует понимать, что такие изменения могут сказываться в других частях программы. В этом примере изменения обнаруживаются также в переменной L2, потому что она ссылается на тот же самый объект, что и L1. Здесь мы фактически не изменяли L2, но значение этой переменной изменилось.
Это поведение по умолчанию: если вас оно не устраивает, можно потребовать от интерпретатора, чтобы вместо создания ссылок он выполнял копирование объектов. Скопировать список можно несколькими способами, включая встроенную функцию list и модуль copy из стандартной библиотеки. Однако самым стандартным способом копирования является получение среза (так же будет рассмотрено в следующих частях) от начала и до конца списка.
Будьте внимательны, что способ, основанный на получении среза, неприменим в случае с другими изменяемым базовым типом — со словарем (будет рассмотрен подробно в следущей части), потому что словарь не является последовательностью. Чтобы скопировать словарь, необходимо воспользоваться методом X.copy(). Следует также отметить, что модуль copy из стандартной библиотеки имеет в своем составе универсальную функцию, позволяющую копировать объекты любых типов, включая вложенные структуры (например, словари с вложенными списками).
Разделяемые ссылки и равенство
Возможность сборки мусора, описанная ранее, может оказаться более принципиальным понятием, чем литералы для объектов некоторых типов.
Так как интерпретатор Python кэширует и повторно использует малые целые числа и небольшие строки, объект 42 скорее всего не будет уничтожен. Он, вероятнее всего, останется в системной таблице для повторного использования, когда вы вновь сгенерируете число 42 в программном коде. Однако большинство объектов уничтожаются немедленно, как только будет потеряна последняя ссылка, особенно те, к которым применение механизма кэширования не имеет смысла.
Согласно модели ссылок в языке Python, существует два разных способа выполнять проверку равенства.
Первый способ, основанный на использовании оператора ==, проверяет, равны ли значения объектов. В языке Python практически всегда используется именно этот способ. Второй способ, основанный на использовании оператора is, проверяет идентичность объектов. Он возвращает значение True, только если оба имени ссылаются на один и тот же объект, вследствие этого он является более строгой формой проверки равенства.
На самом деле оператор is просто сравнивает указатели, которые реализуют ссылки, и тем самым может использоваться для выявления разделяемых ссылок в программном коде. Он возвращает значение False, даже если имена ссылаются на эквивалентные, но разные объекты, как, например, в следующем случае, когда выполняются два различных литеральных выражения:
Посмотрим, что происходит, если те же самые действия выполняются над малыми целыми числами:
В этом примере переменные x и y должны быть равны, но не эквивалентны, потому что было выполнено два разных литеральных выражения. Однако из-за того, что малые целые числа и строки кэшируются и используются повторно, оператор is сообщает, что переменные ссылаются на один и тот же объект.
Фактически если вы действительно хотите взглянуть на работу внутренних механизмов, вы всегда можете запросить у интерпретатора количество ссылок на объект: функция getrefcount из стандартного модуля sys возвращает значение поля счетчика ссылок в объекте.
На этом сегодняшняя статья окончена. В следующий раз рассмотрим типы данных.
Синтаксис Python для начинающих. Базовые примеры синтаксиса
Python — высокоуровневый язык программирования, который пользуется большим спросом. Он ориентирован на повышение производительности разработчика и читаемости кода.
Несмотря на минималистичный синтаксис, Python позволяет решать множество современных задач и поддерживает несколько парадигм программирования. При этом популярность языка постоянно растёт, а последнее время он регулярно попадает в ТОП-5 рейтинга TIOBE.
Python не зря называют одним из лучших языков для начинающих. Во многом, так говорят за счёт его синтаксиса, который является гибким, минималистичным и почти «всепрощающим». А ведь синтаксис языка программирования Python действительно прост, и базовое описание о нём легко помещается в небольшой абзац. В этой статье мы его рассмотрим и сделаем это максимально просто и понятно.
Особенности синтаксиса языка Python:
- Конец строки в Пайтоне является концом инструкции, то есть точка с запятой не нужна.
- Вложенные инструкции объединяют в блоки в зависимости от величины отступов. Причём отступ может быть любым – главное то, чтобы он был одинаковым в пределах одного вложенного блока. Естественно, тут стоит помнить про читабельность вашего кода. То есть отступ в 1 пробел вряд ли можно назвать лучшим решением, а вот использование Tab уже лучше.
- Вложенные инструкции в языке программирования Python записывают с учётом одного и того же шаблона, исходя из которого, основная инструкция завершается двоеточием, а вслед за двоеточием располагается вложенный блок кода. Этот блок кода, как правило, имеет отступ под строкой основной инструкции. Давайте посмотрим, как выглядит этот синтаксис на примере:
Специальные случаи в синтаксисе языка Python:
- Допускается запись нескольких инструкций в одной строке, разделяемых точкой с запятой:
Главное — не злоупотреблять этой возможностью, ведь через месяц даже вы сами не сможете прочитать свой код. Помните об этом. 2. Допускается запись одной инструкции в нескольких строках. Для этого достаточно заключить её в круглые, квадратные либо фигурные скобки. 3. Тело составной инструкции можно располагать в той же строке, в которой располагается основная инструкция, но при условии, что основная инструкция не содержит составных инструкций:
Синтаксис Python на примере первой программы
Чтобы получить более чёткое представление о базовом синтаксисе языка программирования Python, давайте напишем простейшую программу. Если это ваша первая программа, воспользуйтесь любым онлайн-компилятором, поддерживающим Пайтон, например, этим.
И поместите туда следующий код, написанный в соответствии с правилами синтаксиса:
Уже на примере этой строчки мы видим, насколько прост синтаксис Python, ведь мы создали вполне себе рабочую программу, состоящую всего из одной строчки! Как вы уже догадались, программа выводит в терминал надпись ‘Welcome to OTUS!’, используя функцию print() . Да, вместо классического ‘Hello, World!’ мы написали другое словосочетание. Но и вы можете написать всё, что пожелаете — или вы не будущий Python-программист?
Теперь усложним задачу и напишем ещё что-нибудь:
Эта программа состоит всего из двух строк, зато она не просто выводит какое-нибудь сообщение, а является интерактивной, то есть взаимодействует с пользователем: 1) мы присваиваем переменной s значение функции input() с параметром ‘What is your name? \n’. А знак табуляции \n переносит строку (осуществляет перевод на новую строку), чтобы всё выглядело красиво (можете этот знак убрать и посмотреть, что получится); 2) input() получает строку, которую вы вводите с клавиатуры, а переменная s приобретает введённое вами значение; 3) уже знакомая вам функция print() выводит в терминал полученный результат, подставляя имя, которое вы введёте.
Результат:

Вот и всё)) Как видите, ничего сложного нет (пока). Вы можете поэкспериментировать с этим кодом, вставляя туда свои значения.
Если же вы всерьёз решили стать Python-программистом, но только начинаете свой путь на этом поприще, обратите внимание на наш подготовительный курс. Успешно освоив его, вы сможете в дальнейшем поступить и на курс для продвинутых разработчиков, где творится настоящая магия:
Мы предлагаем вам best practice по решению прикладных задач и освоению инструментов, применяемых при разработке инфраструктурных решений, веб-приложений, систем контроля качества и аналитических систем.
На кого рассчитан курс?
Курс предназначен для разработчиков, имеющих опыт программирования и желающих повысить свою квалификацию путём получения новых знаний и навыков. Вам будет комфортно учиться, если вы: — уверенно чувствуете себя с Python; — знакомы с C; — имеете представление о сетевом взаимодействии и реляционных СУБД; — знаете, как обращаться с Linux, git’ом и другими стандартными инструментами девелопера.
В чём особенность курса?
Главная цель — погрузить вас в современную «промышленную» разработку путём освоения основных software engineering компетенций и формирования прагматичного подхода к решению поставленных задач. Выполнение этой цели достигается с помощью следующих особенностей курса: 1. Высокая практикоориентированность. Студентам предлагается много домашних заданий, причём некоторые из них представляют собой настоящий challenge. Задания можно выполнять и во 2-й, и в 3-й версии Python, что говорит об универсальности программы. В конце курса предусмотрен большой выпускной проект.
2. Широкий охват. Вы испытаете свои способности и в web, и в анализе данных, и в вопросах создания высоконагруженных систем. Вы поймёте структуру разработки ПО и узнаете ответы на следующие вопросы: — как писать простой и идиоматичный код, за который не будет мучительно стыдно? — как тестировать и поддерживать код на Python? — как создать приложение, которое не умрёт под нагрузкой?
Basic Python Syntax — Introduction to Syntax and Operators
![]()
In this post, we’ll build our knowledge in Python syntax. We are one step away from covering the essentials, and then we’ll be able to dive into more interesting programming tasks.
Jump to the section you need:
The Double Equality Sign
You know the right way to interpret the equals sign when programming is “assign” or “bind to”. For instance, “assign 5 to the power of 3 to the variable y”; “bind 5 to the power of 3 to y”. This means from that moment for the computer, y will be equal to 125.
Here is what will happen when you double the equality sign. Let me type “y, double equality sign, 125”. The correct way to read this code is “y equals 125”. When you run this command, the computer will assume you have requested an answer to the question, “Is y really equal to 125?” This is why, after the execution of this cell, the machine will respond with a Boolean value — it will either return “True” or “False”.
Let’s check our output when we state y is equal to 126. Great! The machine replied with “False” because 125 and 126 are different numbers. Wonderful!
Remember — when you mean equality between values and not assignment of values in Python, you’ll need the double equality sign. Anytime you use it, you will obtain one of the two possible outcomes — “True” or “False”.
Next we will show you how variables can be reassigned in Python.
Reassign Values
Ok, let me explain a programming concept that is valid for other programming languages, as well. If I assign the value of 1 to a variable z, my output after executing z will be 1. After that, if I assign 3 to the same variable z, z will be equal to 3, not 1 anymore.
Well, the order of the commands matters. Initially, we said z will be equal to 1, and that was true until we changed the value to 3. For the computer, from that moment on, z is not equal to 1, and it will continue to be 3. As proof, see this — if we add 5 to z, we will get 8, not 1 plus 5, which is equal to 6. Then, if we suddenly decide z is equal to 7, z will not be equal to 1 or 3 anymore.
Python reassigns values to its objects. Therefore, remember the last command is valid, and older commands are overwritten.
Try to be careful when performing calculations. We should remember we can only combine numbers and not strings. If you put 5 in quotes here, Python won’t be able to carry on the calculation, and you will be advised to correct the variables you have used as operands. Operands must be of the same data type, in this case — numbers, as integers, floats, or both.
Add Comments
Especially when your codes become longer, and by longer, I mean containing tens or hundreds of rows, it becomes difficult to understand how your work has been structured, because there are too many lines. What you could do in these situations is leave a comment.
Comments are sentences not executed by the computer; it doesn’t read them as instructions. The trick is to put a hash sign at the beginning of each line you would like to insert as a comment. I’ll improvise with a random sentence… “It is just a comment and not code”. When you run this cell, there will be no output, because the comment does not count as code.
Let’s add code — print 7 and 2 on the same line. Execute with Shift and Enter. Yes, precisely — we got 7 and 2, and the comment row marked with a hashtag produced no output. It remained visible only to the programmer. The computer executed the print command only.
Note: this is the syntax in Python 2. In Python 3, it would be print (7,2).
If we would like to leave a comment on two lines, don’t forget to place the hash sign at the beginning of each line.
Line Continuation
Ok, perfect! I’d like to show you a neat trick that will be extremely valuable when you become an advanced Python programmer and work with large amounts of code. This is a very handy feature, so please pay attention.
Sometimes, the length of the cell will not suffice for you to finish your line. Lines of code could get long. Or, just for the matter of organizing your code, you might prefer to send part of the code to the next line. So, 2.0 times 1.5 plus 5 could be written in two lines, and the machine could still read it as one command. This could be achieved by putting a back slash where you would like the end of the first line to be. It indicates you will continue the same command on a new line.
Indexing Elements
All right, great! Let’s look at another important concept that will help us a great deal when working in Python — indexing. This is a technique programmers use frequently, in order to extract certain letters from strings.
So, here’s an example of how indexing works.
The word “Friday” is written here, right?
Is it possible to extract the letter “d”?
Yes, we can do that by using square brackets. And within them, we should specify the position of the letter we would like to be extracted.
A very important thing you should remember is that, in Python (and most languages, with the notable exception of MATLAB), we count from 0, not from 1! 0, 1, 2, 3, 4, and so on. That’s why I’ll ask for the 4th letter, ‘d’, by writing 3 here.
See? And we obtained the letter “d”.
Had we put 4, we would have obtained the letter ‘a’. This is the syntax in this occasion — square brackets right after the word, or the string of characters, if you wish, and a number indicating the position of interest.
This is how indexing works in Python.
Structure Your Code with Indentation
The next concept for programming in Python we will see here is fundamental — it is called indentation. The way you apply it in practice is important, as this will be the only way to communicate your ideas to the machine properly. This is central to the Python and distinguishes it from many other popular programming languages. Here is what I mean.
Let’s define a function “five” that takes as an argument an unknown x. It will be a simple one — x will be reassigned the value of 5, and the function will return the value of 5 for us.