Цикл for в языке программирования Python. Урок 12

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

В седьмом уроке был рассмотрен цикл while. Однако это не единственный способ организации в языке Python повторения группы выражений. В программах, написанных на Питоне, широко применяется цикл for, который представляет собой цикл обхода заданного множества элементов (символов строки, объектов списка или словаря) и выполнения в своем теле различных операций над ними. Например, если имеется список чисел, и необходимо увеличить значение каждого элемента на две единицы, то можно перебрать список с помощью цикла for, выполнив над каждым его элементом соответствующее действие.

>>> spisok = [0,10,20,30,40,50,60,70,80,90]
>>> i = 0
>>> for element in spisok:
	spisok[i] = element + 2
	i = i + 1
 
>>> spisok
[2, 12, 22, 32, 42, 52, 62, 72, 82, 92]
>>>

В примере переменная i нужна для того, чтобы записать изменившееся значение элемента в список. В ней хранится значение индекса очередного элемента списка. В то время, как переменная element связывается со значением очередного элемента данных. В заголовке цикла for происходит обращение очередному элементу списка. В теле цикла элементу с индексом i присваивается сумма значения текущего (обрабатываемого) элемента и двойки. Далее индекс увеличивается на единицу, а поток выполнения программы переходит снова в заголовок цикла for, где происходит обращение к следующему элементу списка. Когда все элементы обработаны цикл for заканчивает свою работу. Отсутствие очередного элемента является условием завершения работы цикла for (для сравнения: в цикле while условием завершения служит результат false логического выражения в заголовке). Еще один момент: если счетчик не увеличивать на единицу (выражение i = i + 1), то не смотря на то, что все элементы списка будут обработаны, результат все время будет присваиваться первому элементу списка (с индексом 0).

С таким же успехом перебирать можно и строки, если не пытаться их при этом изменять:

>>> stroka = "привет"
>>> for bukva in stroka:
	print(bukva, end=' * ')
 
 
п * р * и * в * е * т * 
>>>

Цикл for используется и для работы со словарями:

>>> d = {1:'one',2:'two',3:'three',4:'four'}
>>> for key in d:
	d[key] = d[key] + '!'
 
>>> d
{1: 'one!', 2: 'two!', 3: 'three!', 4: 'four!'}
>>> 

Цикл for широко используется в языке программирования Python, т.к. является важным инструментом при обработки структур данных. Также следует запомнить, что цикл for в Питоне особенный. Он не является аналогом циклов for во многих других языках программирования, где представляет собой, так называемый, цикл со счетчиком.

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

  1. Создайте список, состоящий из четырех строк. Затем, с помощью цикла for, выведите строки поочередно на экран.
  2. Измените предыдущую программу так, чтобы в конце каждой буквы строки добавлялось тире. (Подсказка: цикл for может быть вложен в другой цикл.)
  3. Создайте список, содержащий элементы целочисленного типа, затем с помощью цикла перебора измените тип данных элементов на числа с плавающей точкой. (Подсказка: используйте встроенную функцию float().)

Пример выполнения практической работы

>>> # задание 1
>>> list1 = ['hi','hello','good morning','how do you do']
>>> for i in list1:
	print(i)
 
hi
hello
good morning
how do you do
>>> # задание 2
>>> for i in list1:
	for j in i:
		print(j,end='.')
	print()
 
 
h.i.
h.e.l.l.o.
g.o.o.d. .m.o.r.n.i.n.g.
h.o.w. .d.o. .y.o.u. .d.o.
>>> # задание 3
>>> list2 = [56,78,45,23]
>>> i = 0
>>> for a in list2:
	list2[i] = float(a)
	i = i + 1
 
>>> list2
[56.0, 78.0, 45.0, 23.0]
>>> 

Почему пайтон просто не

Почему пайтон просто не выполняет этот код, даже ошибки не выдаёт!

i=1
while i>99:
    print(325*i)
    i=i+1

while i < 99

while i < 99

Потому что условие вашего

Потому что условие вашего цикла "пока i больше 99", но i равно 1, вероятно, вы хотели написать "пока i меньше 99" – "while i < 99:", тогда бы ваш код работал. Ошибки нет, просто условие не выполняется

знак перепутали. нужно: while

знак перепутали.
нужно: while i<99:

При первом же проходе

При первом же проходе получаем, что условие выполнения тела цикла 1>99. Условие ложно, соответственно, из цикла выходим.

Необходимо заменить > на <, и все будет хорошо.

i=1
while i<99:
print(325*i)
i=i+1

Потому что условие i>99

Потому что условие i>99 никогда не выполняется, и это не ошибка

Потому что Ваше условие не

Потому что Ваше условие не предполагает выполнения ни одной итерации.
"Пока i больше 99 делать что-то"
Поменяйете знак "больше" (>) на знак "меньше" (<) и все заработает

Переменная i содержит

Переменная i содержит значение, которое меньше значения условия. i=1, а условие цикла i>99, тоесть i<99. Если i поставить 100, например, цикл заработает, но будет бесконечным, так как i с каждым разом будет увеличиватся на 1(101,102,103...) и всегда будет больше 99, что в условии цикла. Если написать i<99, цикл сработает при i=1, так как i в данном случае будет меньше 99, тоесть условие цикла будет истинно. Это будет продолжаться пока i не станет 98. Работа цикла прекратится.

i<99

i<99

Потому что ты задал условие -

Потому что ты задал условие - если i > 99 то выдай результат 325 * i
У тебя i < 99

Здравствуйте, пытаюсь понять

Здравствуйте, пытаюсь понять основы с полного нуля. Поэтому может вопросы будут глупыми. Но все-таки прошу помочь разобраться:
Установил Питон 2.7.9
работаю со списками. Не могу понять, почему так происходит:
1 пример:

>>> spisok = [0,10,20,30,40,50,60,70,80,90]
>>> for element in spisok:
	spisok = element + 2
 
>>> spisok
92

Почему выводит только последний елемент, а не весь список?
2 пример:
>>> sp
['1enot', '2barsuk', '3exh', '4sobaka']
>>> for el in sp:
	print el,'-'
 
1enot -
2barsuk -
3exh -
4sobaka - # здесь вроде все понятно, выводится то, что и предполагалось

Дальше пробую экспериментировать - ставлю

>>> for el in sp:
	print b,'-'
 
 
a -
a -
a -
a - # здесь уже не могу понять что это за буква "а", откуда она взялась. Дальше, если вместо print b,'-'     задаю 
print а,'-' или print с,'-' или print х,'-' получаю Error. Почему с "b" так не происходит?
 
>>> for el in sp:
	print x,'-'
 
 
 
Traceback (most recent call last):
  File "<pyshell#31>", line 2, in <module>
    print x,'-'
NameError: name 'x' is not defined

Заранее спасибо!

В первом примере должен быть

В первом примере должен быть счетчик элементов. Иначе вы присваиваете переменной spisok каждый раз новое значение:

i = 0
for element in spisok:
    spisok[i] = element + 2
    i = i + 1

В третьем случае скорее всего переменной b что-то было присвоено ранее.

Не очень понимаю цикл "for".

Не очень понимаю цикл "for".

>>> spisok = [0,10,20,30,40,50,60,70,80,90]
>>> i = 0
>>> for element in spisok:
	spisok[i] = element + 2
	i = i + 1
 
>>> spisok
[2, 12, 22, 32, 42, 52, 62, 72, 82, 92]

Мы указываем переменную element, но не присваиваем ей значение.

В питоне особый цикл "для",

В питоне особый цикл "для", его смысл отличается от того, что используется в большинстве других языков программирования.
Дословно цикл "для" в питоне можно перевести так: для каждого_элемента в этом_списке сделать то-то и то-то. Поэтому переменной каждый_элемент на каждой итерации цикла присваивается очередной элемент из заданного списка.
В данном случае на первой итерации переменная element была равна 0, на второй - 10, на третьей - 20 и так далее. Когда все элементы обработаны, цикл "для" завершает работу. Переменная i здесь к циклу никакого отношения не имеет. Она нужна лишь, чтобы обращаться к нужным ячейкам списка для записи нового значения. Потому как цикл извлекает значение element (например, 80), но он "не знает" его индекса (8). Переменная i как раз введена, чтобы "считать" индекс.

>>> spisok =

>>> spisok = [0,10,20,30,40,50,60,70,80,90]
>>> i = 0
>>> for element in spisok:
	spisok[i] = element + 2
	i = i + 1
 
>>> spisok
[2, 12, 22, 32, 42, 52, 62, 72, 82, 92]
>>>
 # Можно же было сделать легче или я чего-то не понял ?
spisok = [0,10,20,30,40,50,60,70,80,90]
for element in spisok :
    print (element+2)

Отличие примера и вашего

Отличие примера и вашего варианта будет лишь в том, что в первом случае значение каждого элемента списка будет изменено реально (переприсвоено):
    spisok[i] = element + 2
а во втором случае список останется неизменным, будет лишь вывод новых значений:
    print (element+2)
которые не сохранятся в программе.

создать список и вставить все

создать список и вставить все буквы s после буквы о.
Как ето зделать ?

Не пойму, откуда в результате

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

>>> sp
['1enot', '2barsuk', '3exh', '4sobaka']
>>> for elem in sp:
	for bukva in elem:
		print bukva,'-',
	print
 
 
1 - e - n - o - t -
2 - b - a - r - s - u - k -
3 - e - x - h -
4 - s - o - b - a - k - a -
>>> 

по умолчанию стоит sep = " ",

по умолчанию стоит sep = " ", т.е. каждый элемент строки отделяется пробелом. Если задать дополнительно:
print (..., sep = ''), то пробелов не будет. (синтаксис Python 3.х)

есть "убиратель" умолчальных

есть "убиратель" умолчальных пробелов sep=''
у вас питон 2,6, для 3 и выше

print(bukva,'-',sep='', end='')

потому что в принте запятая,

потому что в принте запятая, если нужно без пробела, то надо bukva + '-'

Эмм... Помогите написать

Эмм... Помогите написать программу которая разлагает число на множители. Jabber ID: dmarkov50@gmail.com или в комментарии

Разложение числа на простые

Разложение числа на простые множители:

n = int(input())
a = []
while n > 1:
    i = 2
    while 1:
        if n%i==0:
            a.append(i)
            n = n // i
            break
        else:
            i += 1
print(a)

>>> spisok =

>>> spisok = [0,10,20,30,40,50,60,70,80,90]
>>> for element in range(len(spisok)):
	spisok[element] = spisok[element] + 2

Думаю, что так лаконичнее.

Можно и так: >>> spisok =

Можно и так:

>>> spisok = [0,10,20,30,40,50,60,70,80,90]
>>> spisok = [element+2 for element in spisok]

Через генератор классно

Через генератор классно получается.

>>> sp ['hi', 'hello',

>>> sp
['hi', 'hello', 'goodday']
>>> i,j = 0,0
>>> while i != len(sp):
	elem = sp[i] #здесь переход на след. элемент списка
	while j != len(elem):
		print(elem[j],end = '*') # вывод каждого символа элемента + '*'
		j += 1 # переход на след. символ
	i += 1
	print()
 
 
h*i*
l*l*o*
a*y*
>>> 

Не могу понять почему не работает?

переменную j зануливай перед

переменную j зануливай перед непосредственным использованием - внутри внешнего цикла

j обнуляй не перед внешним

j обнуляй не перед внешним циклом, а перед непосредсвенным его использованием

'j' обнуляй в теле первого

'j' обнуляй в теле первого цикла while! А не до его выполнения. Он же заряжается в первом прогоне и становится двойкой (от этого 'l*l*o*' получилось). А после второго прогона вообще пятеркой является.
Если бы элементы списка у тебя не возрастали по количеству знаков - ты бы вообще второй и третий элемент в принте не увидел.
P.S.На счет обнуления переменных счетчиков есть анекдот:
сидит программист в кафе - думку-думает. Почему код не работает?
подходит официантка. Ей очень понравился программист и она ему говорит:
"кстати, если тебе интерестно, меня зовут Оля"
Программист - "а если мне не интерестно"
Официантка, обиженно - "а если не интерестно - то НИКАК не зовут!"
Тут программист бьет себя по лбу и радостно кричит - "точно! счетчик надо обнулить!"

Первый пример можно

Первый пример можно реализовать с помощью while

spisok = [0,10,20,30,40,50,60,70,80,90]
i=0
 
while i < len(spisok):
	spisok[i] += 2
	i += 1
 
print (spisok)
 
>>> [2, 12, 22, 32, 42, 52, 62, 72, 82, 92]

Вывод - for не нужен.
Вы можете привести пример где нужен for.

Цикл while в питоне

Цикл while в питоне существенно медленнее, чем for. поэтому вопрос стоит иначе - приведите пример, где нужен именно while, а не for. вопрос риторический, если чо.

Кое как справился с заданием,

Кое как справился с заданием, про версии надо было отдельно упомянуть, большинство здесь наверное работает именно в 2.x

theCure = ['boys don\'t cry', 'pictures of you', 'a forest', 'homesick']
for songs in theCure:
    for letters in songs:
        print(letters + '.'),
    print('')

Ух ты, удивительно тут The

Ух ты, удивительно тут The Cure увидеть)

Поясните пожалуйста .Вот

Поясните пожалуйста .Вот пример какой вы приводили

>> spisok = [0,10,20,30,40,50,60,70,80,90]
>>> i = 0
>>> for element in spisok:
	spisok[i] = element + 2
	i = i + 1

Всё работает.А если код такой

>> spisok = [0,10,20,30,40,50,60,70,80,90]
>>> i = 1
>>> for element in spisok:
	spisok[i] = element + 2
	i = i + 1

или же

>> spisok = [0,10,20,30,40,50,60,70,80,90]
>>> i = 0
>>> for element in spisok:
	spisok[i] = element + 2
	i = i + 2

то вылетает ошибка.Я так и не понял почему

Вы видите такое сообщение об

Вы видите такое сообщение об ошибке:

IndexError: list assignment index out of range

Оно говорит о том, что обращение к элементу списка по индексу не верно, индекс вышел за границы диапазона.
В данном коде индексом служит переменная i. Индексация элементов структур (строк, списков и др.) в Python начинается с нуля.

Во втором коде i изначально присвоено 1, и когда она первый раз используется в цикле, то указывает на число 10. Но переменая element содержит первый элемент списка - 0. В результате выражение spisok[i] = element + 2 приводит к тому, что на место числа 10 в списке записывается 2 (0+2).
Когда цикл доходит до последней итерации, где в element = 90, переменная i в этот момент уже равна 10. Но в списке нет элемента с индексом 10. Поэтому и ошибка.

Добрый день, ни как не могу

Добрый день, ни как не могу понять как работает цикл. Пишите что [Во втором коде i изначально присвоено 1, и когда она первый раз используется в цикле, то указывает на число 10.] Каким образом получается 10? Вчера с другом сидели до ночи, так и не поняли!

В Питоне цикл for - это не

В Питоне цикл for - это не цикл со счетчиком, как в других языках. В конструкции типа

for i in a:
   ....

i есть очередной элемент из a. При первом проходе первый, при втором второй и т. д. Если первый элемент в a равен 10, то i при первом проходе равен 10.

Что такое end ? как оно

Что такое end ? как оно работает, не понимаю

End - это необязательный

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

По умолчанию функция print() после того как выведет значение, осуществляет переход на новую строку. Если написать так:

print(j,end='.') 

, то перехода на новую строку не произойдет. В конце вывода будет поставлена точка.

Указание дополнительных примеров

А если мне нужно сделать бесконечный цикл?
А если мне нужно сделать цикл сто раз?
Что я буду сто раз вбивать (0,1,2,3)?

Почему эти примеры не указаны?

)

Для бесконечного цикла обычно используется цикл while, а не for. Например, вот программа с ошибкой (не изменяется значение переменной a), приводящая к зацикливанию:

a = 1
while a != 0:
    print('hi')

Можно еще проще. Любое константное значение, не равное нулю, интерпретируется как true. Поскольку изменить константу нельзя, то цикл не может прервать своего выполнения:

while 1:
    print('hi')

А вот цикл "вечный бездельник":

while 1:
    pass

Инструкция pass ничего не делает, но цикл постоянно работает.

Если нужно прокрутить цикл определенное количество раз, можно использовать функцию range. Например:

for i in range(100):
	print(str(i) + '!',end=' ')

проблема с end=' * '

Не получается вывод в строку

for bukva in stroka:
	print(bukva, end=' * ')

Я так понимаю это от того, что у меня установлен версия 2.7, а не 3.0. Что делать то?

for bukva in stroka: print

for bukva in stroka:
	print bukva + ' * ',

Обратите внимание на запятую в конце инструкции print. Именно она запрещает переход на новую строку в python2.x

Обратите внимание на запятую в конце инструкции print. PS."Влад"

А что необходимо добавить вместо запятой в версии Python 3.2.2?

version 2.7

for bukva in stroka:
	print bukva + ' * ',

version 3.2

for bukva in stroka:
	print (bukva + ' * '), #а вот запятая ничего не делает что внутри что снаружи

Чтобы функция print() не

Чтобы функция print() не создавала новую строку, надо использовать параметр end с любым строковым значением, например пробелом:

for i in range(10):
   print(i, end=' ')

Результат:

0 1 2 3 4 5 6 7 8 9 

А в последнем задании...

А в последнем задании... зачем
 list2[i] = float (a) ?
Можно ведь

 
for a in list2:
  print float(a)

У меня такой же результат получился...
Ведь цикл начинает обход с [s]первого[/s] нулевого элемента. и кому-нибудь помочь
А при необходимости указания начала обхода можно задать срез в заголовке цикла. (for a in list2[1:] - со второго элемента списка)
З.ы. столько вопросов было.. пока писал, все решил)
извините, что умничаю) Пытаюсь закрепить знания )

Между этим кодом list =

Между этим кодом

list = [34,11,78,52,12]
i = 0
for a in list:
    list[i] = float(a)
    i = i + 1

и вот этим

list = [34,11,78,52,12]
i = 0
for a in list:
    print (float(a)) # скобки, т.к. у меня 3-я версия python

разница есть.

В первом случае список list меняется, т.е. там уже будет содержаться [34.0, 11.0, 78.0, 52.0, 12.0]. Во втором случае list не изменяется, измененные значения просто выводятся на экран и не сохраняются в программе. Бывает, что это как раз и требуется. Все зависит от ситуации.

Вопрос к уроку 12

1.    x = [0, 10, 20, 30, 40, 50, 60, 70, 80, 90]
2.    i = 0
3.    for y in x:
4.        x[i] = y + 2
5.        i = i + 1

Помогите, пожалуйста, разобраться:
1. Создаем список и связываем его с x
2. Определяем переменную i как числовую и равную 0
3. Для каждого y в списке x сделать:
4. Элемент i списка x равен y + 2
5. Увеличиваем i = i +1

Переменная y нигде не задается, как так? Момент с этой переменной больше всего и непонятен, если честно.

Переменная i это положение члена списка, поэтому заранее и задали 0, чтобы начать с первого?

После for ставится переменная

После for ставится переменная (любая), которая при каждой итерации (обороте цикла) ссылается на очередной элемент последовательности (списка, в данном случае). Переменные в Python не объявляются в принципе. Они только обязательно должны связаны с каким-нибудь значением (ссылаться на него). В цикле for переменная y как раз связывается с очередным элементом последовательности. Она не "пустая" как может показаться.
Другой пример:

for letter in 'abcd':
    print(letter)

При первой итерации letter = 'a', при второй letter = 'b' и т.д.

"Переменная i это положение члена списка, поэтому заранее и задали 0, чтобы начать с первого?"
Да. Индексация в Питоне начинается с нуля.
В данном случае переменная-индекс необходима, т.к происходит изменение списка. Если этого не требуется, то она не нужна. Например, надо посчитать сумму элементов и сохранить ее в другой переменной, а список не менять:

x = [4, 6, 23, 534, 23, 98]
sum = 0
for num in x:
    sum = sum + num
 
print(x)
print(sum)

Здесь переменная sum равна 0 по причине того, что она должна быть связана с каким-нибудь значением, чтобы затем в ней можно было сохранить сумму. Она не обозначает индекс и не обязательно изначально должна быть равна нулю.