Kodomo

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

Занятие 4: Условия и циклы.

Цикл for

Цикл – команда питону исполнить набор каких-либо действий определённое количество раз. Каждое такое исполнение называется итерацией цикла.

В основном в питоне используется цикл for.

Рассмотрим форму его записи на элементарном примере:

   1 >>> for i in [1, 2, 3]:
   2 ...    print i
   3 ...
   4 1
   5 2
   6 3

ВАЖНО: не забываем ставить двоеточие и делать отступы всякий раз, когда пишем тело цикла!

Перед каждой итерацией переменной цикла присваивается очередное значение из списка, по которому проходит цикл.

Теперь изучим несколько новых функций, которые нам потребуются в циклах.

И рассмотрим сразу их действие на примерах:

range

   1 >>> range (5)
   2 [0, 1, 2, 3, 4]

Заметим, что указывав в скобках одно число N, на выходе мы получим последовательность от "0" до "N-1".

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

   1 >>> range (3, 10)
   2 [3, 4, 5, 6, 7, 8, 9]

Разберём более интересный пример и назовём его "Английским алфавитом":

   1 >>> codes=range (ord('A'), ord('Z')+1)
   2 >>> letters=[]
   3 >>> for code in codes:
   4 ...    letters.append(chr(code))
   5 ...
   6 >>> print letters
   7 ['A', 'B', 'C', 'D', 'E', 'F', 'G', 'H', 'I', 'J', 'K', 'L', 'M', 'N', 'O', 'P', 'Q', 'R', 'S', 'T', 'U', 'V', 'W', 'X', 'Y', 'Z']

Но не забудьте выйти из цикла... Если команду print оставить в теле цикла, то получим на экране результат каждой итерации:

   1 >>> codes=range (ord('A'), ord('Z')+1)
   2 >>> letters=[]
   3 >>> for code in codes:
   4 ...    letters.append(chr(code))
   5 ...    print letters
   6 ...
   7 ['A']
   8 ['A', 'B']
   9 ['A', 'B', 'C']
  10 ['A', 'B', 'C', 'D']
  11 ['A', 'B', 'C', 'D', 'E']
  12 ['A', 'B', 'C', 'D', 'E', 'F']
  13 ['A', 'B', 'C', 'D', 'E', 'F', 'G']
  14 ['A', 'B', 'C', 'D', 'E', 'F', 'G', 'H']
  15 ...

Функция ord возвращает код буквы (в кодировке ASCII или в уникоде):

   1 >>> codes=range (ord('A'), ord('Z')+1)
   2 >>> print codes
   3 [65, 66, 67, 68, 69, 70, 71, 72, 73, 74, 75, 76, 77, 78, 79, 80, 81, 82, 83, 84, 85, 86, 87, 88, 89, 90]

Команда chr обратно переводит код в букву, что мы и увидели в примере.

Индексы и слайсы

Рассмотрим пример:

   1 >>> codes=range (ord('A'), ord('Z')+1)
   2 >>> letters=[]
   3 >>> for code in codes:
   4 ...    letters.append(chr(code))
   5 ...
   6 >>> print letters[10]
   7 K

Как видим, командой letter[10] мы вытаскиваем элемент с номером 10. Это называется индексированием, получением элемента списка по индексу.

В алфавите номеру 10 соответствует буква К, одиннадцатая по счёту. (Не забываем о том, что нумерация начинается с 0)

Пример:

   1 >>> codes=range (ord('A'), ord('Z')+1)
   2 >>> letters=[]
   3 >>> for code in codes:
   4 ...    letters.append(chr(code))
   5 ...
   6 >>> print letters[1:3]
   7 ['B', 'C']

Такой командой letters[1:3] мы получаем список, элементов в указанном диапозоне. Такой список называется слайсом.

ВАЖНО: слайс letters[N:M] начинается с элемента, стоящего под номером N (который мы указываем первым), и заканчивается элементом с номером M-1.

Пример это как раз демонстрирует.

Можем делать слайс от начала и до необходимого элемента: командой letters[:3] например:

   1 >>> codes=range (ord('A'), ord('Z')+1)
   2 >>> letters=[]
   3 >>> for code in codes:
   4 ...    letters.append(chr(code))
   5 ...
   6 >>> print letters[:3]
   7 ['A', 'B', 'C']

Командой letters[:] мы получим в слайсе весь наш список, но

ВАЖНО помнить, что при этом будет создан новый объект, а не ссылка!

Пример:

   1 >>> a=[1, 2, 3]
   2 >>> b=a[:]
   3 >>> del a[1]
   4 >>> b
   5 [1, 2, 3]

Соответственно, если мы хотим последний элемент, то нужно использовать команду letters[-1], а два последних элемента – letters[-2:].

   1 >>> letters=[1, 2, 3, 4, 5, 6, 7, 8, 9]
   2 >>> print letters[-1]
   3 9
   4 >>> print letters[-2:]
   5 [8, 9]

Ну и конечно если мы зададим несуществующий промежуток, то ничего на выходе не получим!

Таким примером может являться отрезок [13:-13] для анлгийского алфавита.=)

Удалить слайс:

   1 >>> a=[1, 2, 3]
   2 >>> del a[0:2]
   3 >>> print a
   4 [3]

Видим, что удаление заканчивается N-1 элементом! Но мы это помним.=)

Мы можем не только удалять, но и заменять слайс

   1 >>> a=range(10)
   2 >>> a[1:-1]=[4, 5]
   3 >>> print a
   4 [0, 4, 5, 9]

Думаю, что если вы внимательно читали предыдущие замечания, то результат для вас не был неожиданным.

(Действительно, командой range(10) мы получили : 0, 1, 2, 3, 4, 5, 6, 7, 8, 9. Берём промежуток, начиная с первого элемента, то есть с единицы(ведь нулевой элемент и есть ноль в данном случае) и заканчивая элементом N-1, то есть 8.

Пример на сочетание букв и цифр:

   1 >>> a=range(10)
   2 >>> b=['A', 'B', 'C']
   3 >>> a[1:-1]=b[0:2]
   4 >>> print a
   5 [0, 'A', 'B', 9]

Кортежи и распаковка кортежей

Чем кортежи отличаются от списков?

Ответ:

  1. его нельзя менять!!!
  2. записываем его в круглых скобках!!!

Рассмотрим на примерах:

Пример №1.

   1 >>> A=[(1, 2), (3, 4), (5, 6)]
   2 >>> for x in A:
   3 ...    print "x=", x[0], "y=", x[1]
   4 ...
   5 x= 1 y= 2
   6 x= 3 y= 4
   7 x= 5 y= 6

Пример №2

   1 >>> A=[(1, 2), (3, 4), (5, 6)]
   2 >>> for B in A:
   3 ...    x, y=B
   4 ...    print "x=", x, "y=", y
   5 ...
   6 x= 1 y= 2
   7 x= 3 y= 4
   8 x= 5 y= 6

Во втором примере достаточно подозрительна запись:

   1 x, y = B

Пояснение: эта запись определяет операцию, что и в предыдущем примере ПЛЮС проводится проверка, что в кортеже только 2 элемента, а не три и более.

Эта операция называется распаковкой кортежа.

Почти синонимом (кроме проверки длины B) для неё было бы:

   1 x = B[0]
   2 y = B[1]

Пример №3

Более того, возможен и такой вариант записи:

   1 >>> x=[(1, 2), (3, 4), (5, 6)]
   2 >>> for x, y in x:
   3 ...     print "x=", x, "y=", y
   4 ...
   5 x= 1 y= 2
   6 x= 3 y= 4
   7 x= 5 y= 6

Теперь научимся делать списки пар.

Функция zip получает на вход два списка и склеивает их попарно:

   1 >>> zip([1, 2, 3], [4, 5, 6])
   2 [(1, 4), (2, 5), (3, 6)]

Запуск функции enumerate - позволяет создавать следующие кортежи:

   1 >>> for x in enumerate(['A', 'B', 'C']):
   2 ...    print x
   3 ...
   4 (0, 'A')
   5 (1, 'B')
   6 (2, 'C')

Таким образом, enumerate сопоставляет значение элемента его индексу.

Очень полезная функция :-) , позволяет, например, провести соединение в пары соседних элементов.

   1 >>> x = ['A', 'B', 'C', 'D', 'E']
   2 >>> for i, v in  enumerate(x[:-1]):
   3 ...     print v + x[i+1]
   4 ...
   5 AB
   6 BC
   7 CD
   8 DE

Условия

Запись проста и удобна:

   1 >>> x = 4
   2 >>> if x==1:
   3 ...    print 'one'
   4 ... elif x==2:
   5 ...    print 'two'
   6 ... else:
   7 ...    print 'too money'
   8 ...
   9 too money

В питоне есть операции сравнения и работы с логическими выражениями, смысл которых достаточно понятен из их записи:

>, <, <=, >= (как слышится, так и пишется: мы говорим "больше равно", так и пишем),

== (двойное равно – сравнение, одинарное равно – присваивание),

!= (не равно),

in (является дли что-то элементом списка), not in,

not (отрицание логического выражения).