# Отчет по теме 5 ## 1. Запуск интерактивной оболочки IDLE. ## 2. Ветвление по условию – управляющая инструкция if. - Операции определения значения dohod: ``` >>>porog = 5 >>>rashod1 = 8 >>>rashod2 = 6 >>>if rashod1 >= porog: dohod = 12 if rashod1 >= porog: dohod = 12 elif rashod2 == porog: dohod = 0 else: dohod = 8 >>>print(dohod) # Выполним операцию для двух случаев >>>rashod2 = 4 >>>if rashod1 >= 3 and rashod2 == 4: dohod = rashod1 if rashod2 == porog or rashod1 < rashod2: dohod = porog >>>print(dohod) 8 # Выполнилось одно условие >>>porog = 4 >>>if rashod1 >= 3 and rashod2 == 4: dohod = rashod1 if rashod2 == porog or rashod1 < rashod2: dohod = porog >>>print(dohod) 4 # Выполнились оба условия ``` - Операция с множественным ветвлением линий потока: ``` >>>if porog == 3: # Не подходит dohod = 1 elif porog == 4: # Подходит dohod = 2 elif porog == 5: # Игнорируется dohod = 3 else: # Игнорируется dohod = 0 >>>print(dohod) 2 ``` - Инструкции, записывающиеся в одну строку в операторе присваивания. <Объект>=<значение 1> if <условие> else <значение 2> ``` >>>dohod = 2 if porog >- 4 else 0 >>>print(dohod) 2 >>>if porog >= 5: rashod1 = 6; rashod2 = 0 # porog = 4 >>>print(rashod1) 8 >>>print(rashod2) 4 >>>porog = 6 >>>if porog >= 5: rashod1 = 6; rashod2 = 0 >>>print(rashod1) 6 >>>print(rashod2) 0 ``` ## 3. Цикл по перечислению – управляющая инструкция for. Общее правило написания: for <Объект-переменная цикла> in <объект>: <отступы><Блок инструкций 1 – тело цикла> [else: < отступы ><Блок инструкций 2 – если в цикле не сработал break>] ### 3.1. Простой цикл. Выполняем цикл, который проходится по значениям от 3 до 18(не включительно) с шагом 3 и суммирует их в переменную temperatura. ``` >>>temperatura = 5 >>>for i in range(3, 18, 3): temperatura += i >>>temperatura 50 ``` ### 3.2. Более сложный цикл. ``` >>>sps = [2, 15, 14, 18] >>>for k in sps: if len(sps) <= 10: sps.append(sps[0]) else: break >>>sps [2, 15, 14, 18, 2, 2, 2, 2, 2, 2, 2] ``` Как видно, в конец цикла добавляется двойка до тех пор, пока длина не превысит 10. Важно понимать, что sps - это и объект, по которому проходит k, и объект, изменяющийся внутри цикла. То есть k будет двигаться по циклу бесконечно, и выполнение останавливается именно из-за условия if - else. (При этом else в данном случае относится к if, а не к for (это можно понять не только по смыслу, но и по табуляции) ``` >>>sps = [2, 15, 14, 8] for k in sps[:]: if len(sps) <= 10: sps.append(sps[0]) else: break >>>sps [2, 15, 14, 8, 2, 2, 2, 2] ``` Отличия от предыдущего случая: - Итерация происходит по фиксированной копии, а не по изменяемому списку. - Создание копии: При входе в цикл создаётся копия текущего списка sps - Изменение оригинала: Внутри цикла изменяется оригинальный список sps - Количество итераций фиксировано: Определяется длиной изначальной копии ### 3.3. : Cоздание списка с 10 целыми случайными числами из диапазона от 1 до 100. При этом, если сумма чисел не превышает 500, эта сумма должна быть отображена на экране. ``` >>>import random as rn >>>sps5 = [] >>>for i in range(10): sps5.append(rn.randint(1, 100)) ss = sum(sps5) if ss > 500: break else: print(ss) # Программа ничего не вывела >>>ss 512 >>>sps5 [47, 92, 92, 54, 52, 78, 67, 30] ``` После того, как прошло девять итераций, сумма элементов списка уже была больше 500, поэтому цикл закончился из-за if, а не из-за окончания диапазона range(10). Попробуем обнулить список и выполнить ту же программу еще раз: ``` >>>sps5 = [] >>>for i in range(10): sps5.append(rn.randint(1, 100)) ss = sum(sps5) if ss > 500: break else: print(ss) 419 ``` В этот раз программа вывела ответ, следовательно сработал else и break не сработал. ### 3.4. Пример с символьной строкой ``` >>>stroka='Это – автоматизированная система' >>>stroka1 = " " >>>for ss in stroka: stroka1 += " " + ss >>>print(stroka1) Э т о – а в т о м а т и з и р о в а н н а я с и с т е м а ``` Переменная stroka содержит исходную строку: "Это – автоматизированная система". Переменная stroka1 инициализируется как пустая строка. В цикле for происходит перебор каждого символа ss из строки stroka. На каждой итерации к stroka1 добавляется пробел и текущий символ ss. После обработки всех символов в stroka1 формируется новая строка, где каждый символ исходной строки разделён пробелом. ### 3.5. Конструкция list comprehension. Пример: создание списка с синусоидальным сигналом.(Внутри квадратных скобок записано выражение-генератор) ``` >>>import math >>>sps2 = [math.sin(i * math.pi / 5 + 2) for i in range(100)] >>>sps2 [0.9092974268256817, 0.49103209793281005, -0.11479080280322804, -0.6767675184643197, -0.9802420445539634, -0.9092974268256817, -0.49103209793281016, 0.11479080280322791, 0.6767675184643196, 0.9802420445539634, 0.9092974268256818, 0.4910320979328103, -0.1147908028032278, -0.6767675184643196, -0.9802420445539632, -0.9092974268256818, -0.4910320979328104, 0.11479080280322768, 0.6767675184643195, 0.9802420445539632, 0.9092974268256819, 0.4910320979328105, -0.11479080280322579, -0.6767675184643194, -0.9802420445539632, -0.9092974268256819, -0.4910320979328106, 0.11479080280322743, 0.6767675184643193, 0.9802420445539632, 0.909297426825682, 0.49103209793281066, -0.1147908028032273, -0.6767675184643192, -0.9802420445539632, -0.909297426825682, -0.4910320979328108, 0.11479080280322719, 0.6767675184643192, 0.9802420445539631, 0.9092974268256822, 0.491032097932814, -0.11479080280322707, -0.676767518464319, -0.9802420445539625, -0.9092974268256822, -0.491032097932811, 0.11479080280323047, 0.6767675184643189, 0.9802420445539625, 0.9092974268256822, 0.4910320979328142, -0.11479080280322682, -0.6767675184643215, -0.9802420445539631, -0.9092974268256808, -0.4910320979328112, 0.11479080280322317, 0.6767675184643187, 0.9802420445539624, 0.9092974268256823, 0.4910320979328082, -0.11479080280322658, -0.6767675184643213, -0.980242044553963, -0.9092974268256838, -0.49103209793281144, 0.11479080280322293, 0.6767675184643186, 0.9802420445539637, 0.9092974268256824, 0.49103209793280844, -0.11479080280322633, -0.6767675184643158, -0.980242044553963, -0.9092974268256839, -0.49103209793281166, 0.11479080280322974, 0.6767675184643184, 0.9802420445539637, 0.9092974268256825, 0.4910320979328149, -0.11479080280321903, -0.6767675184643209, -0.9802420445539629, -0.909297426825681, -0.4910320979328119, 0.11479080280322244, 0.6767675184643129, 0.9802420445539636, 0.9092974268256826, 0.49103209793281505, -0.11479080280322584, -0.6767675184643155, -0.9802420445539644, -0.9092974268256812, -0.49103209793281205, 0.1147908028032222, 0.6767675184643127, 0.980242044553965] >>>import pylab >>>pylab.plot(sps2, label = 'Синусоидальный сигнал', color = 'red') [] >>>pylab.show() ``` ![График](figure0.png) ## 4. Цикл «пока истинно условие» – управляющая инструкция while. Общее правило написания: while <Условие>: <отступы><Блок инструкций 1 – тело цикла> [else: <отступы><Блок инструкций 2 – если в цикле не сработал break>] ### 4.1. Цикл со счетчиком. ``` >>>rashod = 300 >>>while rashod: print("Расход=", rashod) rashod -= 50 Расход= 300 Расход= 250 Расход= 200 Расход= 150 Расход= 100 Расход= 50 ``` Цикл завершился из-за того, что расход стал равен 0, а 0 в свою очередь воспринимается как False. ### 4.2. Пример с символьной строкой. ``` >>>import math >>>stroka = 'Расчет процесса в объекте регулирования' >>>i = 0 >>>sps2 = [] >>>while i < len(stroka): r = 1 - 2/(1+math.exp(0.1 * i)) sps2.append(r) print('Значение в момент', i, "=", r) i += 1 Значение в момент 0 = 0.0 Значение в момент 1 = 0.049958374957880025 Значение в момент 2 = 0.09966799462495568 Значение в момент 3 = 0.14888503362331795 Значение в момент 4 = 0.197375320224904 Значение в момент 5 = 0.2449186624037092 Значение в момент 6 = 0.2913126124515909 Значение в момент 7 = 0.3363755443363322 Значение в момент 8 = 0.3799489622552249 Значение в момент 9 = 0.421899005250008 Значение в момент 10 = 0.4621171572600098 Значение в момент 11 = 0.5005202111902354 Значение в момент 12 = 0.5370495669980353 Значение в момент 13 = 0.5716699660851172 Значение в момент 14 = 0.6043677771171636 Значение в момент 15 = 0.6351489523872873 Значение в момент 16 = 0.6640367702678489 Значение в момент 17 = 0.6910694698329307 Значение в момент 18 = 0.7162978701990245 Значение в момент 19 = 0.7397830512740043 Значение в момент 20 = 0.7615941559557649 Значение в момент 21 = 0.7818063576087741 Значение в момент 22 = 0.8004990217606297 Значение в момент 23 = 0.8177540779702878 Значение в момент 24 = 0.8336546070121553 Значение в момент 25 = 0.8482836399575129 Значение в момент 26 = 0.8617231593133063 Значение в момент 27 = 0.874053287886007 Значение в момент 28 = 0.8853516482022625 Значение в момент 29 = 0.8956928738431645 Значение в момент 30 = 0.9051482536448664 Значение в момент 31 = 0.9137854901178277 Значение в момент 32 = 0.9216685544064713 Значение в момент 33 = 0.9288576214547277 Значение в момент 34 = 0.935409070603099 Значение в момент 35 = 0.9413755384972874 Значение в момент 36 = 0.9468060128462683 Значение в момент 37 = 0.9517459571646616 Значение в момент 38 = 0.9562374581277391 >>>pylab.plot(sps2, label = 'Сигнал на выходе инерционного звена', color = 'red') [] >>>pylab.show() ``` ![График](figure1.png) ### 4.3. Определение, является ли число простым (делится только на самого себя или 1). ``` >>>chislo=267 #Проверяемое число >>>kandidat =chislo // 2 # Для значений chislo > 1 >>>while kandidat > 1: if chislo%kandidat == 0: # Остаток от деления print(chislo, ' имеет множитель ', kandidat) break # else выполняться не будет kandidat -= 1 >>>else: # При завершении цикла без break print(chislo, ' является простым!') 267 имеет множитель 89 ``` Программа работает так: переменная kandidat отвечает за потенциальный делитель заданного числа. Изначально мы задаем половину от заданного числа, потому что у числа не может быть делителя большего, чем половина от него. Далее мы последовательно уменьшаем потенциальный множитель, каждый раз проверяя, получилось ли поделить без остатка. Если получилось, то число непростое, и цикл можно прекращать досрочно. Если цикл отработал до конца, не прервавшись, то число простое. Дополним программу так, чтобы выявить все простые числа в диапазоне от 250 до 300. ``` >>>for i in range(250, 301): chislo = i kandidat = chislo // 2 while kandidat > 1: if chislo % kandidat == 0: print(chislo, 'имеет множитель', kandidat) break kandidat -= 1 else: print(chislo, 'является простым!') 250 имеет множитель 125 251 является простым! 252 имеет множитель 126 253 имеет множитель 23 254 имеет множитель 127 255 имеет множитель 85 256 имеет множитель 128 257 является простым! 258 имеет множитель 129 259 имеет множитель 37 260 имеет множитель 130 261 имеет множитель 87 262 имеет множитель 131 263 является простым! 264 имеет множитель 132 265 имеет множитель 53 266 имеет множитель 133 267 имеет множитель 89 268 имеет множитель 134 269 является простым! 270 имеет множитель 135 271 является простым! 272 имеет множитель 136 273 имеет множитель 91 274 имеет множитель 137 275 имеет множитель 55 276 имеет множитель 138 277 является простым! 278 имеет множитель 139 279 имеет множитель 93 280 имеет множитель 140 281 является простым! 282 имеет множитель 141 283 является простым! 284 имеет множитель 142 285 имеет множитель 95 286 имеет множитель 143 287 имеет множитель 41 288 имеет множитель 144 289 имеет множитель 17 290 имеет множитель 145 291 имеет множитель 97 292 имеет множитель 146 293 является простым! 294 имеет множитель 147 295 имеет множитель 59 296 имеет множитель 148 297 имеет множитель 99 298 имеет множитель 149 299 имеет множитель 23 300 имеет множитель 150 ``` Здесь просто добавляется for для перебора значений. ### 4.4. Инструкция continue Инструкция continue, которая не вызывает завершения цикла, но завершает его текущий виток и обеспечивает переход к следующему витку. ``` >>>x = [rn.randint(-25, 40) for i in range (20)] >>>x [35, 21, -14, 21, -15, 1, -9, -7, -15, 2, 32, 11, 38, 32, -13, -21, 31, -10, -20, 15] >>>for y in x: if y < 0: continue print(y, ">0") else: print("stop") 35 >0 21 >0 21 >0 1 >0 2 >0 32 >0 11 >0 38 >0 32 >0 31 >0 15 >0 stop ``` ## 5. Завершение сеанса в среде IDLE