Занятие 1.
Краткое содержание: Вводные слова. Питон как калькулятор (числа, строки, списки). Поиск документации по языку (dir, help, pydoc, сайты). Простейшая работа с файлами.
Содержание
План рассказа
- Введение:
- кто такой BDFL = Benevolent Dictator for Life = Guido Van Rossum = дяденька Гвидо = автор языка
всё на самом деле очень просто; один из главных принципов языка – принцип наименьшей неожиданности
- python way (сегодня: "batteries included" + "помощь где-то рядом" + "я не знаю, как это делать, но угадаю с первой попытки")
- Простые примеры:
Стрелочки (>>>) обозначают приглашение командной строки интерпретатора. Мы пишем их в примерах и их нужно писать в ответах на задания.
.
1 >>> print "hello, world" 2 hello, world 3 >>> print 2*2 4 4 5 >>> print 1+2 6 3 7 >>> print "This page has", 2*5, "lines" 8 This page has 10 lines 9 >>> a = "one" # переменные создаются в момент упоминания 10 >>> print a 11 one 12 >>> a = "one" + "word" # склейка строк (умное слово: конкатенация) 13 >>> print a, 2, "words" 14 oneword 2 words 15 >>> a = "Hello, world"; print a # несколько операторов можно писать через точку с запятой 16 >>> a = [1, 2, 3] # список из трёх чисел 17 >>> print a[0] # получение элемента списка, нумерация с ноля (древняя программистская традиция) 18 1 19 >>> print a[0:2] # получение куска списка (умное слово: slice / slicing) 20 [1, 2] 21 >>> print a[1:2] # NB: эта операция похожа на математичекий интервал [1,2) -- правый конец не включён в интервал 22 [2] 23 >>> print a[-1] # приятное удобство: отрицательные числа дают нумерацию с конца, начиная с -1 24 [3] 25 >>> a = [1, "hello", [2,3]] # в списки можно сваливать значения любых типов 26 >>> print a[:2] 27 [1, "hello"] 28 >>> print a[1:-1] # начиная со втрого элемента, до последнего, иключая его 29 ["hello"] 30 >>> print a[-1][0] # внутри списка список, его тоже можно сразу индексировать 31 2 32 >>> a = "hello" 33 >>> print a[2:4] # строки похожи на списки 34 "ll" 35 >>> print a[0] # NB: любой элемент строки -- как бы тоже строка; или можно считать, это это не индексация (получение элемента по номеру), а тоже вырезка -- кому как удобнее 36 "h" 37 >>> print 1+1j # комплексные числа 38 (1+1j) 39 >>> print (1+1j) * 1j 40 (-1+1j) 41 >>> print 1.0 + 1 # числа с плавающей точкой 42 2.0 43 >>> 1234567891011 # очень большие целые числа выводятся с буквой L на конце 44 1234567891011L 45 >>> a = "hello, world" # что строка в кавычках, что переменная a указывают на объект типа "строка" 46 >>> print a.title() # у объектов можно вызывать методы 47 Hello, world 48 >>> print a # данный метод не изменил объект, но некоторые методы меняют 49 hello, world 50 >>> a # в интерпретаторе мы можем опускать слово print, тогда нам выдадут более информативное представление объекта, но в программах такой приём не работет 51 "hello, world"
- Нудятина про типы:
.
1 >>> type(1) # функция type возвращает тип объекта 2 <type 'int'> 3 >>> type(1.0) 4 <type 'float'> 5 >>> type(12345678910) 6 <type 'long'> 7 >>> type("hello") 8 <type 'str'> 9 >>> type(1+1j) 10 <type 'complex'> 11 >>> type([]) 12 <type 'list'> 13 >>> type(1) == int # тип объекта -- это такой объект 14 True 15 >>> type(int) # тип объекта -- это объект типа "тип" :) 16 <type 'type'> 17 >>> a = "123" 18 >>> print a + "1" # это ещё конкатенация строк 19 1231 20 >>> print int(a) + 1 # это приведение типов, довольно умное: получили из строки число 21 124 22 >>> print list([1,2,3]) # list -- объект типа, он же сам тип, он же класс, он же конструктор типа; в данном случае мы его используем как конструктор типа -- функция, которая, если ей дать какие-то (осмысленные) аргументы, вернёт объект этого типа 23 [1, 2, 3]
- Пара слов об утиной типизации. Основной постулат: то, что ходит как утка и крякает как утка, и есть утка. (Здесь: если вы не уверены абсолютно точно, что нужен какой-то конкретный тип, не надо делать приведение типов).
Как из числа сделать строку? Что делает list("hello")?
Форматирование строк операцией %:
1 >>> a = "This %s is very %s" 2 >>> b = ("loaf", "tasty") # в скобках через запятую -- кортеж (tuple) -- почти то же самое, что список 3 >>> c = a % b # для целых чисел % -- взятие остатка от деления; для строк -- подстановка формата как в printf, sprintf и иже с ними 4 >>> print a, b, "==>", c 5 This %s is very %s ("loaf", "tasty") ==> This loaf is very tasty 6 >>> print "Total %02d%%" % (1,) # кортеж из одного элемента требует некрасивой запятой в конце, чтобы отличаться от пары скобок; операция % поддерживает все возможности форматирования printf, например дополнение чисел нулями до нужного количества разрядов; символ % в строках нужно удваивать, чтобы отличать от элемента шаблона 7 Total 01%
- Подсказки
Как узнать что-то об объекте a? (Пусть у нас есть объект a, о котором мы ничего не знаем; как узнать?)
1 >>> a # можно попытаться распечатать этот объект, этой информации может хватить 2 <type 'int'> 3 >>> help(a) # выдаст большую подсказку, в Linux через программу less. Важные клавиши, которые в ней нужно знать: выход -- q, вверх-вниз как обычно, поиск: /слово 4 5 >>> dir(a) # выдаёт список имён полей объекта (методов, свойств, переменных, как их не назови: всё, что внутри объекта) 6 7 >>> help(str.title) # подсказка по методу строки; NB: эта подсказка относится к примеру a = "hello, world"; print a.title() 8 9 >>> help(str) # свод всех методов строки (NB: str -- это тот же объект, что и type("hello"), например) 10 11 >>> help() # если вы случайно забыли дать аргумент функции help(), вы попадёте в интерактивный поисковик документации; внимательно прочитайте, что вам написала система; что будет происходить с вами дальше -- ваша личная головная боль, я предупредил
- Вы скачали библиотеку, как о ней что-нибудь узнать? Если в ней есть, например, модуль main.py, можно сказать (из командной строки unix, а не из интерпретатора python):
pydoc main, чтобы получить подсказку по всему модулю
pydoc main.f – только по методу f из модуля main
pydoc str.title в командной строке unix – точно то же самое, что и help(str.title) в командной строке python
- Две полезные ссылки:
http://docs.python.org/lib/lib.html – если нужно найти модуль по его функциональности или изучить общую идею работы с каким-нибудь классом (на сайте python.org, в уголке слева Documentation, там Library Reference)
http://docs.python.org/ref/specialnames.html – про имена вида __add__ (на сайте python.org, Documentation, Language Reference, Special method names... остальное там читать скучно и трудоёмко)
- Иногда приходится читать исходные тексты чужих программ. Это не так трудно и помогает учиться новым вещам.
Основное правило поиска документации: если вы ничего о каком-то типе или модуле не знаете и хотите понять, что к чему, открывайте Library Reference (см. п. 3); если вы имеете представление о том, как с объектом работать и хотите вспомнить знакомый метод или посмотреть метод, похожий на знакомый – используйте help(объект).
- Простейшая работа с файлами:
f = open("file") или f = open("file", "w")
f.read() или f.write("hello") или ищите в документации
f.close()
Обязательно научиться
- переменные: простое присваивание
- оператор print
- простая арифметика
- арифметика строк
что-угодно > строка (str, %)
строка > число
- простая работа с последовательностями: строками, списками и кортежами (slice)
- сортировка
- help (+ поиск в less)
- простая работа с файлами
Задания
Все задания выполняются в интерактивном режиме интерпретатора.
Для результатов задания создайте директорию Python в вашей домашней директории. (В windows: H:\Python, в linux: mkdir ~/Python; cd ~/Python ). В качестве результата задания принимается файл practice1.log в директории результатов. В файл нужно записать те части вашего диалога с интерпретатором, которые приводят к получению результата задания. Например, если бы задание номер 0 было "напечатайте результат умножения 2 на 2", в файл должен был бы попасть такой фрагмент:
>>> print 2*2 4
Во избежание головной боли и себе (когда вы на следующий раз обнаружите, что вас нет в таблице результатов первого задания) и мне (когда вы на это пожалуетесь и мне придётся срочно допроверять не пойми что), воспроизводите имена файлов в точности и строго следуйте формату.
Почти все задания в первую очередь нацелены на умение поиска документации. Резонно предположить, что, хотя я что-то и рассказал на вступительной части, в общем, вы имеете очень смутное представление о тех типах, с которыми вам нужно работать. Поэтому лучше начать с использования документации на сайте (см. выше).
- Сколько зёрен риса попросил за своё изобретение автор шахмат?
- Легенда гласит, что после того, как изобретатель шахмат преподнёс своё изобретение шаху и шаху оно понравилось, шах предложил изобретателю попросить любую награду. Автор игры скромно попросил положить на первую клетку шахматной доски 1 зерно, на вторую 2, и на каждую следующую класть вдвое больше зёрен, чем на предыдущую.
- Математическая часть задания (к программированию отношения не имеет): упростить записть соответсвтующей суммы.
- Программистская часть задания: научиться возводить числа в степень (а также вообще посмотреть, чего интересного пишут про числа в документации)
- Нарисуйте на экране прямоугольник в ASCII-art в 40 символов в ширину. Подберите высоту рамки на ваш вкус. (Из символов -, | для рамок и + в уголках).
- Подсказка:
- а) Научитесь делать длинные строки из одинаковых символов
- б) сохраните во вспомогательную переменную строку из нужного количества "-" между двумя "+"
- в) сохраните в другюу вспомогательную переменную строку из нужного количества пробелов между двумя "|"
- г) нарисуйте рамку из этих строк
- Подсказка:
- Нарисуйте в таком же в прямоугольнике число зёрен риса изобретателя шахмат (см. str.ljust, str.rjust, str.center)
- Если вы выполняли предыдущее упражнение по подсказке, то вам достаточно немного переписать вторую вспомогательную переменную.
- Напишите число зёрен риса изобретателя шахмат в более удобочитаемом виде (расставьте пробелы между каждыми тремя символами начиная с конца).
- Подсказка:
- а) сохраните в переменную строковое представление числа (как сделать из числа строку?)
- б) научитесь выводить на экран последние 3 символа строки; 3 символа перед ними, ...
- в) выпишите (существующие) интервалы строки по три символа через пробел
- Это задание подразумевает довольно много унылого повторения кода и предположение, что число в длину не больше 20 символов. Вопреки ожиданиям многих, форматирование через % не даёт готового решения в этом случае.
- Подсказка:
- Сохраните интервалы, которые вы выписывали через пробел для предыдущего задания в список. Прочитайте документацию по str.join. Сохраните в переменной строковое представление числа зёрен риса изобретателя шахмат через пробелы, как в предыдущем задании.
- Верните всё обратно (превратите строку с читаемым представлением числа зёрен риса изобретателя шахмат в число):
- а) разбейте строку по пробелам
- б) соедините получившиеся куски
- в) превратите в число, распечатайте это число; совпадает ли оно с исходным числом?
- Можно ли сделать пункты а и б проще?
Откройте файл /etc/passwd (в Windows: P:/SpecialCourses/Python/passwd). В этом файле хранится информация о пользовательских аккаунтах в системе (в данном случае, не о всех). На каждый пользовательский аккаунт в файле отведено по строке, состоящей из семи записей, разделённых двоеточием: логин, буква x1, числовой идентификатор пользователя, числовой идентификатор группы, имя пользователя, домашняя директория, шелл. Выведите на экран по значение поля "имя пользователя" (5-е поле) для первой и последней записи файла. Посортируйте строки, полученные из файла и снова выведите на экран первое и последнее имя. По шагам:
- а) откройте файл, прочитайте, разбейте по строкам, сохраните в переменную
- б) разбейте по символу ":" первую строку, выведите пятый элемент полученного списка
- в) аналогично для последней строки
- г) отсортируйте список строк
- д) повторите б и в
- Обратите внимание на то, что в файле на самом деле нет пустых строк, но есть пустые имена пользователей.
- Подсказка: В традиции unix принято завершать файл символом переноса строки. Это должно создать для вас определённые трудности.
- (*) Выведите название 3-й последовательности из файла /home/export/samba/public/SpecialCourses/Python/file.fasta (в Windows: P:/SpecialCourses/Python/file.fasta). Сохраните эту последовательность в формате fasta в файл file.fasta в директории результатов задания.
(**) Следующая строка зашифрована кодом Цезаря с параметром 13. Расшифруйте её: Ybbxf yvxr lbh unir fhpprffshyyl qrpbqrq guvf fragrapr. Pbatenghyngvbaf urer. V whfg jbaqre vs lbh znantrq gb ybbx hc qbpf sbe rapbqr zrgubq bs fge.
- Если вы не знаете, каким кодом шифровал Гай Юлий Цезарь свои секретные тексты, поищите в интернете.
Подсказка: это задание можно выполнить вызовом одного метода. Но есть и более сложный путь, который начинается так:
"раньше там хранился пароль в зашифрованном виде -- а на самой-самой заре времён и в незашифрованном, -- теперь осталась только одна буква от фразы: хрен взломаешь" (1)