Главная страница
Навигация по странице:

  • 6.1. Изменение и состояние

  • 6.2. Переменные Python как метки

  • Этап 1: Python создает объект Этап 2: Переменная создана Рис. 6.1.

  • 6.4. Повторное связывание переменных

  • Старый объект уничтожается Рис. 6.2.

  • Как устроен Python. Как устроен Python. Харрисон. Харрисон Мэтт


    Скачать 5.41 Mb.
    НазваниеХаррисон Мэтт
    АнкорКак устроен Python
    Дата05.02.2022
    Размер5.41 Mb.
    Формат файлаpdf
    Имя файлаКак устроен Python. Харрисон.pdf
    ТипДокументы
    #352210
    страница4 из 21
    1   2   3   4   5   6   7   8   9   ...   21
    33
    СОВЕТ
    Если вы захотите узнать, что делает команда chmod
    , вызовите справку по ней командой man
    :
    $ man chmod
    Теперь для выполнения файла достаточно ввести его имя в терминале и нажать
    Enter
    . Введите
    $ ./hello.py
    Команда должна запустить вашу программу (или сценарий). Обратите внимание на символы
    ./
    перед именем программы. Обычно при вводе команды в терминале среда ищет исполняемый файл в
    PATH
    (переменная среды, определяющая, в каких каталогах хранятся исполняемые файлы).
    Если только переменная
    PATH
    не содержит
    (или родительский каталог hello.py
    ), перед именем необходимо указать
    ./
    (или полный путь к испол- няемому файлу). В противном случае вы получите сообщение об ошибке:
    $ hello.py bash: hello.py command not found
    Да, вся эта работа была проделана только для того, чтобы вам не прихо- дилось вводить команду python3
    hello.py
    . Почему? Прежде всего потому, что вашей программе было бы лучше называться hello
    (без суффик- са
    .py
    .). А может быть, вы захотите разместить программу в
    PATH
    , чтобы ее можно было запустить в любой момент. Назначив файл исполняемым и добавив символы
    #!
    , можно создать файл, который выглядит как обыч- ный исполняемый файл. Такому файлу не нужно расширение
    .py
    , а для его выполнения не придется вводить команду python3
    4.3. Итоги
    Запускать программы Python несложно. Запуск не требует долгого этапа компиляции. От вас потребуется лишь сообщить Python программу, ко- торую вы хотите запустить. Во многих редакторах также предусмотрена возможность выполнения кода Python. Вам стоит выяснить, как это делается в вашем любимом редакторе. В IDLE это просто: достаточно нажать клавишу F5.

    34
    Глава 4. Запуск программ
    4.4. Упражнения
    1. Создайте файл hello.py
    , содержащий код из этой главы.
    2. Запустите hello.py из терминала.
    3. Запустите hello.py из IDLE.
    4. Если вы предпочитаете работать в другом редакторе, запустите hello.py из него.
    5. Если вы работаете на платформе UNIX, создайте файл с именем hello
    . Добавьте в него код «hello world» и внесите необходимые из- менения, чтобы код можно было выполнить командой
    ./hello

    5
    Запись и чтение данных
    У программ обычно имеются входные и выходные данные. В этой главе вы узнаете, как вывести значения на экран и как получить значение от пользователя. В языке Python обе задачи решаются тривиально.
    5.1. Простой вывод
    Чтобы вывести данные для пользователя, проще всего воспользо- ваться функцией print
    , которая записывает данные в стандартный
    вывод — поток, в который компьютер направляет выходные данные.
    Если вы работаете в терминале, то стандартный вывод направляется на терминал:
    >>> print('Hello there')
    Hello there
    Чтобы вывести несколько значений, разделите их запятыми. Python автоматически вставляет пробелы между ними. При вызове функции print можно указывать строки и числа:
    >>> print('I am', 10, 'years old')
    I am 10 years old
    Позднее в этой главе строки будут рассмотрены более подробно. Вы узнаете, как отформатировать их, чтобы придать выходным данным нужный вид.

    36
    Глава 5. Запись и чтение данных
    5.2. Получение данных от пользователя
    Встроенная функция input читает текст с терминала. Эта функция по- лучает текст подсказки, который выводится на экран, а затем ожидает, пока пользователь введет что-либо в стандартном вводе и нажмет
    Enter
    Стандартный ввод представляет собой поток, из которого компьютер получает входные данные. В терминале стандартный ввод может читаться из символов, вводимых вами с клавиатуры:
    >>> name = input('Enter your name:')
    Если ввести эту команду в интерпретаторе (пробелы по обе стороны от
    =
    необязательны, но их рекомендуется вводить, чтобы код лучше читал- ся), может показаться, что ваш компьютер завис. На самом деле Python ожидает, когда вы что-нибудь введете и нажмете
    Enter
    . После нажатия
    Enter введенные данные будут сохранены в переменной name
    . Введите имя
    Matt и нажмите клавишу
    Enter
    . Если теперь вывести значение name
    , программа выведет только что введенное вами значение:
    >>> print(name)
    Matt
    ПРИМЕЧАНИЕ
    Значение, введенное в терминале при вызове input
    , всегда представляет со- бой строку. Если вы попытаетесь выполнить с ним математические операции, результат может оказаться не тем, на который вы рассчитывали:
    >>> value = input('Enter a number:')
    3
    >>> other = input('Enter another:')
    4
    Если теперь попытаться сложить value с other
    , будет выполнена конкате- нация (сцепление строк), потому что в обеих переменных хранятся строки:
    >>> type(value)

    >>> value + other
    '34'
    Если вы хотите сложить числа, содержащиеся в строках, их необходимо преобразовать из строкового типа к числовому. Для преобразования строк

    5.4. Упражнения
    37
    к другому типу, например целому или вещественному, используются функции int и float соответственно.
    Чтобы сложить значения value и other в числовом виде, преобразуйте их в числа функцией int
    :
    >>> int(value) + int(other)
    7
    В следующей главе числовые и строковые типы будут рассмотрены более подробно.
    5.3. Итоги
    Python предоставляет две функции для простого вывода данных на экран и получения данных от пользователя. Это функции print и input
    Помните, что при вызове функции input вы всегда получаете строку.
    5.4. Упражнения
    1. Напишите код Python, который запрашивает у пользователя его имя, после чего выводит
    Hello и введенное имя.
    2. Напишите программу, которая запрашивает у пользователя его возраст. Выведите сообщение, в котором говорится, сколько лет будет пользователю в следующем году.

    6
    Переменные
    Итак, вы научились запускать программы в интерпретаторе (или REPL) и в командной строке. Теперь можно осваивать основы программиро- вания. Переменные — основные структурные элементы компьютерных программ.
    Переменные играют важную роль в программах Python, потому что в мире Python нет ничего, кроме объектов. (На самом деле это не совсем так — ключевые слова объектами не являются.) Переменные позволяют назначать объектам имена, чтобы к ним можно было обращаться из про- граммного кода.
    6.1. Изменение и состояние
    В программировании существует две важные концепции: состояния и изменения. Состояние связано с цифровым представлением модели.
    Например, если вы хотите моделировать лампочку, можно хранить в программе ее текущий статус — включена лампочка или нет? Среди других интересных вариантов состояния можно хранить тип лампочки
    (люминесцентная, лампа накаливания), потребляемую мощность, размер, возможность регулировки яркости и т. д.
    Концепция изменения связана с переходом в новое состояние. Скажем, в примере с лампочкой было бы полезно иметь переключатель, который переводит лампочку в противоположное состояние: если лампочка вы- ключена, то она включается, и наоборот.

    6.2. Переменные Python как метки
    39
    Какое отношение все это имеет к переменным? Вспомните, что в Python нет ничего, кроме объектов. Объекты обладают состоянием, которое мо- жет изменяться. Для хранения информации об объектах используются переменные.
    Когда в программе появляются объекты с состоянием, которое может изменяться, перед вами открывается целый мир новых возможностей.
    В программе можно смоделировать практически все, что угодно, — если вы сможете определить, каким состоянием должна обладать модель и какие действия (или изменения) к ней должны применяться.
    6.2. Переменные Python как метки
    Наборы переменных используются для хранения состояния. Перемен-
    ную можно представлять себе как своего рода метку или бирку: важная информация помечается именем переменной. Продолжая предыдущий пример, предположим, что вы хотите запомнить состояние лампочки.
    Хранить данные бессмысленно, если к ним нельзя обратиться. Если же вы хотите обращаться к данным и хранить их состояние, нужно создать
    переменную, связанную с этими данными. В следующем фрагменте со- стояние лампочки хранится в переменной с именем status
    :
    >>> status = "off"
    На этом моменте стоит остановиться подробнее, потому что здесь про- исходит много всего интересного. Справа находится слово "off"
    , заклю- ченное в кавычки. Это строковый литерал, или встроенный тип данных
    Python со специальным синтаксисом. Кавычки сообщают Python, что объект является строкой, поэтому Python создает объект со строковым содержимым. Строки используются для хранения текстовых данных — в данном случае символов off
    Этот объект обладает рядом интересных свойств. Во-первых, у него есть
    идентификатор. Можно считать, что идентификатор указывает на место, в котором Python хранит этот объект в памяти. У объекта также имеется
    тип (в данном случае это строка). Наконец, у объекта есть значение — здесь оно состоит из символов off
    , так как это строка.
    Знак
    =
    представляет оператор присваивания во многих языках програм- мирования. Не бойтесь технических терминов — они проще, чем кажется

    40
    Глава 6. Переменные на первый взгляд. Оператор присваивания связывает имя переменной с ее объектом. Он показывает, что имя слева от него является перемен- ной, в которой будет храниться объект из правой части. В данном случае переменной присваивается имя status
    Создавая переменную, Python приказывает объекту увеличить свой
    счетчик ссылок. Если на объект указывают переменные или другие объекты, то у этого объекта счетчик ссылок положителен. Когда пере- менные перестают существовать (например, при выходе из функции переменные из этой функции исчезают), счетчик ссылок уменьша- ется. Когда счетчик уменьшается до 0, интерпретатор Python делает вывод, что объект больше никому не нужен, и подвергает его уборке
    мусора. Это означает, что объект удаляется из памяти, чтобы ваши программы не выходили из-под контроля и не занимали всю память на компьютере.
    ПРИМЕЧАНИЕ
    Если вы захотите узнать значение счетчика ссылок для объекта, вызовите для него функцию sys.getrefcount
    :
    >>> import sys
    >>> names = []
    >>> sys.getrefcount(names)
    2
    Обратите внимание: значение счетчика может показаться слишком высо- ким, но в документации этой функции говорится:
    «…Возвращает счетчик ссылок объекта. Возвращаемое значение обычно на 1 выше ожидаемого, потому что оно включает (временную) ссылку для аргумента getrefcount()».
    Хотя Python и предоставляет такую возможность, обычно счетчик ссылок не представляет интереса для разработчика. Лучше доверить хлопоты с унич- тожением объектов интерпретатору Python.
    Обычно Python делает все это за вас автоматически, без подсказок со стороны пользователя. Во многих других языках программисту

    6.3. Бирки
    41
    приходится вручную приказывать программе выделять и освобождать память.
    Для пущей наглядности попробуйте теперь снова прочитать код — на этот раз слева направо.
    Status
    — переменная, с которой связывается объект, созданный за нас Python. У этого объекта есть тип (строка), и он содержит значение "off"
    6.3. Бирки
    У моего дедушки было животноводческое ранчо, поэтому я приведу не- компьютерную аналогию. Любому владельцу ранчо необходим хороший гуртовщик, который следит за скотом (то есть за хозяйскими капитало- вложениями).
    Чтобы не перепутать коров, часто используются специальные бирки.
    Такая бирка прикрепляется к уху каждой коровы, и по ней можно узнать каждое конкретное животное.
    А теперь вернемся к программированию: вместо ранчо вы управляете раз- личными аспектами своей программы. Программа может хранить много разных блоков информации, которые тоже нужно как-то отличать друг от друга: это информация состояния. Например, если вам нужно хранить информацию о людях, в этой информации может присутствовать имя, возраст и адрес человека.
    Подобно тому, как скотоводы помечают бирками своих животных, про- граммисты создают переменные для отслеживания данных. Еще раз взгляните на наш пример:
    >>> status = "off"
    Эта команда приказывает Python создать строку, содержащую текст off
    Программа создает переменную с именем status и связывает ее с этой строкой. Позднее, когда вам потребуется узнать информацию состояния, можно приказать программе вывести ее на экран — вот так:
    >>> print(status)
    Off

    42
    Глава 6. Переменные
    Создание переменной status = "off"
    Команда "off"
    Id:2e6a
    Type:String
    Что делает компьютер
    Переменные
    Тип
    Id
    Значение
    Тип
    Значение
    Объекты
    Переменные Объекты status = "off"
    "off"
    Id:2e6a
    Type:String status
    Id
    Этап 1: Python создает объект
    Этап 2: Переменная создана
    Рис. 6.1. Два этапа присваивания литерала. Сначала Python создает объект. У этого объекта есть значение “off”, тип (строка) и идентификатор
    (местонахождение объекта в памяти). После того как объект будет создан, Python ищет переменную с именем status. Если такая переменная существует, Python изменяет объект, на который указывает эта переменная; в противном случае
    Python создает переменную и связывает ее с объектом
    Ничто не мешает вам создать состояние и потерять его, если вы забыли сохранить его в переменной. Создавать объекты, которые вы не исполь- зуете, немного странно; тем не менее это возможно. Предположим, вы хотите отслеживать для объекта лампочки потребляемую мощность.
    Команда
    >>> "120 watt"
    приказывает Python создать строковый объект, содержащий текст
    120
    watt
    . Проблема в том, что этот объект не присваивается никакой пере-

    6.4. Повторное связывание переменных
    43
    менной. Теперь вы никак не сможете использовать его в своей программе.
    Python позволяет обращаться только к данным, хранящимся в перемен- ных, поэтому теперь объект стал недоступным. Программа обращается к объектам по именам переменных. Если эта информация должна исполь- зоваться в программе, правильнее было бы использовать команду вида
    >>> wattage = "120 watt"
    Позднее в своей программе вы можете обратиться к переменной wattage
    , вывести ее значение, даже присвоить его другой переменной или при- своить wattage новое значение (допустим, ваша лампа накаливания раз- билась и вы заменили ее светодиодной):
    >>> incandescent = wattage
    >>> wattage = "25 watt"
    >>> print(incandescent, wattage)
    120 watt 25 watt
    Управление состоянием — один из основных аспектов программирова- ния, а переменные — один из механизмов этого управления.
    6.4. Повторное связывание переменных
    Переменные, как и бирки на коровах, остаются связанными со своими объектами в течение какого-то времени, но не навсегда. Python позволяет легко изменить содержимое переменной:
    >>> num = 400
    >>> num = '400' # теперь num содержит строку
    В этом примере переменная num сначала была связана с целым числом, но потом программа связала ее со строкой.
    ПРИМЕЧАНИЕ
    Для переменной тип неважен. В языке Python типом обладает объект, а не переменная.
    Переменную можно изменять сколько угодно раз. Тем не менее будьте внимательны и не изменяйте переменную, если вам все еще нужны старые

    44
    Глава 6. Переменные данные. После того как все переменные будут отсоединены от объекта, вы фактически приказываете Python уничтожить объект при первой возможности, чтобы освободить занимаемую им внутреннюю память
    (в программировании это называется уборкой мусора).
    Повторное связывание переменных a = 400
    Команда
    400
    Id:2e6a
    Type:Integer
    Что делает компьютер
    Переменные Объекты
    Переменные Объекты a
    a = '400'
    400
    Id:2e6a
    Type:Integer a
    '400'
    Id:2e6f
    Type:String
    Старый объект уничтожается
    Рис. 6.2. Повторное связывание переменных. Переменная может быть заново связана с любым типом; Python не пытается этому как-то помешать и не выдает предупреждений. Если с объектом не связана ни одна переменная, Python уничтожает этот объект в процессе уборки мусора

    6.5. Имена переменных
    45
    СОВЕТ
    Это один из тех случаев, когда Python позволяет вам что-то сделать, но это вовсе не означает, что это стоит делать в реальной жизни. Да, переменную можно заново связать с другим типом, но не нужно. Изменение типа пере- менной затруднит чтение кода. Кроме того, программа только запутает других разработчиков, которые используют ваш код. Не используйте одну перемен- ную для работы со значениями разных типов!
    Начинающие разработчики Python нередко допускают одну и ту же ошибку: они заново используют одну переменную в своем коде, полагая, что они тем самым экономят память. Как вы уже видели, это не так. Сами переменные памяти почти не занимают — она расходуется для хранения объекта. По- вторное использование переменной не изменит затраты памяти на хранение объекта, но собьет с толку тех, кто будет читать код в будущем.
    6.5. Имена переменных
    В Python имена переменных не выбираются полностью произвольно: су- ществуют конкретные соглашения, которые выполняются большинством программистов. Одни из этих соглашений обязательны к выполнению, другие — нет. Например, интерпретатор требует, чтобы имя переменной
    не совпадало с ключевым словом языка. Скажем, break
    — ключевое сло- во, поэтому ваша переменная не может называться break
    . При попытке использовать break как имя переменной, вы получите синтаксическую ошибку. И хотя следующий код выглядит вполне нормально, Python сообщит об ошибке:
    >>> break = 'foo'
    File "", line 1
    break = 'foo'
    ^
    SyntaxError: invalid syntax
    Если вы столкнетесь с синтаксической ошибкой (
    SyntaxError
    ) в совер- шенно нормальном на первый взгляд коде Python, убедитесь в том, что имя переменной не совпадает с ключевым словом.

    46
    Глава 6. Переменные
    ПРИМЕЧАНИЕ
    Ключевые слова зарезервированы для языковых конструкций Python, поэто- му при попытке использования их в качестве переменных Python приходит в замешательство.
    Модуль keyword содержит атрибут kwlist со списком всех ключевых слов
    Python:
    >>> import keyword
    >>> print(keyword.kwlist)
    ['False', 'None', 'True', 'and', 'as', 'assert',
    'break', 'class', 'continue', 'def', 'del', 'elif',
    'else', 'except', 'finally', 'for', 'from', 'global',
    'if', 'import', 'in', 'is', 'lambda', 'nonlocal',
    'not', 'or', 'pass', 'raise', 'return', 'try',
    'while', 'with', 'yield']
    Также для просмотра ключевых слов в REPL можно вызвать метод help()
    Он переводит REPL в режим справочной информации, в котором можно вводить команды для получения справки (в отличие от команд Python).
    Введите keywords и нажмите
    Enter
    . Если ввести любое ключевое слово, про- грамма выведет документацию и сопутствующие разделы справки. Чтобы выйти из режима справки, просто нажмите
    Enter
    1   2   3   4   5   6   7   8   9   ...   21


    написать администратору сайта