Язык Python и его особенности
1.4 Ввод и вывод в Python
1.4.1 Диалоговый режим
При работе с интерактивными оболочками или в процессе организации взаимодействия программы с пользователем ("диалога") для ввода чисел и, соответственно, определения значений переменных будем использовать функции input() и raw_input(). В качестве аргумента этих функции рекомендуется использовать строку-подсказку (приглашение для ввода), в которой кратко описывается, какие данные и как необходимо сообщить программе. Дальше будут показаны примеры использовальзования этих функций.
Если в строке-подсказке используются символы кириллицы (русские буквы), то нужно предварительно указать кодировочную таблицу (см. раздел 1.5). Строка-подсказка может быть в двойных или в одиночных кавычках. Для выполнения операций input() или raw_input() интерпретатор останавливает программу и после строки-подсказки требуется ввести требуемое значение переменной и нажать <ENTER>. Если строка подсказки отсутствует, будет показан курсор оболочки в пустой строке окна выполнения. Если требуется ввести несколько значений, их нужно вводить через запятую и нажимать <ENTER> только после последнего введённого значения.
Рассмотрим примеры ввода данных и вывода результатов команд в сеансе интерактивной облочки.
В последующих примерах обозначение >>> используется в качестве приглашения интерактивной оболочки, обычный шрифт показывает то, что следует набирать на клавиатуре, полужирным шрифтом показан вывод интерпретатора (то, что пишет Python), а символ # означает комментарий (пояснение).
При использовании функции input() числовые значения пишутся как обычно, а строковые нужно писать в кавычках (двойных или одиночных).
Примеры:
>>> a=input() <ENTER> # простейший вариант
12 <ENTER>
>>> a <ENTER> # проверяем значение переменной a
12
>>>
>>> a=input('Введите значение a: ') <ENTER> # вариант с подсказкой
Введите значение a: 12 <ENTER> # подсказка и ввод
>>>
>>> a,b,c=input('Введите длины сторон треугольника через запятую: ')<ENTER> # вариант для нескольких чисел
Введите длины сторон треугольника через запятую: 3, 4, 5 <ENTER>
>>> b <ENTER> # проверяем значение переменной b
4
>>>
>>> t=(a,b,c,d)=input('Введите элементы: ') <ENTER> # формирование кортежа со строковыми элементами
>>> 5,'bob',-3,'dno' <ENTER>
>>> t[1] <ENTER> # проверяем значение элемента
'bob'
>>>t <ENTER>
(5, 'bob', -3, 'dno')
>>>
Список таким образом ввести не получается (при вводе нескольких значений функция input() возвращает кортеж), но список можно получить с помощью функции list().
Для ввода только строковых значений в Python используется функция raw_input(). Её особенности во многом совпадают с функцией input(). Есть одна деталь — строковые значения при их вводе не нужно заключать в кавычки. Если с помощью raw_input() вводить числа, они преобразуются в строки.
Примеры:
>>> name=raw_input('Как тебя зовут? ') <ENTER>
Как тебя зовут? Вася <ENTER>
>>> name <ENTER>
'Вася'
>>> age=raw_input ('Сколько тебе лет? ') <ENTER>
Сколько тебе лет? 12 <ENTER>
>>> age <ENTER>
'12'
>>>
Для вывода результатов работы используется инструкция print, которая не является функцией. Использование инструкции (команды) print позволяет производить вычисления "на лету" и выводить одновременно (одним оператором) строки и числа.
Примеры:
>>> print'==-stroka-==' <ENTER> # вывод текста
==-stroka-==
>>>
>>> t=(a, b, c, d)=input('Введите элементы: ') <ENTER>
5, 'bob', -3, 'dno' <ENTER>
>>> print t <ENTER>
(5, 'bob', -3, 'dno')
>>>
>>> print 'Получились значения', t <ENTER> # Вывод с пояснением
Получились значения (5, 'bob', -3, 'dno')
>>>
При выводе нескольких значений через запятую print автоматически добавляет проблемы между значениями переменных.
>>> t=(a, b, c, d)=input('Введите элементы: ') <ENTER>
5, 'bob', -3, 'dno' <ENTER>
>>> t1=(1, 2, 3) <ENTER>
>>> print 'Итоговый кортеж ', t+t1 <ENTER> # Пояснение и действие
Итоговый кортеж (5, 'bob', -3, 'dno', 1, 2, 3)
>>>
1.4.2 Чтение из файла и запись в файл
Будем рассматривать только самый простой вариант — работа с текстовыми файлами в текущем каталоге без указания формата данных.
Для работы с файлом прежде всего нужно создать специальный объект – "дескриптор файла", а потом использовать методы этого дескриптора для чтения и записи данных.
При создании дескриптора нужно указать строку с именем файла и строку с описанием варианта доступа. Вариантов доступа бывает три — 'r' (только чтение), 'w' (запись) и 'a' (дополнение).
Чтение возможно только из существующего файла. Если при открытии на запись или дополнение указано имя несуществующего файла, он будет создан.
Рассмотрим несколько примеров.
Пусть имеется файл с данными с именем 1.dat
1 2 3 a b c
Создадим дескриптор для чтения данных из этого файла:
>>> fd=open ('1.dat', 'r') <ENTER>
Прочитаем строки из файла:
>>> s=fd.read() <ENTER>
>>> s <ENTER>
'1 2 3\na b c'
>>>
Как видно, все данные из файла прочитались в одну строку. Поскольку в Pyrhon отсутствуют формальные ограничения на длину строки, этот способ годится для любых разумных файлов данных, особенно используемых и учебных целях. Далее с помощью функций и методов строк можно получить значения переменных. Здесь нужно обратить внимание на сочетание '\n'. Это специальная комбинация символов, означающая переход на новую строку (перевод строки — new line). Её можно использовать в своих интересах.
Применение метода split() позволяет сформировать список с исходными данными.
>>> lst=s.split('\n') <ENTER>
>>> lst<ENTER>
['1 2 3','a b c']
Теперь, чтобы получить числа из файла с данными, следует применить метод split() к первому элементу списка lst. а потом выполнить преобразование типов в зависимости от вида требуемого числа (целое или вещественное).
>>> lst2=lst[0].split(' ') <ENTER>
>>> lst2<ENTER>
['1','2','3']
>>> b=int(lst2[1]) <ENTER>
>>> b <ENTER>
2
Для прекращения работы с файлом ("высвобождения дескриптора") используется метод close():
>>> fd.close() <ENTER>
Есть ещё два полезных метода для чтения данных из файла. Метод readline() читает из файла строку, а при повторном использовании — следующую строку:
>>> fd=open('1.dat', 'r') <ENTER>
>>> s01=fd.readline() <ENTER>
>>> s01 <ENTER>
'1 2 3\n'
>>> s01=fd.readline() <ENTER>
'a b c'
>>> fd.close() <ENTER>
Метод readlines() читает из файла все строки и формирует из них список. Тогда легко узнать количество строк в файле:
>>> fd=open('1.dat', 'r') <ENTER>
>>> lst01=fd.readlines() <ENTER>
>>> lst01 <ENTER>
['1 2 3\n', 'a b c']
>>> len(lst01) <ENTER>
2
>>> fd.close() <ENTER>
Далее попытаемся записать что-нибудь в этот файл. Для этого нужно создать дескриптор для записи данных, сформировать строку и использовать метод write(), как показано ниже.
>>> fd=open('1.dat','w) <ENTER> >>> s2='c d e' <ENTER> >>> fd.write(s2) <ENTER> >>> fd.close() <ENTER>
В результате содержимое файла заменится на строку 'c d e', а то, что было в файле раньше, сотрётся. Метод close() обеспечивает применение изменений в файле и запись этих изменений на диск.
Теперь рассмотрим случай создания файла и добавления данных в него.
>>> fd=open('2.dat', 'a') <ENTER> >>> s1='c d e \n' <ENTER> >>> fd.write(s1) <ENTER> >>> s2='3 4 5\n' <ENTER> >>> fd.write(s2) <ENTER> >>> fd.close() <ENTER>
Здесь как раз использована комбинация '\n' для перехода на новую строку. В результате получим файл 2.dat следующего содержания:
c d e 3 4 5
1.5 Структура программы
Программа на Python представляет из себя последовательность команд для ввода данных, вычислений и других операций с данными и вывода результатов. Простые команды (операторы) принято записывать по одной строке на оператор. В составных операторах (с которыми ещё предстоит познакомиться) большую роль играют пробелы в начале строки (отступы).
Программа создаётся в виде текстового файла в любом текстовом редакторе. Использование интегрированных сред разработки (IDE) обеспечивает подсветку синтаксиса и выделение особенностей структуры программы, а также упрощает поиск ошибок в написании команд. Файл с программой должен иметь "расширение" .py (например, my_program.py).
Первую строку программы необходимо оформить как комментарий, в котором указывается кодировочная таблица ("кодировка") данных файла, в противном случае Python не сможет правильно интерпретировать любые символы, встретившиеся в тексте программы и выходящие за пределы основной латиницы (в том числе кириллицу). Указанная в этом комментарии кодировка должна соответствовать действительной кодировке файла.
Пример простейшей программы:
# -*- coding: utf-8 -*-
name=raw_input('Как тебя зовут? ')
print 'Здравствуй, ',name,'!'
Для выполнения программы из командной строки следует вызвать интерпретатор Python, указав в качестве аргумента имя файла с программой, например
python my_program.py
Каждая IDE для Python предлагает свой способ выполнения программы. В IDLE для этого нужно в окне редактора нажать клавишу <F5>, а в Eric — клавиши <F2> и <ENTER>.
1.6 Справочная система и получение информации о Python
Основой справочной системы Python является сам Python и команда help, которую можно использовать в интерактивной оболочке.
>>> help <ENTER> Type help() for interactive help, or help(object) for help about object . >>>
Для дальнейшего взаимодействия со справочной системой Python требуется некоторое знание английского языка или "помощь друга". Встроенная справка Python существует только на английском языке.
Будет считать, что с английским особенных проблем нет, и последуем рекомендации.
>>> help() <ENTER> Welcome to Python 2.4! This is the online help utility. If this is your first time using Python, you should definitely check out the tutorial on the Internet at http://www.python.org/doc/tut/. Enter the name of any module, keyword, or topic to get help on writing Python programs and using Python modules. To quit this help utility and return to the interpreter, just type "quit". To get a list of available modules, keywords, or topics, type "modules", "keywords", or "topics". Each module also comes with a one-line summary of what it does; to list the modules whose summaries contain a given word such as "spam", type "modules spam". help>
Из результатов работы команды help() можно узнать, во-первых, версию Pyhton, во-вторых, адрес сайта с документацией, а в-третьих, получить названия основных разделов справки — модули Python ("modules"), ключевые слова Python ("keywords") и темы справки ("topics").
После выполнения команды help() Python переходит в режим интерактивной справки, соответственно изменяя приглашение оболочки.
Попробуем узнать список ключевых слов, чтобы случайно не использовать их в качестве имён переменных.
help> keywords <ENTER> Here is a list of the Python keywords. Enter any keyword to get more help. and else import raise assert except in return break exec is try class finally lambda while continue for not yield def from or del global pass elif if print help> quit <ENTER> >>>
Для выхода из интерактивной справки используется команда quit.
Справку по Python в виде гипертекста (рис. 1.7) и тоже на английском языке можно получить, открыв в любом браузере файл /usr/share/doc/ python-doc-x.y.z/index.html, где x.y.z — версия Python (например, /usr/ share/doc/python-doc-2.5.2/index.html).
Основные учебные материалы, электронные и печатные книги по Python перечислены в разделе "Литература".
1.7 Контрольные вопросы
- Почему операция вида a<b=c недопустима, а операция вида a<b==c — допустима?
- Чем отличаются результаты операций "/" и "//" для целых чисел? А для вещественных чисел?
- Какая структура является результатом работы функции divmod()?
- Какие ограничения на длину строки установлены в Python?
- Пусть имеются две строки s1 и s2. Есть ли разница в результатах выполнения команды "print s1+s2" и команды "print s1,s2"?
- Пусть имеется два кортежа t1 и t2. Есть ли разница в результатах выполнения команды "print t1+t2" и команды "print t1, t2"?
- Назовите минимум три отличия списка от кортежа.
- Пусть имеется строка s='madagaskar'. Какая строка будет результатом операции среза s[1:7:2]?
- Опишите последовательность действий, с помощью которых можно получить из файла, в котором записаны четыре вещественных числа, эти числа в виде значений переменных.
- (Трудный) Опишите способ получения геометрической прогрессии со знаменателем и вычисления её суммы.
- (Трудный) Опишите два способа изменить порядок элементов кортежа из четырёх элементов на противоположный.