Введение в Python

Прелюдия

Добро пожаловать на онлайн-курс по Python от Google. Он основан на вводном курсе по Python, предлагаемом компанией. Как упоминалось на странице настройки , этот материал охватывает Python 3.

Если вы ищете сопутствующий курс MOOC, попробуйте курсы от Udacity и Coursera ( введение в программирование [для начинающих] или введение в Python ). И наконец, если вы ищете онлайн-курсы в удобном для вас темпе, без просмотра видео, попробуйте курсы, перечисленные в конце этой статьи — каждый из них включает обучающий материал, а также интерактивный интерпретатор Python для практики. Что это за «интерпретатор», о котором мы говорим? Вы узнаете в следующем разделе!

Введение в язык

Python — динамический интерпретируемый (компилируемый в байт-код) язык. В исходном коде отсутствуют объявления типов переменных, параметров, функций и методов. Это делает код коротким и гибким, исключая необходимость проверки типов исходного кода во время компиляции. Python отслеживает типы всех значений во время выполнения и помечает код, который не имеет смысла.

Отличный способ увидеть, как работает код Python, — запустить интерпретатор Python и ввести код прямо в него. Если у вас когда-нибудь возникнет вопрос вроде: «Что произойдёт, если я добавлю int к list ?», то простой ввод кода в интерпретатор Python — это быстрый и, вероятно, лучший способ увидеть, что произойдёт. (Смотрите ниже, что происходит на самом деле!)

$ python3        ## Run the Python interpreter
Python 3.X.X (XXX, XXX XX XXXX, XX:XX:XX) [XXX] on XXX
Type "help", "copyright", "credits" or "license" for more information.
>>> a = 6       ## set a variable in this interpreter session
>>> a           ## entering an expression prints its value
6
>>> a + 2
8
>>> a = 'hi'    ## 'a' can hold a string just as well
>>> a
'hi'
>>> len(a)      ## call the len() function on a string
2
>>> a + len(a)  ## try something that doesn't work
Traceback (most recent call last):
  File "", line 1, in 
TypeError: can only concatenate str (not "int") to str
>>> a + str(len(a))  ## probably what you really wanted
'hi2'
>>> foo         ## try something else that doesn't work
Traceback (most recent call last):
  File "", line 1, in 
NameError: name 'foo' is not defined
>>> ^D          ## type CTRL-d to exit (CTRL-z in Windows/DOS terminal)

Две строки, которые выводит python после ввода python и перед приглашением >>>, сообщают используемую версию Python и место её сборки. Если первым выводится «Python 3.», эти примеры должны вам подойти.

Как видите выше, экспериментировать с переменными и операторами легко. Кроме того, интерпретатор выдаёт (или, выражаясь языком Python, «возбуждает») ошибку времени выполнения, если код пытается прочитать переменную, которой не присвоено значение. Как и в C++ и Java, в Python регистр чувствителен к символам, поэтому «a» и «A» — это разные переменные. Конец строки обозначает конец оператора, поэтому, в отличие от C++ и Java, в Python не требуется точка с запятой в конце каждого оператора. Комментарии начинаются с символа «#» и продолжаются до конца строки.

Исходный код Python

Исходные файлы Python имеют расширение «.py» и называются «модулями». Модуль Python hello.py проще всего запустить с помощью команды оболочки «python hello.py Alice», которая вызывает интерпретатор Python для выполнения кода hello.py , передавая ему аргумент командной строки «Alice». Подробнее о различных вариантах запуска Python из командной строки см. на странице официальной документации.

Вот очень простая программа hello.py (обратите внимание, что блоки кода строго разграничены отступами, а не фигурными скобками — подробнее об этом позже!):

#!/usr/bin/python3

# import modules used here -- sys is a very standard one
import sys

# Gather our code in a main() function
def main():
    print('Hello there', sys.argv[1])
    # Command line args are in sys.argv[1], sys.argv[2] ...
    # sys.argv[0] is the script name itself and can be ignored

# Standard boilerplate to call the main() function to begin
# the program.
if __name__ == '__main__':
    main()

Запуск этой программы из командной строки выглядит так:

$ python3 hello.py Guido
Hello there Guido
$ ./hello.py Alice  ## without needing 'python3' first (Unix)
Hello there Alice

Импорт, аргументы командной строки и len()

Внешние операторы в файле Python, или «модуле», выполняют его однократную настройку — эти операторы выполняются сверху вниз при первом импорте модуля, настраивая его переменные и функции. Модуль Python можно запустить напрямую, как показано выше: python3 hello.py Bob , или импортировать и использовать другим модулем. При прямом запуске файла Python специальная переменная «__name__» устанавливается в значение «__main__». Поэтому часто используется шаблонный код if __name__ ==... , показанный выше, для вызова функции main() при прямом запуске модуля, но не при его импорте другим модулем.

В стандартной программе Python список sys.argv содержит аргументы командной строки стандартным образом: sys.argv[0] — сама программа, sys.argv[1] — первый аргумент и так далее. Если вы знаете, что такое argv (количество аргументов), вы можете просто запросить это значение из Python с помощью len(sys.argv) , как мы это делали в коде интерактивного интерпретатора выше, когда запрашивали длину строки. В общем случае, функция len() может сообщить длину строки, количество элементов в списках и кортежах (ещё одна структура данных, подобная массиву) и количество пар «ключ-значение» в словаре.

Пользовательские функции

Функции в Python определяются следующим образом:

# Defines a "repeat" function that takes 2 arguments.
def repeat(s, exclaim):
    """
    Returns the string 's' repeated 3 times.
    If exclaim is true, add exclamation marks.
    """

    result = s + s + s # can also use "s * 3" which is faster (Why?)
    if exclaim:
        result = result + '!!!'
    return result

Обратите внимание, как строки, составляющие функцию или оператор if, сгруппированы с одинаковым уровнем отступа. Мы также представили два разных способа повторения строк: с помощью оператора +, который более удобен для пользователя, но и * тоже работает, поскольку это оператор повтора Python, то есть '-' * 10 возвращает '----------' — удобный способ создания экранной «строки». В комментарии к коду мы намекнули, что * работает быстрее, чем +, поскольку * вычисляет размер результирующего объекта один раз, тогда как при использовании + это вычисление производится при каждом вызове +. Оба оператора, + и *, называются «перегруженными», поскольку они означают разные вещи для чисел и строк (и других типов данных).

Ключевое слово def определяет функцию с параметрами в скобках и кодом с отступом. Первая строка функции может быть строкой документации («docstring»), описывающей действия функции. Эта строка может быть однострочной или многострочной, как в примере выше. (Да, это «тройные кавычки», уникальная функция Python!) Переменные, определённые в функции, являются локальными для этой функции, поэтому «результат» в указанной выше функции отделен от переменной «результат» в другой функции. Оператор return может принимать аргумент, и в этом случае это значение, возвращаемое вызывающей функции.

Вот код, который вызывает указанную выше функцию repeat() и выводит на экран то, что она возвращает:

def main():
    print(repeat('Yay', False))      ## YayYayYay
    print(repeat('Woo Hoo', True))   ## Woo HooWoo HooWoo Hoo!!!

Во время выполнения функции должны быть определены с помощью инструкции "def" до их вызова. Обычно функция main() определяется в конце файла, а вызываемые ею функции — выше.

Отступ

Одна из необычных особенностей Python заключается в том, что отступы пробелов в фрагменте кода влияют на его смысл. Логический блок операторов, например, те, которые составляют функцию, должен иметь одинаковый отступ, начиная с отступа родительской функции, оператора «if» или чего-то подобного. Если одна из строк в группе имеет другой отступ, это помечается как синтаксическая ошибка.

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

Новички часто задают вопрос: «Сколько пробелов нужно делать в отступе?» Согласно официальному руководству по стилю Python (PEP 8) , отступ должен составлять 4 пробела. (Интересный факт: внутренние правила стиля Google предписывают отступ в 2 пробела!)

Код проверяется во время выполнения

Python выполняет очень мало проверок во время компиляции, откладывая почти все проверки типов, имён и т. д. в каждой строке до её выполнения. Предположим, что функция main() выше вызывает repeat() следующим образом:

def main():
    if name == 'Guido':
        print(repeeeet(name) + '!!!')
    else:
        print(repeat(name))

Оператор if содержит очевидную ошибку, где функция repeat() случайно набрана как repeeeet(). Забавно, что в Python ... этот код компилируется и работает нормально, пока имя во время выполнения не будет "Guido". Только когда run действительно попытается выполнить repeeeet(), он заметит, что такой функции нет, и выдаст ошибку. В этом фрагменте есть и вторая ошибка: name не было присвоено значение до того, как оно будет сравнено с "Guido". Python выдаст "NameError", если вы попытаетесь вычислить неназначенную переменную. Вот несколько примеров, демонстрирующих, что при первом запуске программы на Python некоторые из первых ошибок, которые вы увидите, будут простыми опечатками или неинициализированными переменными, такими как эти. Это одна из областей, где языки с более подробной системой типов, такие как Java, имеют преимущество ... они могут отлавливать такие ошибки во время компиляции (но, конечно, вам придется поддерживать всю эту информацию о типах ... это компромисс).

В Python 3 появились подсказки типов . Подсказки типов позволяют указывать тип каждого аргумента функции, а также тип объекта, возвращаемого функцией. Например, в аннотированной функции def is_positive(n: int) -> bool: аргумент n — это int , а возвращаемое значение — bool . Мы рассмотрим, что означают эти типы позже. Однако подсказки типов совершенно необязательны. Вы увидите все больше кода, использующего подсказки типов, потому что если вы их используете, некоторые редакторы, такие как cider-v и VS.code, могут выполнять проверки, чтобы убедиться, что ваши функции вызываются с правильными типами аргументов. Они могут даже предлагать и проверять аргументы при редактировании кода. В этом руководстве подсказки типов не будут рассматриваться, но мы хотим убедиться, что вы знаете о них, если услышите о них или увидите их в реальной жизни.

Имена переменных

Поскольку в исходном коде Python тип переменных не указан, крайне полезно давать им осмысленные имена, чтобы не забывать о том, что происходит. Например, используйте «name», если это одно имя, «names», если это список имён, и «tuples», если это список кортежей. Многие основные ошибки Python возникают из-за того, что мы забываем, какой тип значения находится в каждой переменной, поэтому используйте имена переменных (все, что у вас есть на самом деле), чтобы все было понятно.

Что касается собственно имён, в некоторых языках для имён переменных, состоящих из «более одного слова», предпочтительнее использовать подчёркивание, но в других — «верблюжий» стиль. В целом, Python предпочитает метод с подчёркиванием, но рекомендует разработчикам использовать «верблюжий» стиль при интеграции с существующим кодом Python, который уже использует этот стиль. Читабельность имеет значение. Подробнее читайте в разделе о соглашениях об именовании в PEP 8 .

Как вы можете догадаться, ключевые слова, такие как «if» и «while», нельзя использовать в качестве имён переменных — это приведёт к синтаксической ошибке. Однако будьте осторожны и не используйте встроенные функции в качестве имён переменных. Например, хотя имена «str», «list» и «print» могут показаться удачными, вы переопределите эти системные переменные. Встроенные функции не являются ключевыми словами и поэтому подвержены непреднамеренному использованию начинающими разработчиками Python.

Подробнее о модулях и их пространствах имен

Предположим, у вас есть модуль "binky.py", содержащий "def foo()". Полное имя этой функции foo — "binky.foo". Таким образом, различные модули Python могут называть свои функции и переменные как угодно, и эти имена переменных не будут конфликтовать — module1.foo отличается от module2.foo. В терминологии Python мы бы сказали, что у binky, module1 и module2 есть свои собственные «пространства имён», которые, как вы можете догадаться, представляют собой привязки имён переменных к объектам.

Например, у нас есть стандартный модуль "sys", содержащий некоторые стандартные системные функции, такие как список argv и функция exit(). С помощью оператора "import sys" можно получить доступ к определениям в модуле sys и сделать их доступными по их полному имени, например, sys.exit(). (Да, у "sys" тоже есть пространство имён!)

  import sys

  # Now can refer to sys.xxx facilities
  sys.exit(0)

Существует другая форма импорта, которая выглядит так: "from sys import argv, exit". Это делает argv и exit() доступными по их коротким именам; однако мы рекомендуем использовать исходную форму с полными именами, поскольку так гораздо проще определить, откуда взялась функция или атрибут.

В стандартную установку интерпретатора Python входит множество модулей и пакетов, поэтому для их использования не требуется никаких дополнительных действий. Они известны как «Стандартная библиотека Python». Наиболее часто используемые модули/пакеты включают:

  • sys — доступ к exit(), argv, stdin, stdout, ...
  • re — регулярные выражения
  • os — интерфейс операционной системы, файловая система

Документацию по всем модулям и пакетам стандартной библиотеки можно найти по адресу http://docs.python.org/library .

Онлайн-справка, help() и dir()

Получить помощь по Python можно разными способами.

  • Выполните поиск в Google, начав со слова «python», например, «python list» или «python string lowercase». Первый же результат часто оказывается правильным. По какой-то причине этот метод работает лучше для Python, чем для других языков.
  • На официальном сайте документации Python — docs.python.org — представлена качественная документация. Тем не менее, я часто обнаруживаю, что поиск в Google по паре слов занимает меньше времени.
  • Также существует официальный список рассылки Tutor, специально созданный для новичков в Python и/или программировании!
  • Многие вопросы (и ответы) можно найти на StackOverflow и Quora .
  • Используйте функции help() и dir() (см. ниже).

В интерпретаторе Python функция help() выводит строки документации для различных модулей, функций и методов. Эти строки документации аналогичны javadoc в Java. Функция dir() выводит атрибуты объекта. Ниже приведены несколько способов вызова help() и dir() из интерпретатора:

  • help(len) — строка справки для встроенной функции len() ; обратите внимание, что это «len», а не «len()», что является вызовом функции, что нам не нужно.
  • help(sys) — строка справки для модуля sys (сначала необходимо import sys )
  • dir(sys)dir() похож на help() , но просто выводит краткий список определённых им символов или «атрибутов».
  • help(sys.exit) — строка справки для функции exit() в модуле sys
  • help('xyz'.split) — строка справки для метода split() для строковых объектов. Вы можете вызвать help() с самим объектом или его примером , а также с его атрибутом. Например, вызов help('xyz'.split) аналогичен вызову help(str.split) .
  • help(list) — строка справки для объектов list
  • dir(list) — отображает атрибуты объекта list , включая его методы
  • help(list.append) — строка справки для метода append() для объектов list