Kodomo

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

Учебная страница курса биоинформатики,
год поступления 2010

Циклы, условия, списки

На прошлом занятии рисовали 3 кружка

   1 size = random.randint(1,canvas_size/2)
   2 x=random.randint(0, canvas_size-size)
   3 y=random.randint(0, canvas_size-size)
   4 color = random.choice(colors)
   5 print x,y,size
   6 canv.create_oval(x,y,x+size,y+size, fill=color, width=0)
   7 #(последний блок повторить 3 раза)

совершенно одинаковые действия повторяются три раза. А если надо 10 или 100 кружков нарисовать? Для того, чтобы сделать одинаковые действия несколько раз, используют циклы.

   1 for i in range(10):
   2        size = random.randint(1,canvas_size/2)
   3        x=random.randint(0, canvas_size-size)
   4        y=random.randint(0, canvas_size-size)
   5        color = random.choice(colors)
   6        print x,y,size
   7        canv.create_oval(x,y,x+size,y+size, fill=color, width=0)

Если действия повторяются при выполнении какого-то условия, то можно использовать цикл while. Например, будем рисовать линию из кругов с возрастающим диаметром, пока не упремся в край холста

пример

   1 root=Tkinter.Tk()
   2 canvas_size = 500
   3 canv = Tkinter.Canvas(root, width=canvas_size, height=canvas_size, bg="white")
   4 canv.pack()
   5 r = 1
   6 x = r
   7 y = canvas_size/2
   8 
   9 color = "blue"
  10  while (x < canvas_size - r):
  11              canv.create_oval(x - r, y - r, x + r, y + r, fill = color)
  12              x += r
  13              r +=1
  14              x += r
  15 
  16  root.mainloop()
  17 
  18 Иногда бывает нужно при некотором условии выполнить одно действие, а в противном случае другое действие. Например, мы хотим покрасить наши круги в синий и красный цвета через один. В этом случае будем использовать условный оператор if.
  19 
  20 i = 0
  21  while (x < canvas_size - r):
  22              if i % 2 == 0:
  23                          color = "blue"
  24              else:
  25                          color = "red"
  26              i += 1
  27              canv.create_oval(x - r, y - r, x + r, y + r, fill = color)
  28              x += r
  29              r +=1
  30              x += r
  31 
  32  root.mainloop()

Давайте напишем программу, которая рисует забавные фигуры из отрезков. Мы рисуем цепочку отрезков одинаковой длины, каждый следующий отрезок поворачивает на один и тот же угол alpha (от 50 до 90 градусов). Угол выбирается случайно в начале программы.

   1 import Tkinter
   2 import random
   3 import math
   4 
   5 root=Tkinter.Tk()
   6 canvas_size = 500
   7 colors = ["red","orange","yellow","green","blue","cyan","magenta","light blue"]
   8 canv = Tkinter.Canvas(root, width=canvas_size, height=canvas_size, bg="white")
   9 canv.pack()
  10 
  11 alpha = 0
  12 x_start = canvas_size/2
  13 y_start = 100
  14 
  15 x1 = x_start
  16 y1 = y_start
  17 
  18 betha = random.randint(50, 90)
  19 
  20 for i in range (200):
  21             size = 100
  22             alpha = (alpha + betha) % 360
  23             x2 = x1 + size * math.cos(math.radians(alpha))
  24             y2 = y1 + size * math.sin(math.radians(alpha))
  25             color = random.choice(colors)
  26             canv.create_line(x1,y1,x2,y2, fill=color, width=2)
  27             x1 = x2
  28             y1 = y2
  29 
  30             if (int (x2-x_start) == 0)&(int (y2-y_start) == 0):
  31                         break
  32 
  33 root.mainloop()

Списки

Списки в языке программирования Python являются упорядоченными последовательностями. списки состоят из различных объектов (значений, данных), и заключаются в квадратные скобки [ ]. Объекты отделяются друг от друга с помощью запятой.

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

   1 [23, 656, -20, 67, -45]   # список целых чисел
   2 [4.15, 5.93, 6.45, 9.3, 10.0, 11.6]   # список из дробных чисел
   3 ["Katy", "Sergei", "Oleg", "Dasha"]   # список из строк
   4 ["Москва", "Титова", 12, 148]   # смешанный список
   5 [[0, 0, 0], [0, 0, 1], [0, 1, 0]]   # список, состоящий из списков

Над списками можно выполнять операции соединения и повторения:

   1 >>> [45, -12, 'april'] + [21, 48.5, 33]
   2 [45, -12, 'april', 21, 48.5, 33]
   3 >>> [[0,0],[0,1],[1,1]] * 2
   4 [[0, 0], [0, 1], [1, 1], [0, 0], [0, 1], [1, 1]]

Можно получать доступ к объектам списка по их индексам, измерять длину списка:

   1 >>> li = ['a','b','c','d','e','f']
   2 >>> len(li)
   3 6
   4 >>> li[0]
   5 'a'
   6 >>> li[0:3]
   7 ['a', 'b', 'c']
   8 >>> li[3:]
   9 ['d', 'e', 'f']

Для изменения списка существует ряд методов (почти все элементы в Python являются объектами классов, о чем мы поговорим в одном из следующих уроков; к терминологии же начнем привыкать уже сейчас). Например, append() позволяет добавлять новые элементы в конец списка:

   1 >>> a = []
   2 >>> a.append('q')
   3 >>> a.append(123)
   4 >>> print a
   5 ['q', 123]

Рассмотрим еще несколько часто используемых методов:

   1 >>> a = [1,2]
   2 >>> a.insert(0,5)
   3 >>> a
   4 [5, 1, 2]
   5 >>> a.remove(1)
   6 >>> a
   7 [5, 2]
   8 >>> a.extend(a)
   9 >>> a
  10 [5, 2, 5, 2]
  11 >>> a.pop()
  12 2
  13 >>> a
  14 [5, 2, 5]

Разберемся, что делает этот код. Метод insert() вставляет элемент, значение которого задано во втором аргументе, начиная с позиции, заданной первым (в примере вставляем число 5 в начало списка). С помощью remove() вы можете удалить элемент по значению (если в списке несколько элементов с одним значением, удаляется первый из них). Метод extend() расширяет список заданной последовательностью (заметьте, как это отличается от append()), ну и pop() «выталкивает» из списка последний элемент. Удалить элемент по индексу можно оператором del, который справляется с любыми переменными: del a[1].

Помимо этого, вы можете использовать методы sort() и reverse().

Напишем программу, которая создает несколько случайных точек и соединяет каждые две из них отрезком. Таким образом, мы рисуем полносвязный граф — клику.

   1 import Tkinter
   2 import random
   3 import math
   4 root=Tkinter.Tk()
   5 canvas_size = 500
   6 colors = ["red","orange","yellow","green","blue","cyan","magenta","light blue"]
   7 canv = Tkinter.Canvas(root, width=canvas_size, height=canvas_size, bg="white")
   8 canv.pack()
   9 npoints = 5
  10 x = []
  11 y = []
  12 for i in range(npoints):
  13             x.append(random.randint(0, canvas_size))
  14             y.append(random.randint(0, canvas_size))
  15 for i in range(npoints):
  16             for j in range(i + 1, npoints):
  17                         color = random.choice(colors)
  18                         canv.create_line(x[i], y[i], x[j], y[j], fill = color, width = 2)
  19 root.mainloop()