Цикл for та функція range


Цикл for та функція range

Наступним розглянемо цикл із параметром під назвою for. 

Оскільки це цикл із параметром, то основне його використання припадає на завдання повторення послідовності дій вказану кількість разів. Загальний синтаксис циклу for має такий вигляд:

for [змінна] in [послідовність]:
    [код]

Отже, ознайомившись із синтаксисом циклу for, давайте на прикладі розглянемо його застосування.

Введемо:

for i in 3,4,5:
    print(i)

Запустимо код (відео 1):

Відео 1 

Як бачимо, змінна «і» створюється прямо в конструкції циклу й набуває лише тих значень, які є в послідовності. Але якщо вона створюється в конструкції, може, вона й існує лише в ній? Перевіримо це, вивівши змінну на екран уже після циклу:

for i in 3,4,5:
    print(i)
print(i)

Маємо (відео 2):

Відео 2

Як бачимо, створена в конструкції циклу for, змінна і далі існує після завершення його роботи.

Робота з числами, звісно, цікава, та розгляньмо можливості циклу for графічно, для чого імпортуємо знайому бібліотеку turtle. Нарисуємо три квадрати, кожен із яких повернутий один відносно іншого на 20 градусів (відео 3).

Відео 3

Код виходить доволі довгим, а ми нарисували поки що лише три фігури. Уявіть, що було б, якби їх були тисячі.

Тепер погляньте, яким коротесеньким стане код, якщо використовувати цикл for:

import turtle
turtle.shape("turtle")
turtle.speed(2)
turtle.pensize(3)
for i in 1,2,3:
    turtle.left(20)
    turtle.forward(40)
    turtle.left(90)
    turtle.forward(40)
    turtle.left(90)
    turtle.forward(40)
    turtle.left(90)
    turtle.forward(40)
    turtle.left(90)

Запустимо його (відео 4):

Відео 4

Черепашка нарисувала те саме, але код тепер набагато коротший.

У рядку "for i in 1,2,3:" ми вставили послідовність із трьох чисел, щоби тіло циклу виконалося три рази. Але якщо треба нарисувати, наприклад, 100 квадратів, робота з циклом буде не настільки простою. Тільки уявіть, скільки часу займе прописування 100 чисел. Впоратись із цим допоможе функція range(). Вона створена саме для генерації послідовностей. Перший аргумент функції вказує на початкове значення, другий — на значення, що на одиницю більше за останнє, третій — на крок послідовності, тобто на яке число відрізнятиметься наступне число від попереднього. За замовчуванням перший аргумент має нульове значення, а третій — одиниця. Запишемо:

for i in range(5):
    print(i)

Передавши як аргумент число 5, отримаємо (відео 5):

Відео 5

А тепер передамо в range() усі три аргументи:

for i in range(1,11,3):
    print(i)

Отримаємо (відео 6):

Відео 6

Як бачимо, у цьому випадку послідовність почалась із числа 1 й мала крок 3.

Використаємо новий інструмент для черепашкової графіки:

import turtle
turtle.shape("turtle")
turtle.speed(200)
turtle.pensize(3)
for i in range(18):
    turtle.left(20)
    turtle.forward(40)
    turtle.left(90)
    turtle.forward(40)
    turtle.left(90)
    turtle.forward(40)
    turtle.left(90)
    turtle.forward(40)
    turtle.left(90)

Запустимо код (відео 7):

Відео 7

Спробуємо ускладнити:

import turtle
turtle.shape("turtle")
for i in range(30):
    turtle.circle(5 * i)
    turtle.circle(-5 * i)
    turtle.left(i)

Отримаємо (відео 8):

Відео 8

Не зважаючи на те, що функція range() генерує послідовності з певним кроком, цикл for може працювати з будь-якими, навіть випадковими, послідовностями (відео 9):

Відео 9

Отже, з послідовностями та їх застосуванням у циклі for ознайомились, але як цей цикл працює з масивами даних? Виявляється, for дуже зручний для роботи з ітерованими даними. Наприклад:

list_1 = ["one","two",'three']
for i in list_1:
    print(i)

Результат (відео 10):

Відео 10

У цьому випадку під час роботи циклу, змінній «і» присвоюється значення елемента списку. Оскільки елементами списку є рядки, можна пройтися ними циклом for:

list_1 = ["one","two",'three']
for i in list_1:
    print(i)
    for m in i:
        print(m)

Запустимо код (відео 11):

Відео 11

Аналогічно можна працювати й з елементами в множинах. Таза роботи зі змінюваними типами даних необхідно бути обережними, бо можна створити нескінченний цикл:

list_1 = [1]
for i in list_1:
    list_1.append(i)
    print(list_1)

Та отримати (відео 12):

Відео 12

Завдяки циклу for операції зі словниками виходять на новий рівень. Запишемо:

dict_1 = {"phone":"Iphone", "laptop":"Macbook", "car": "Tesla"}
print("---Keys---")
for key in dict_1.keys():
    print(key)
print("")
print("---Values---")
for value in dict_1.values():
    print(value)
print("")
print("---Items---")
for key, item in dict_1.items():
    print(key, item)

Результат (відео 13):

Відео 13

Як бачимо, тепер можна окремо працювати з усіма ключами, значеннями та, навіть парами «ключ» : «значення».

Черепашки-ніндзя повертаються

Із сьогоднішнього репортажу Ейпріл о'Ніл стала відома неприємна новина, яка сколихнула увесь світ, все живе під загрозою — Шредер повернувся. А це означає, що черепашки-ніндзя вже давно продумують план із ліквідації цієї загрози. 

Наше ж завдання — розробити гру та разом із ними відправитися на пошуки загрози.

xVH9Y2eAhenspNLwoxxaA-wTRZudvt9W
Малюнок 1

Якомога швидше перейдемо до розробки, адже зло поспішає втілити власний план. 

Імпортуємо модулі random і turtle. З першого імпортуємо функцію randint(), з другого — усе, скориставшись зірочкою (*). Спершу перетворимо стрілку на черепаху. Тепер створимо список, який буде характеризувати головних героїв, вміщаючи в собі назви кольорів пов'язок:

from turtle import *
from random import randint
shape("turtle")
colors = ["blue", "red", "orange", "purple"]

Далі створимо змінну для самого Шредера та присвоїмо їй випадкове значення від одиниці до десяти, тим самим реалізувавши регулярні переміщення злодія. Створимо змінну, у якій зберігатимемо результат вибору користувача і, яка змінюватиметься з кожним кроком гравця. Оскільки набувати значення вона має в процесі гри, задамо їй нульове значення. 

Додамо:

shredder = randint(1,10)
user_choose = 0

Тепер, коли базові дані готові, реалізуємо логіку гри. Оскільки гра триватиме, доки команда не знайде Шредера, необхідно помістити логіку всередину циклу while, умовою виходу з якого буде рівність змінних shredder і user_choose. Додамо:

while user_choose != shredder:

Оскільки у нас завдання пошуку, треба запитати у користувача, в яку сторону має йти група. Для цього скористаємось функцією input(), яку присвоїмо змінній user_choose. Щоби користувач розумів правила гри, всередину input() додамо рядок із підказкою для вводу:

user_choose = input("select direction Left/Right/Direct/Back - ")

Додамо стійкості програмі, звівши введений користувачем рядок до нижнього регістру:

from turtle import *
from random import randint
shape("turtle")
colors = ["blue", "red", "orange", "purple"]
shredder = randint(1,10)
user_choose = 0
while user_choose != shredder:
    user_choose = str.lower(input("select direction Left/Right/Direct/Back - "))

Отримавши команду left, група має відправитися ліворуч, right — праворуч, direct — прямо, а back — у протилежний бік. Оскільки маємо умову, скористаємося конструкцією if:

while user_choose != shredder:
    user_choose = str.lower(input("select direction Left/Right/Direct/Back - "))
    if user_choose == str.lower("left"):
        left(90)
    elif user_choose == str.lower("right"):
        right(90)
    elif user_choose == str.lower("direct"):

    elif user_choose == str.lower("back"):
        left(180)

З напрямком розібрались, тож необхідно додати рух. Для цього скористаємось циклом for і списком colors, адже кожна з черепах пройде свій шлях. На цьому шляху вони можуть зустріти перешкоди, отже, довжина й ширина шляху буде випадковою:

from turtle import *
from random import randint
shape("turtle")
colors = ["blue", "red", "orange", "purple"]
shredder = randint(1,10)
user_choose = 0
while user_choose != shredder:
    user_choose = str.lower(input("select direction Left/Right/Direct/Back - "))
    if user_choose == str.lower("left"):
        left(90)
        for color_turtle in colors:
            pensize(randint(1,10))
            color(color_turtle)
            forward(randint(5,30))

    elif user_choose == str.lower("right"):
        right(90)
        for color_turtle in colors:
            pensize(randint(1,10))
            color(color_turtle)
            forward(randint(5,30))

    elif user_choose == str.lower("direct"):
        for color_turtle in colors:
            pensize(randint(1,10))
            color(color_turtle)
            forward(randint(5,30))

    elif user_choose == str.lower("back"):
        left(180)
        for color_turtle in colors:
            pensize(randint(1,10))
            color(color_turtle)
            forward(randint(5,30))

Запустимо код, щоби перевірити як він працює (відео 14):

Відео 14

Група вже рухається, та після руху маємо перевірити місцевість на присутність антагоністу. Отже, після циклу for, залишаючись всередині конструкції if та elif, переприсвоїмо значення змінної user_choose на випадкове. За умови співпадіння зі змінною shredder, цикл завершить свою роботу і гравець переможе. Тоді після циклу while необхідно вивести на екран рядок "Shredder here!":

from turtle import *
from random import randint
shape("turtle")
colors = ["blue", "red", "orange", "purple"]
shredder = randint(1,10)
user_choose = 0
while user_choose != shredder:
    user_choose = str.lower(input("select direction Left/Right/Direct/Back - "))
    if user_choose == str.lower("left"):
        left(90)
        for color_turtle in colors:
            pensize(randint(1,10))
            color(color_turtle)
            forward(randint(5,30))
        user_choose = randint(1,10)
    elif user_choose == str.lower("right"):
        right(90)
        for color_turtle in colors:
            pensize(randint(1,10))
            color(color_turtle)
            forward(randint(5,30))
        user_choose = randint(1,10)
    elif user_choose == str.lower("direct"):
        for color_turtle in colors:
            pensize(randint(1,10))
            color(color_turtle)
            forward(randint(5,30))
        user_choose = randint(1,10)
    elif user_choose == str.lower("back"):
        left(180)
        for color_turtle in colors:
            pensize(randint(1,10))
            color(color_turtle)
            forward(randint(5,30))
        user_choose = randint(1,10)
print("Shredder here!")

Але якщо змінні не будуть збігатися, виведемо на екран сповіщення, що Шредера не було знайдено й необхідно рухатися далі. Для цього в кожній конструкції if та elif додамо по ще одній конструкції if, які перевіряють змінні user_choose і shredder

Готова програма:

from turtle import *
from random import randint
shape("turtle")
colors = ["blue", "red", "orange", "purple"]
shredder = randint(1,10)
user_choose = 0
while user_choose != shredder:
    user_choose = str.lower(input("select direction Left/Right/Direct/Back - "))
    if user_choose == str.lower("left"):
        left(90)
        for color_turtle in colors:
            pensize(randint(1,10))
            color(color_turtle)
            forward(randint(5,30))
        user_choose = randint(1,10)
        if user_choose!= shredder:
            print("Shredder is not here, let's move on")
    elif user_choose == str.lower("right"):
        right(90)
        for color_turtle in colors:
            pensize(randint(1,10))
            color(color_turtle)
            forward(randint(5,30))
        user_choose = randint(1,10)
        if user_choose!= shredder:
            print("Shredder is not here, let's move on")
    elif user_choose == str.lower("direct"):
        for color_turtle in colors:
            pensize(randint(1,10))
            color(color_turtle)
            forward(randint(5,30))
        user_choose = randint(1,10)
        if user_choose!= shredder:
        print("Shredder is not here, let's move on")
    elif user_choose == str.lower("back"):
        left(180)
        for color_turtle in colors:
            pensize(randint(1,10))
            color(color_turtle)
            forward(randint(5,30))
        user_choose = randint(1,10)
        if user_choose!= shredder:
        print("Shredder is not here, let's move on")
print("Shredder here!")

Час перевірити гру, зігравши в неї (відео 15):

Відео 15

Отже, сьогодні ми розглянули цикл for та ознайомилися з його можливостями, а отримані знання використали, щоби зупинити Шредера.