Списки. Циклы. Условия.
Содержание
Напоминание
Для понимания материала ОБЯЗАТЕЛЬНО каждый пример пытаться исполнить, понять, почему он работает или не работает, и попробовать в нём что-то поменять, и посмотреть, что получится.
Программирование – это практическая дисциплина, и без успешных попыток что-то сделать руками понимания теории не появляется.
Почему нужно присылать домашние работы
В начале каждого занятия я разбираю три самые типичные проблемы. Если вы не прислали никакой попытки решить задачу, то мой список типичных проблем не пополнился. Если у вас совсем ничего не получается – всё равно пишите. Я постараюсь подсказать так, чтобы столкнуть вас с мёртвой точки, но всё же оставить вам что делать и руками, и головой.
Списки
Список – это такая полочка, на которой в ряд выложены несколько питоновских объектов.
Список может быть пустым:
1 x = []
Снова слайсы
Со списками можно делать те же простейшие операции, что и со строками: взять один элемент, взять подсписок.
Но кроме этого, списки можно редактировать:
И, что самое приятное, в питоне можно попросить заменить длинный кусок одного списка на значения из другого списка:
1 x[1:2] = ['hello', 'world']
Ещё одно слово про print
А ещё в print можно перечислять несколько значений через запятую. print будет выводить их на экран через пробел.
1 print 99, "bottles of beer on the wall"
Ещё два слова про переменные
Имена переменных могут быть сколь угодно длинными из букв, цифр и подчёркиваний, но начинаться должны с буквы или подчёркивания (не с цифры). И лучше не начинать названия переменных с подчёркивания – принято такие названия оставлять для специальных нужд.
Это даёт нам возможность имя переменной делать содержательным. И это снова поможет нам проще читать и понимать текст программы – а это то, к чему мы стремимся.
Сравните:
1 i = 42
и:
Ещё в именах переменных нельзя использовать ключевые слова, дабы питон не перепутал, что вы в этом месте имели в виду. (На самом деле, авторы питона1 могли бы и разрешить их использовать в качестве имён переменных, но ценой тому было бы то, что интерпретатор питона отлавливал бы меньше ошибок, а это в программировании очень важно).
Цикл for
Предположим, у нас есть список из названий цветов, и мы хотим написать такую смешную программку:
Нам довольно быстро надоест копировать и править строки, а вот для компьютера повторять унылую работу – это любимое занятие. Поэтому мы можем заставить это делать компьютер:
В этом месте питон прекрасен тем, что программа на нём очень похожа на просто английскую фразу: "Для каждого значения (назовём его color) из списка colors напечатай мне (пожалуйста) фразу ...".
Давайте чуть подробнее, как эти слова понимает питон:
- Когда питон видит "for имя_переменной in список" впервые, он делает "имя_переменной = список[0]" и запоминает себе, что сейчас он смотрит на элемент списка с номером 0.
Дальше он исполняет тело цикла (тело цикла – это та часть программы, которая идёт с отступом после for).
Когда он доходит до цонка тела цикла, он смотрит: а вот тот элемент списка, который я себе запомнил – он последний? Если оказывается, что он не последний, то питон переходит снова на строчку с for, и на этот раз выполняет "имя_переменной = список[1]" (это на втором шагу, на третьем будет 2 и т.д) и продолжает как раньше. Если же оказалось, что питон уже стоял на последнем элементе, то цикл на этом завершается, и питон продолжает исполнять то, что идёт за циклом. (В нашем случае это конец программы).
В нашем примере можно считать, что программа эквивалентна такой:
Функция range()
Одна из частых потребностей для циклов – пройтись по числам от 0 до N.
Дабы это было просто, в питоне сделали функцию range(n), которая возвращает список всех чисел от 0 до n - 1 включительно. Почему так?
Это список из n элементов (так что for x in range(n) выполнит ровно n шагов)
Числа начинаются с нуля – значит их удобно использовать в качестве индексов в строках и списках (for elem in range(len(list))).
Например, наша задачка с шариком, бегающим между стенками, если мы хотим совершить только первые сколько-нибудь шагов, может решаться так:
Условия
В домашнем задании мы будем писать песенку про 99 бутылок плацебо. Давайте попробуем это сделать с нашими новыми знаниями:
В первом приближении выглядит неплохо, но только две мелочи: во-первых, там куплет выглядит подлиннее (и эту проблему я вам оставляю решать на домашнее задание), а во-вторых, у нас тут получились неграмматичное "1 bottles of beer" и хоть и грамматичное, но слишком формальное "0 bottles of beer".
То есть, когда мы ходим по циклу, мы должны на каждом шагу проверять: а не единица ли сейчас? А если единица, то давайте напишем так, а если не единица, то давайте напишем эдак!
На питон это переводится так:
Питон воспринимает команду "if"2 следующим образом: сначала мы вычисляем условие и получаем ответ: да или нет. И если мы получили ответ "да", то мы выполняем только то, что идёт между if и else, а если "нет", то мы выполняем только то, что идёт с отступом после else.
В железной дороге аналог "if" выполняет стрелка: в зависимости от того, куда она повёрнута, поезд идёт либо налево, либо направо, и при этом по второму пути он же одновременно с этим точно не идёт.