Цикл While. Урок 7

Основы программирования на Python

Циклы — это инструкции, выполняющие одну и туже последовательность действий, пока действует заданное условие.

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

Универсальным организатором цикла в языке программирования Python (как и во многих других языках) является конструкция while. Слово "while" с английского языка переводится как "пока" ("пока логическое выражение возвращает истину, выполнять определенные операции"). Конструкцию while на языке Python можно описать следующей схемой:

Примерное описание цикла while

Эта схема приблизительна, т.к. логическое выражение в заголовке цикла while может быть более сложным, а изменяться может переменная (или выражение) b.

Может возникнуть вопрос: "Зачем изменять a или b?". Когда выполнение программного кода доходит до цикла while, выполняется логическое выражение в заголовке, и, если было получено True (истина), выполняются вложенные выражения. После поток выполнения программы снова возвращается в заголовок цикла while, и снова проверяется условие. Если условие никогда не будет ложным, то не будет причин остановки цикла и программа зациклится. Чтобы этого не произошло, необходимо предусмотреть возможность выхода из цикла — ложность выражения в заголовке. Таким образом, изменяя значение переменной в теле цикла, можно довести логическое выражение до ложности.

Блок-схема цикла while

Эту изменяемую переменную, которая используется в заголовке цикла while, обычно называют счетчиком. Как и всякой переменной ей можно давать произвольные имена, однако очень часто используют буквы i и j. Простейший цикл на языке программирования Python может выглядеть так:

str1 = "+" 
i = 0
while i < 10:
	print (str1)
	i = i + 1

В последней строчке кода происходит увеличение значения переменной i на единицу, поэтому с каждым оборотом цикла ее значение увеличивается. Когда будет достигнуто число 10, логическое выражение i < 10 даст ложный результат, выполнение тела цикла будет прекращено, а поток выполнения программы перейдет на команды следующие за всей конструкцией цикла. Результатом выполнения скрипта приведенного выше является вывод на экран десяти знаков + в столбик. Если увеличивать счетчик в теле цикла не на единицу, а на 2, то будет выведено только пять знаков, т.к цикл сделает лишь пять оборотов.

Более сложный пример с использованием цикла:

fib1 = 0
fib2 = 1
print (fib1)
print (fib2)
n = 10
i = 0
while i < n:
	fib_sum = fib1 + fib2
	print (fib_sum)
	fib1 = fib2
	fib2 = fib_sum
	i = i + 1

Этот пример выводит числа Фибоначчи — ряд чисел, в котором каждое последующее число равно сумме двух предыдущих: 0, 1, 1, 2, 3, 5, 8, 13 и т.д. Скрипт выводит двенадцать членов ряда: два (0 и 1) выводятся вне цикла и десять выводятся в результате выполнения цикла.

Как это происходит? Вводятся две переменные (fib1 и fib2), которым присваиваются начальные значения. Присваиваются значения переменной n и счетчику i, между которыми те или иные математические отношения формируют желаемое число витков цикла. Внутри цикла создается переменная fib_sum, которой присваивается сумма двух предыдущих членов ряда, и ее же значение выводится на экран. Далее изменяются значения fib1 и fib2 (первому присваивается второе, а второму - сумма), а также увеличивается значение счетчика.

Практическая работа

  1. Напишите скрипт на языке программирования Python, выводящий ряд чисел Фибоначчи (см. пример выше). Запустите его на выполнение. Затем измените код так, чтобы выводился ряд чисел Фибоначчи, начиная с пятого члена ряда и заканчивая двадцатым.
  2. Напишите цикл, выводящий ряд четных чисел от 0 до 20. Затем, каждое третье число в ряде от -1 до -21.
  3. Самостоятельно придумайте программу на Python, в которой бы использовался цикл while.

fib1 = 0 fib2 = 1 print

fib1 = 0
fib2 = 1
print (fib1)
print (fib2)
n = 21
i = 0
while i < n:
    fib_sum = fib1 + fib2
    fib1 = fib2
    fib2 = fib_sum
    i = i + 1
    if fib_sum > 9:
       print (fib_sum)
    else:
        continue

Нужна помощь, что бы при

Нужна помощь, что бы при вводе ФИО база выдавала должность и кафедру:

import random
import sqlite3
 
conn = sqlite3.connect('example.db')
c= conn.cursor()
c.execute('DROP TABLE IF EXISTS Paladin')
c.execute('''CREATE TABLE Paladin
    (number integer, name text, name2 text, name3 text)''')
 
conn.commit()
conn.close()
conn = sqlite3.connect('example.db')
c= conn.cursor()
n=1
k=0
while k<n:
    k=k+1
    conn = sqlite3.connect('example.db')
    c = conn.cursor()
    num = input('З/П - ')
    name = int(input('ФИО - '))
    name2 = int(input('Кафедра - '))
    name3 = int(input('Должность - '))
    z = [w for w in c.execute('SELECT * FROM Paladin')]
    number = len(z)+1
    c.execute("INSERT INTO Paladin VALUES ('%i','%s','%i')"% (num, name, name2, name3))
 
name1 = input('ФИО - ')
c.execute("SELECT name FROM Paladin WHERE name2 = '%s', name3 = '%s' " % name1)
print(c.fetchone())
 
conn.commit()
conn.close()

дом работа: кодовый замок с

дом работа:
кодовый замок с тремя попытками ввода с последующей блокировкой

cod=3458 #код
m=0 #счетчик попыток
n=0
print("введите код, после третеи попытки замок заблокируется")
while m<=3:
    n=int(input()) #ввод с клавиатуры
    m=m+1
    if n==cod:
        print("open")
        break;
    if not n==cod:
        print("не верно повторите ввод")
    if m==3:
        print("lock") # число попыток превышено, замок заблокирован<code>

А как делать каждый

А как делать каждый третий?

f1 = 0
f2 = -1
n = 7
i = 0
while i < n:
    f_sum = f1 + f2
    f1 = f2
    f2 = f_sum
    i = i + 1
    print(f_sum)

i=i+3(при положительных

i=i+3(при положительных i)
i=i-3(при отриц)

я так сделал: f1 = 0 f2=

я так сделал:

f1 = 0
f2= -1
print(f2)
n = 21
i = 0
while i< n:
    f_sum = f1-3
    f1=f_sum
    i = i +3
    if f_sum>=-21:
        print (f_sum)

Напишите пожалуйста программу

Напишите пожалуйста программу в Python,нахождения сумы последовательных чисел от 1 до заданного N.

f1 = 0 f2 = 1 n = 18 i =

f1 = 0
f2 = 1
n = 18
i = 0
while i < n:
    f_sum = f1 + f2
    f1 = f2
    f2 = f_sum
    i = i + 1
    if i >= 3:
        print f_sum

Скажите, как сделать так,

Скажите, как сделать так, чтобы числа в цикле выводились не в столбик , а в строчку???

Например: >>> i = 0 >>> n =

Например:

>>> i = 0
>>> n = 10
>>> while i < n:
...   print(i, end='; ')
...   i += 1
... 
0; 1; 2; 3; 4; 5; 6; 7; 8; 9; >>>

Не работает на 2.7.11

Не работает на 2.7.11

поставить запятую: print i,

поставить запятую:

print i,

a=5 d=4 n= 0 z= 2*a x= n-1 h=

a=5
d=4
n= 0
z= 2*a
x= n-1
h= x*d
g= z+h
q= g*n
s= q/2        
while s!= 324:
        n=n+1 
        print(n)

Почему зацикливается? (При n=12 s=324)

помогите мне пожалуйста как

помогите мне пожалуйста как написать программу по этой задаче:

Цикл while. Существует четрые пользователя, у каждого пользователя есть логин и пароль. Запрашивать ввод логина и пароля пока не совпадут пара пользователь-пароль. Вывести приветствие пользователя с использованеим логина

спасибо, разобралась сама)

спасибо, разобралась сама)

Прошу не кидаться тапками и

Прошу не кидаться тапками и помочь разобраться, почему не идет программа. Буду очень благодарна

answer=input('купишь мне платье?')
answ2=answer
i=0
while answer!='da':
    print('Ответ правильный')
    i=int(input('Vitalik! Skolko deneg mozhno potratit na platie '))
   if i<=400:
    i=int(input('podumai escho '))
   else:
    print('spasibo!')
else:
    print('podumai horosho!')

Не получилось у меня сделать

Не получилось у меня сделать программу в Pynhon 2.7.3 как не пробовал - не получается (с raw_input, str и только что не пробовал).
Я занимаюсь день и это наверное первая моя программа, а тут такие сложности, что я уже думал супер косяк в коде (хотя может быть и так), но в 3.5.1 работает без проблем. В общем еще, если я ставлю "while i <= str("400")" - не работает. В общем-то работает, но при вводе 400 пишет " Подумай хорошо ", вместо " Спасибо".
Пока жесть в общем.
Сделал в Python 3.5.1

answer = input(" купишь мне платье?")
while answer != "да":
    print (" Подумай хорошо!")
    answer = input(" Купишь мне платье ? ")
print (" Ответ правильный ")
i = input(" Виталик! Сколько денег можно потратить на платье ? ")
while i < str("400") and i == str("400"):
    print (" Подумай хорошо ")
    i = input(" Виталик! Сколько денег можно потратить на платье ? ")    
print (" Спасибо!")

Блин сорри, вот я исправил,

Блин сорри, вот я исправил, этот код точно работает.
Пока еще не знаю как убрать критическую ошибку, когда мы вводим текст (в "Виталик! Сколько денег можно потратить на платье?", но скоро изучу как от этого избавляться и программа имеет место жить

answer = input(" купишь мне платье?")
while answer != "да":
    print (" Подумай хорошо!")
    answer = input(" Купишь мне платье ? ")
print (" Ответ правильный ")
i = int(input(" Виталик! Сколько денег можно потратить на платье ? "))
while i < 400 :
    print (" Подумай хорошо ")
    i = int(input(" Виталик! Сколько денег можно потратить на платье ? "))    
print (" Спасибо!")

Ну как-то так: answer=

Ну как-то так:

answer= str(input('купишь мне платье?'))
while answer!='da':
    print('podumai horosho!')
    answer=str(input('купишь мне платье?'))
    if answer=='da':
        print('Ответ правильный')
        i=int(input('Vitalik! Skolko deneg mozhno potratit na platie?: '))
        while i<=400:
            print("podumai escho!")
            i=int(input('Skolko deneg mozhno potratit na platie?: '))
            if i>400:
                print('spasibo!')

Какой командой заставить цикл

Какой командой заставить цикл работать сначала? Не просчитывая всю ветку цикла...

continue

continue

Ребят, прошу сразу не

Ребят, прошу сразу не кидаться на меня. В 25 годов решил хоть чуть приблизиться к программированию. Ни в школе, ни в универе как такого программирования не было, а если и было, то все забыто напрочь. Так вот, в практическом задании, с числами Ф, надо вывести с 5 члена по 12. В общем-то все понятно, i это сколько раз цикл крутанет, n собственно количество циклов. Как мне начать именно с 5 члена?

fib1=3 fib2=5

fib1=3
fib2=5

итерируемые объекты бывают

итерируемые объекты бывают разные - бывают уже подсчитанные, а бывают генераторы, которые и сами не знают, сколько там объектов. во втором случае, пока не запросишь первые 4, то не получишь.

а в случае списков и прочего - есть срезы

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

путь 1 - получить первые 20 чисел, записать в out, взять срез с 5 по 20:

def fib_gen():
    a, b = 0, 1
    while True:
        yield b
        a, b = b, a+b
 
fib = fib_gen()
 
out = []
for n in range(20):
    out.append(next(fib))
 
print (out)
#[1, 1, 2, 3, 5, 8, 13, 21, 34, 55, 89, 144, 233, 377, 610, 987, 1597, 2584, 4181, 6765]
 
print (out[4:])
#[5, 8, 13, 21, 34, 55, 89, 144, 233, 377, 610, 987, 1597, 2584, 4181, 6765]

тут мы получаем результат в out, а потом делаем нужный срез. out - весь список с 20 значением. out[4:] - этот же список с 5 по 20 (нумерация идёт с 0)

путь 2 - обрабатываем значения, но выводим результат только с 1 по 20:

def fib_gen():
    a, b = 0, 1
    while True:
        yield b
        a, b = b, a+b
 
fib = fib_gen()
 
# неверно записывать
#for n in range(20):
#    if n >= 4:
#        print (next(fib))
 
for n in range(20):
    out = next(fib)
    if n >= 4:
        print (out)

вообще, для запроса у генераторов нужного количества элементов есть функция islice в модуле itertools:
https://docs.python.org/3/library/itertools.html

from itertools import islice
 
def fib_gen():
    a, b = 0, 1
    while True:
        yield b
        a, b = b, a+b
 
out = islice(fib_gen(),4,20)
 
print (list(out))

весь код для python3. в python2 вместо next(элемент) используется элемент.next()

тут я поторопился, конечно :)

тут я поторопился, конечно :) весь код работает в python 2.7

Количество прокруток

Количество прокруток (итераций) цикла while i < n равно разности n - i.
Чтобы начать с 5-го элемента, надо i присвоить 5 до цикла. А n должно быть равно 12. Могут быть нюансы, связанные с

  • индексацией элементов (она начинается с 0, значит пятый элемент имеет индекс 4, т. е. i надо присвоить 4);
  • нужен или не нужен 12-й элемент (i < n или i <= n и т. п.).

name = str() while name !=

name = str()
while name != str('n') and name != str('y'):
    name = str(raw_input('Тебе нравится учить Python? введите "y" или "n"'))
if name == str('y'):
    print('Ура!')
elif name == str('n'):
    print('Жаль :(')
else:
    print('error')

Вот такой вот кодик с циклом, спасибо!

1. зачем везде напиханы str?

1. зачем везде напиханы str? в python 2 все строки по-умолчанию имеют тип str, то есть набор байт. при этом и y, и n, в этот набор байт попадают, поэтому для python2 это просто пустое преобразование. в python 3 все строки по умолчанию уникодные (тип str), а второпитоновый str - теперь bytes. поэтому опять же и 'y', str('y') - это одно и то же.

2. else: никогда не выполнится. ибо из while выход будет только тогда, когда name будет y или n

Как написать программу что бы

Как написать программу что бы при каждом прохождение while ответ записывался в новую переменную s1=, s2=, s3= и так далее.

a=int(1)
b=int(2)
c=int(10)
while a < c:
    a=a*b
    print(a)
 
# вот такой ответ. 
# s1=2
# s2=4
# s3=8
# s4=16

> Как написать программу что

> Как написать программу что бы при каждом прохождение while ответ записывался в новую переменную s1=, s2=, s3= и так далее.

зачем? это какой-то грубый хак. не проще ли использовать list или dict?

вообще, это можно сделать вот так:

cntr = 0
a=int(1)
b=int(2)
c=int(10)
while a < c:
    a=a*b
    cntr += 1
    locals()['s%s' % cntr] = a
    print(a)

но это явно пример неверно поставленной задачи

Надо использовать функцию,

Надо использовать функцию, возвращающую значение.

1. Напишите программу,

1. Напишите программу, которая предлагала бы пользователю
найти дискриминант квадратного уравнения x^2+5x-10=0. Если
пользователь напишет правильный ответ, то получит
поздравление от программы, иначе – программа сообщит ему об
ошибке.
2. Перепишите предыдущую программу так, чтобы пользователю
предлагалось решать пример до тех пор, пока он не напишет
правильный ответ.

подскажите, почему? зад.3 без

подскажите, почему?
зад.3
без i не работает?
расчет времени движения. если без i, то не получается добиться чтобы пльзователь вводил данные до момента введения положительных чисел.

s=int(input("s"))
v=int(input("v"))
t=s%v
i=0
while t<i:
    print("eще раз")
    s=int(input("s"))
    v=int(input("v"))
    t=s%v
    i=i+1
if t>0:
    print(t)

Попробуйте вот так: while 1:

Попробуйте вот так:

while 1:
    s=int(input("s"))
    v=int(input("v"))
    t=s//v
    if t > 0:
        print(t)
        break
    print("eще раз")

Хотя программу можно построить как угодно. Например, в Питоне у while есть необязательная часть else. Можно ее использовать:
s=int(input("s"))
v=int(input("v"))
t=s//v
while t<0:
    print("eще раз")
    s=int(input("s"))
    v=int(input("v"))
    t=s//v
else:
    print(t)

И % - это нахождение остатка, // - деление нацело, / - обычное деление.

a,b,c = 0,1,2 print (a) print

a,b,c = 0,1,2
print (a)
print (b)
print (c)
n = 18
i = 0
while i<n:
    s = b + c
    print (s)
    c = s
    i = i + 1

Подскажите можно ли как то записать в одной строчке команду print, так чтобы она выполнялась для всех переменных и чтобы числа при выводе результата печатались на каждой сточке?

print('%d\n%d\n%d' % (a,b,c))

print('%d\n%d\n%d' % (a,b,c))

n,i=20,1 while i<n: if

n,i=20,1
while i<n:
    if i%2==0:
        print (i)
    i+=1

a,b,n,i=0,1,20,1 while i<n:

a,b,n,i=0,1,20,1
while i<n:
    a,b=b,b+a
    i+=1
    if i>6:
        print (b)

напишите программу блок-схему

напишите программу блок-схему определяющую сколько двоек нужно умножить, чтобы получилось 128

Тут вообще разложение числа

Тут вообще разложение числа на простые множители

import sys
import math
 
def prime_factorize(n):
    factors = []
    number = math.fabs(n)
 
    while number > 1:
        factor = get_next_prime_factor(number)
        factors.append(factor)
        number /= factor
 
    if n < -1:
        factors[0] = -factors[0]
 
    return tuple(factors)
def get_next_prime_factor(n):
    if n % 2 == 0:
        return 2
    for x in range(3, int(math.ceil(math.sqrt(n)) + 1), 2):
        if n % x == 0:
            return x
 
    return int(n)
 
if __name__ == "__main__":
    if len(sys.argv) != 2:
        print("Usage: %s <integer>" % sys.argv[0])
        exit()
 
    try:
        number = int(sys.argv[1])
    except ValueError:
        print("'%s' is not an integer!" % sys.argv[1])
    else:
        print("%d -> %s" % (number, prime_factorize(number)))

Подскажите, а цикл while не

Подскажите, а цикл while не поддерживает множественное условие?
То есть, нужна такая программа: предложение ввести целое число от 1 до 3. Если пользователь ввел правильное число ( либо 1, либо 2, либо 3), то вывести сообщение типа Ура, молодец. Если неправильное - предложить ввести еще раз.
Я сначала придумал такой код, но он не работает:

number = int (input ("Введите целое число от  1 до 3"))
while number!=1 or number!=2 or number!=3:
    print ("Вы ввели неправильное число")
    number = int (input ("Введите число от  1 до 3"))
print ("Вы ввели правильное число!")

Если оставить только 1 условие (проверка равенства только одному числу), то программа работает. А при нескольких условиях не работает.

Я решил задачу по-другому, но хотелось бы узнать, действительно ли нельзя задать несколько условий или я просто делаю какую-то ошибку.
Спасибо

Программа работает

Программа работает неправильно, потому что если, например, ввести число 2, то уже проверка number!=1 дает True и все остальное условие проверять необязательно.

Условия при while могут быть такими (на выбор):

  • number not in (1,2,3)
  • not(0 < number < 4)

Спасибо за ответ. Не знал

Спасибо за ответ.
Не знал такие варианты решения моей задачи. Странно, что на данном сайте в разделе Логические операторы ничего не сказано насчет оператора not. Также смотрел по другим учебникам, везде в разделах Цикл while приводят примеры только с операторами больше, меньше, равно, не равно... По поводу not и not in ничего не сказано...
Теперь вот так выглядит код работающей программы

number = int(input ("Введите целое число от 1 до 3:  "))
while number not in (1,2,3):
   print ("Вы ввели неправильное число")
   number = int(input ("Введите целое число от 1 до 3:  "))
print ("УРА!")

Для Питона 3.3.2. код в уроке

Для Питона 3.3.2. код в уроке будет таким:

fib1=0
fib2=1
n=10
i=0
while i<n:
    fib_sum=fib1+fib2
    fib1=fib2
    fib2=fib_sum
    i=i+1
    print (fib_sum)
input ()

Так годится? fib1 = 0 fib2 =

Так годится?

fib1 = 0
fib2 = 1
n = 1
i = 0
while n <=18:
    fib_sum = fib1 + fib2
    fib1 = fib2
    fib2 = fib_sum
    n = n + 1
    i = i + 1
    if i >= 3:
        print fib_sum

Всем привет! Подскажите,

Всем привет! Подскажите, пожалуйста, почему код:

chet = 0
max = 20
while chet < max:
   if (chet / 2 == 0):
      print (chet)
   chet = chet + 1

выдаёт

0
1

а не список четных чисел до 20?

Потому что условие If

Потому что условие If является истинным только для первых двух чисел из списка от 0 до 20.)

Ошибка в выражении chet /

Ошибка в выражении

chet / 2

Вы делите число на 2, а должны находить остаток от деления на 2. Остаток находится операцией %. Т.е. выражение должно быть таким:
chet % 2

неправильное сложение то ли в

неправильное сложение то ли в цикле while, то ли в самом питоне 3,3
скрипт для подбора значений(нужно было подобрать цену, что бы получилось ровное количество товара(товар не может быть с десятыми, а цена с тысячными)

z=236000
x=24.00
while x<=26:
    print(x,'\t', z/x)
    x=x+0.01

вырезка из результатов ответа:

...
24.0 	 9833.333333333334
24.01 	 9829.23781757601
24.020000000000003 	 9825.145711906744
24.030000000000005 	 9821.057012068246
24.040000000000006 	 9816.971713810313
24.050000000000008 	 9812.889812889809
24.06000000000001 	 9808.811305070652
24.07000000000001 	 9804.7361861238
24.080000000000013 	 9800.664451827237
...

почему х принимает такие странные значения

как закончить цикл на

как закончить цикл на определенном этапе?