12. Принимаем решения. Оператор выбора в Python (ветвление, if)

Для выбора цвета в некоторых предыдущих примерах мы сначала выбирали номер случайным образом, потом брали элемент списка с этим номером каждый раз, когда нужно было узнать выбранный цвет. Проще для этого использовать функцию choice из модуля random. Напомню, что ее надо будет импортировать.

        colors = ['red','blue','green','orange']
        color = colors[random(len(colors))]
        canv.create_oval(x-r,y-r,x+r,y+r,fill = color)


        colors = ['red','blue','green','orange']
        color = choice(colors)
        canv.create_oval(x-r,y-r,x+r,y+r,fill = color)

Посчитаем, сколько синих кругов мы нарисовали:

from tkinter import *
from random import randrange as rnd, choice

root = Tk()
root.geometry('800x600')

canv = Canvas(root,bg='white')
canv.pack(fill=BOTH,expand=1)
 
colors = ['red', 'orange', 'yellow', 'green', 'blue']


def paint(event):
    canv.delete(ALL)
    k = 0
    for z in range(30):
        x = rnd(100,700)
        y = rnd(100,500)
        r = rnd(5,30)
        color = choice(colors)
        if color == 'blue':
            k += 1
        canv.create_oval(x-r,y-r,x+r,y+r,fill = color)
    print(k)
         
canv.bind('<Button-1>',paint)
mainloop()

Результат подсчета появится в консоли. За это отвечает уже знакомый print, но можно вывести и прямо на canvas:
(писать вместо print)

    canv.create_text(20,20,text=str(k), font = '18')

А теперь посчитаем, сколько было синих или зеленых, для этого заменим строку:
if color == 'blue':
на
if color == 'blue' or color == 'green':

1. or – это логический оператор. Какие еще логические операторы бывают? См. справочник.

Будем рисовать красные круги случайным радиусом, а остальные – радиусом 20:

def paint(event):
    for z in range(30):
        x = rnd(100,700)
        y = rnd(100,500)
        color = choice(colors)
        if color == 'red':
            r = rnd(10,40)
        else:
            r = 20
        canv.create_oval(x-r,y-r,x+r,y+r,fill = color)

В данном случае мы видим выбор из двух вариантов. Если условие, записанное в if верно, то блок else не выполняется. А если неверно, то – выполняется.
Рассмотрим еще один пример. Не запуская, попробуйте определить, что он делает:

def paint(event):
    for z in range(30):
        x = rnd(100,700)
        y = rnd(100,500)
        color = choice(colors)
        if color == 'red':
            r = rnd(10,40)
        else:
            if color == 'pink':
                r = 50
            else:
                r = 10
        canv.create_oval(x-r,y-r,x+r,y+r,fill = color)

А что, если у нас для каждого цвета есть свой вариант? Так мы быстро запутаемся в «лесенке» if… К счастью, Python позволяет организовать множественный выбор более простым способом:

def paint(event):
    for z in range(30):
        x = rnd(100,700)
        y = rnd(100,500)
        color = choice(colors)
        if color == 'red':
            r = rnd(10,40)
        elif color == 'pink':
            r = 50
        elif color == 'magenta':
            r = 100
        else:
            r = 20
        canv.create_oval(x-r,y-r,x+r,y+r,fill = color)

Итак, оператор выбора позволяет писать сложные условия (вы же заглянули в справочник, не так ли?).
Проверьте себя: вы должны понимать примеры, приведенные ниже:

if color == 'red':

if color != 'red':

if color == 'red' or color == 'blue':

if color = 'red' and r > 20:

if 10 < r < 30:

if color =='red':
    r = 30
else:
    r = 50

if color == 'blue' or 'cyan':
    r = 10
elif color == 'red' or color == 'pink':
    r = 20
else:
  r = rnd(10,50) 

 

 
А теперь немного практики:

3. Нарисовать 20 случайных кругов, посчитать, сколько нарисовано красных
4. Нарисовать 20 случайных кругов, посчитать, сколько было нарисовано зеленых и синих
5. Нарисовать 20 случайных кругов, посчитать, сколько было нарисовано маленьких (радиус меньше 20) красных и больших синих (радиус больше 50)
6. Нарисовать 20 случайных кругов. Если фигура левее центра – красным, если правее – синим.
7. Создайте новую команду (функцию) для рисования равностороннего треугольника: tr(x,y,n), где x,y- координаты одной из его вершин, а n - размер стороны.
8. Нарисовать 30 фигур, выбирая их случайным образом (квадратов, треугольников, прямоугольников или кругов), случайного размера, цвета и в случайном месте.

Для выбора фигуры будем использовать тот же rnd:

    ch = rnd(3)
    if ch == 0:
        canv.create_oval...
    elif ch == 1:
        canv.create_rectangle...
    elif ch== 2:
        ...
8. Нужно было посчитать количество зеленых кругов, но программист торопился и допустил три ошибки. Исправьте их:

def paint(event):
    for z in range(30):
        k = 0
        x = rnd(100,700)
        y = rnd(100,500)
        color = choice(colors)
        r = rnd(10,40)
        if color == 'red':
            k = 1
        canv.create_oval(x-r,y-r,x+r,y+r,fill = color)
    print(k)
9. Нужно было посчитать количество маленьких, но нашего друга опять постигла неудача: программа выдает странный результат. Он ждет вашей помощи:

def paint(event):
    for z in range(30):
        k = 0
        x = rnd(100,700)
        y = rnd(100,500)
        color = choice(colors)
        r = rnd(10,40)
        if r <= 15:
            k += 1
        canv.create_oval(x-r,y-r,x+r,y+r,fill = color)
        print(k)
10. Программист написал программу, которая должна кидать круги, радиусом 10, в экран, если попадает не далее, чем два радиуса от центра, то красным цветом, если не далее четырех радиусов от центра – то синим, если не более 8-ми радиусов от центра, то зеленым и желтым в противном случае. Программист утверждает, что все условия написаны правильно, ведь по-отдельности они работают. Помогите найти ошибку и доделать программу.
Вот так должно было получиться:
Снимок экрана от 2016-01-03 17:30:30

from tkinter import *
from random import randrange as rnd

root = Tk()
root.geometry('800x600')

canv = Canvas(root,bg='white')
canv.pack(fill=BOTH,expand=1)

def clear(event):
    canv.delete(ALL)
    

def paint(event):
    xc = 400
    yc = 300
    for z in range(55):
        x = rnd(50,750)
        y = rnd(50,500)
        r = 15
        color  = 'yellow'
        if (x-2*r) < xc  < (x+2*r) and  (y-2*r) < yc < (y+2*r):
            color = 'red'
        if (x-4*r) < xc  < (x+4*r) and  (y-4*r) < yc < (y+4*r):
            color = 'blue'
        if (x-8*r) < xc  < (x+8*r) and  (y-8*r) < yc < (y+8*r):
            color = 'green'
        canv.create_oval(x-r,y-r,x+r,y+r,fill=color,width=0)

canv.bind('<Button-1>',paint)
canv.bind('<Button-3>',clear)
mainloop()

One thought on “12. Принимаем решения. Оператор выбора в Python (ветвление, if)

Добавить комментарий

Ваш e-mail не будет опубликован. Обязательные поля помечены *