Kodomo

User

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

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

На прошлом занятии рисовали несколько кружков (например, 3)

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

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

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

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

пример

root=Tkinter.Tk()
canvas_size = 500
canv = Tkinter.Canvas(root, width=canvas_size, height=canvas_size, bg="white")
canv.pack()
r = 1
x = r
y = canvas_size/2

color = "blue"
while (x < canvas_size - r):
             canv.create_oval(x - r, y - r, x + r, y + r, fill = color)
             x += r
             r +=1
             x += r

root.mainloop()

Иногда бывает нужно при некотором условии выполнить одно действие, а в противном случае другое действие. Например, мы хотим покрасить наши круги в синий и красный цвета через один. В этом случае будем использовать условный оператор if.

i = 0
while (x < canvas_size - r):
             if i % 2 == 0:
                         color = "blue"
             else:
                         color = "red"
             i += 1
             canv.create_oval(x - r, y - r, x + r, y + r, fill = color)
             x += r
             r +=1
             x += r

root.mainloop()

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

import Tkinter
import random
import math

root=Tkinter.Tk()
canvas_size = 500
colors = ["red","orange","yellow","green","blue","cyan","magenta","light blue"]
canv = Tkinter.Canvas(root, width=canvas_size, height=canvas_size, bg="white")
canv.pack()

alpha = 0
x_start = canvas_size/2
y_start = 100

x1 = x_start
y1 = y_start

betha = random.randint(50, 90)

for i in range (200):
            size = 100
            alpha = (alpha + betha) % 360
            x2 = x1 + size * math.cos(math.radians(alpha))
            y2 = y1 + size * math.sin(math.radians(alpha))
            color = random.choice(colors)
            canv.create_line(x1,y1,x2,y2, fill=color, width=2)
            x1 = x2
            y1 = y2

            if (int (x2-x_start) == 0)&(int (y2-y_start) == 0):
                        break

root.mainloop()

Списки

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

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

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

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

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

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

>>> li = ['a','b','c','d','e','f']
>>> len(li)
6
>>> li[0]
'a'
>>> li[0:3]
['a', 'b', 'c']
>>> li[3:]
['d', 'e', 'f']

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

>>> a = []
>>> a.append('q')
>>> a.append(123)
>>> print a
['q', 123]

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

>>> a = [1,2]
>>> a.insert(0,5)
>>> a
[5, 1, 2]
>>> a.remove(1)
>>> a
[5, 2]
>>> a.extend(a)
>>> a
[5, 2, 5, 2]
>>> a.pop()
2
>>> a
[5, 2, 5]

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

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

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

import Tkinter
import random
import math
root=Tkinter.Tk()
canvas_size = 500
colors = ["red","orange","yellow","green","blue","cyan","magenta","light blue"]
canv = Tkinter.Canvas(root, width=canvas_size, height=canvas_size, bg="white")
canv.pack()
npoints = 5
x = []
y = []
for i in range(npoints):
            x.append(random.randint(0, canvas_size))
            y.append(random.randint(0, canvas_size))
for i in range(npoints):
            for j in range(i + 1, npoints):
                        color = random.choice(colors)
                        canv.create_line(x[i], y[i], x[j], y[j], fill = color, width = 2)
root.mainloop()

2012/4/Python/2/Record (last edited 2014-02-25 06:30:01 by stavrovskaya)