Kodomo

Пользователь

Списки. Циклы. Условия.

Напоминание

Для понимания материала ОБЯЗАТЕЛЬНО каждый пример пытаться исполнить, понять, почему он работает или не работает, и попробовать в нём что-то поменять, и посмотреть, что получится.

Программирование – это практическая дисциплина, и без успешных попыток что-то сделать руками понимания теории не появляется.

Почему нужно присылать домашние работы

В начале каждого занятия я разбираю три самые типичные проблемы. Если вы не прислали никакой попытки решить задачу, то мой список типичных проблем не пополнился. Если у вас совсем ничего не получается – всё равно пишите. Я постараюсь подсказать так, чтобы столкнуть вас с мёртвой точки, но всё же оставить вам что делать и руками, и головой.

Списки

Список – это такая полочка, на которой в ряд выложены несколько питоновских объектов.

   1 x = [1, 2, 3]
   2 y = ["hello", "world"]
   3 print y + x

Список может быть пустым:

   1 x = []

Снова слайсы

Со списками можно делать те же простейшие операции, что и со строками: взять один элемент, взять подсписок.

   1 x = [1, 2, 3]
   2 y = x[2]
   3 z = x[:2]
   4 print y, z

Но кроме этого, списки можно редактировать:

   1 x[1] = 'a'
   2 print x

И, что самое приятное, в питоне можно попросить заменить длинный кусок одного списка на значения из другого списка:

   1 x[1:2] = ['hello', 'world']

Ещё одно слово про print

А ещё в print можно перечислять несколько значений через запятую. print будет выводить их на экран через пробел.

   1 print 99, "bottles of beer on the wall"

Ещё два слова про переменные

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

Это даёт нам возможность имя переменной делать содержательным. И это снова поможет нам проще читать и понимать текст программы – а это то, к чему мы стремимся.

Сравните:

   1 i = 42

и:

   1 n_hens = 7
   2 eggs_per_hen = 6
   3 n_eggs = n_hens * eggs_per_hen

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

Цикл for

Предположим, у нас есть список из названий цветов, и мы хотим написать такую смешную программку:

   1 print "My favorite color is red"
   2 print "I changed my mind! My favorite color is green"
   3 print "I changed my mind! My favorite color is blue"
   4 ...

Нам довольно быстро надоест копировать и править строки, а вот для компьютера повторять унылую работу – это любимое занятие. Поэтому мы можем заставить это делать компьютер:

   1 colors = ["red", "green", "blue", "orange", "yellow"]
   2 
   3 for color in colors:
   4     print "My favorite color is", color

В этом месте питон прекрасен тем, что программа на нём очень похожа на просто английскую фразу: "Для каждого значения (назовём его color) из списка colors напечатай мне (пожалуйста) фразу ...".

Давайте чуть подробнее, как эти слова понимает питон:

В нашем примере можно считать, что программа эквивалентна такой:

   1 colors = ["red", "green", "blue", "orange", "yellow"]
   2 
   3 color = colors[0]
   4 print "My favorite color is", color
   5 color = colors[1]
   6 print "My favorite color is", color
   7 color = colors[2]
   8 print "My favorite color is", color
   9 color = colors[3]
  10 print "My favorite color is", color

Функция range()

Одна из частых потребностей для циклов – пройтись по числам от 0 до N.

Дабы это было просто, в питоне сделали функцию range(n), которая возвращает список всех чисел от 0 до n - 1 включительно. Почему так?

Например, наша задачка с шариком, бегающим между стенками, если мы хотим совершить только первые сколько-нибудь шагов, может решаться так:

   1 width = 60
   2 field = " " * width
   3 for step in range(width * 3):
   4    x = abs(step % (width * 2) - width)
   5    print "|" + field[:x] + "o" + field[x:] + "|"

Условия

В домашнем задании мы будем писать песенку про 99 бутылок плацебо. Давайте попробуем это сделать с нашими новыми знаниями:

   1 for beer_drunk in range(100):
   2     beer_left = 99 - beer_drunk
   3     print beer_left, "bottles of beer on the wall"

В первом приближении выглядит неплохо, но только две мелочи: во-первых, там куплет выглядит подлиннее (и эту проблему я вам оставляю решать на домашнее задание), а во-вторых, у нас тут получились неграмматичное "1 bottles of beer" и хоть и грамматичное, но слишком формальное "0 bottles of beer".

То есть, когда мы ходим по циклу, мы должны на каждом шагу проверять: а не единица ли сейчас? А если единица, то давайте напишем так, а если не единица, то давайте напишем эдак!

На питон это переводится так:

   1 for beer_drunk in range(100):
   2     beer_left = 99 - beer_drunk
   3     if beer_left == 1:
   4         print beer_left, "bottle of beer on the wall"
   5     else:
   6         print beer_left, "bottles of beer on the wall"

Питон воспринимает команду "if"2 следующим образом: сначала мы вычисляем условие и получаем ответ: да или нет. И если мы получили ответ "да", то мы выполняем только то, что идёт между if и else, а если "нет", то мы выполняем только то, что идёт с отступом после else.

В железной дороге аналог "if" выполняет стрелка: в зависимости от того, куда она повёрнута, поезд идёт либо налево, либо направо, и при этом по второму пути он же одновременно с этим точно не идёт.

Литература

  1. Он один. Guido van Rossum. Он же Benevolent Dictator For Life. (1)

  2. Каноническое название: условный оператор. Но учтите, что здесь слово оператор переводится на английский как statement. (2)