### Отчет тема 5 ## Пункт 2. Изучите ветвление по условию – управляющая инструкция if. Общий вид выглядит так: ```py if <условие>: <отступы> <Блок инструкций, выполняемый, если условие истинно> [elif <условие2>: <отступы><Блок инструкций2, выполняемый, если условие2 истинно> ] [else: < отступы><Блок инструкций3, выполняемый, если условие ложно> ] ``` Причем elif и else вместе или по отдельности могут отсуствовать. Пример ```py >>> prog=4 >>> rashod1 = 8 >>> rashod2 = 5 >>> if rashod1 >= prog: ... dohod=12 ... elif rashod2==prog: ... dohod=0 ... else: ... dohod=8 ... >>> dohod 12 ``` Посмотрим другой цикл ```py >>> rashod2 = 4 >>> porog = 4 >>> if rashod1>=3 and rashod2==4: ... dohod=rashod1 ... if rashod2==porog or rashod1>> dohod 4 ``` И ещё одна операция с множественным ветвлением линий потока: ```py >>> if porog==3: ... dohod=1 ... elif porog==4: ... dohod=2 ... elif porog==5: ... dohod=3 ... else: ... dohod=0 ... >>> dohod 2 ``` Еще одна форма записи условных управляющих инструкций - тернарный оператор (от лат. "тройной"): <Объект> = <значение 1> if <условие> else <значение 2> или ещё: ```py if <условие>: <инструкция1>[;<инструкция2>….] ``` ```py >>> dohod=2 if porog>=4 else 0 >>> dohod 2 ``` Если в блоке инструкций всего одна строка, можно записать всё в одну строку: ```py >>> porog = 2 >>> if porog >= 5 : rashod1 = 6; rashod2 = 0 ... >>> rashod1 8 >>> rashod2 4 ``` Тк условие не было выполнено рассмотрим другой пример ```py >>> porog = 7 >>> if porog >= 5 : rashod1 = 6; rashod2 = 0 ... >>> rashod1 6 >>> rashod2 0 ``` ## Пункт 3. Цикл по перечислению (for) Общее правило написания: ```py for <Объект-переменная цикла> in <объект>: <отступы><Блок инструкций 1 – тело цикла> [else: < отступы ><Блок инструкций 2 – если в цикле не сработал break>] ``` Здесь <объект> - любой определенный до начала цикла объект из классов строка, список, кортеж, множество, словарь. <Объект-переменная цикла> - объект, в качестве значений которого пооче-редно будут задаваться элементы объекта, которые могут быть объектами любого типа. <Блок инструкций 1 – тело цикла> - совокупность инструкций, которая может содержать или не содер-жать инструкцию break, вызывающую досрочное завершение цикла при некоторых условиях. Блок инструкций 1 обычно выполняется многократно по мере того, как объект-переменная цикла принимает значения из сложного объекта. Если в цикле имеется необязательная часть: else и Блок инструкций 2, то он будет выполняться перед завершением цикла только в том случае, если при выполнении цикла не было его прерывания по инструкции break. Если Блоке инструкций 1 или в Блоке инструкций 2 только одна инструкция, то её можно запи-сывать без отступов сразу за двоеточием. ##3.1. Простой цикл. ```py >>> temperatura=5 >>> for i in range(3,18,3): ... temperatura+=i ... >>> temperatura 50 ## 3.2. Более сложный цикл >>> 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, 2, 2, 2] ``` Как видно, в конец цикла добавляется двойка до тех пор, пока длина не превысит 10. Важно понимать, что sps - это и объект, по которому проходит k, и объект, изменяющийся внутри цикла. То есть k будет двигаться по циклу бесконечно, и выполнение останавливается именно из-за условия if - else. (При этом else в данном случае относится к if, а не к for (это можно понять не только по смыслу, но и по табуляции) Рассмотрим другой вариант: ```py >>> 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[:] создает полную копию исходного списка (грубо говоря, срез от начала до конца включительно). Теперь список, по которому пробегается k, и список, изменяющийся внутри цикла - это объекты, имеющие разные адреса. Это можно проверить: ```py >>> id(sps) 1684034116672 >>> id(sps[:]) 1684069134400 ``` Следовательно, else не успеет сработать, потому что итерируемый в управляющей инструкции объект окажется короче и завершит цикл раньше ## Пункт 3.3 ```py >>> sps5=[] >>> for i in range(10): ... sps5.append(rn.randint(1,100)) ... ss=sum(sps5) ... if ss>500: break ... else: ... print(ss) ... ``` Программа ничего не вывела. Посмотрим, почему именно: ```py >>> sps5 [89, 38, 86, 57, 21, 44, 43, 32, 13, 88] >>> ss 511 >>> sps5 = [] >>> for i in range(10): ... sps5.append(rn.randint(1,100)) ... ss = sum(sps5) ... else: ... print(ss) ... 517 >>> sps5 [11, 75, 48, 46, 3, 67, 78, 92, 63, 34] ``` В этот раз программа вывела ответ самостоятельно, потому что сработал else, потому что за все десять итераций цикла так и не успел выполниться break по условию if. ## Пункт 3.4. Пример с символьной строкой ```py >>> stroka='Это - автоматизированная система' >>> stroka1="" >>> for ss in stroka: ... stroka1+=" "+ss ... >>> stroka 'Это - автоматизированная система' >>> stroka1 ' Э т о - а в т о м а т и з и р о в а н н а я с и с т е м а' ``` Переменная ss проходит по всему строковому объекту, на каждой итерации принимая значение одного знака. Этот знак с предшествующим пробелом дописывается в конец другой, изначально пустой строки. Цикл закончится, когда закончится исходная строка. ## 3.5. Запись цикла в строке. Пример: создание списка с синусоидальным сигналом. ```py >>> 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] ``` Эту синусоиду можно отобразить на графике: ```py >>> import pylab >>> pylab.plot(sps2, label='Синусоидальный сигнал', color = 'green') [] >>> pylab.show() ``` График прикреплен отдельным файлом Figure_1.png ## Пункт 4. Цикл "пока истинно условие" (while) Общий вид: ```py while <Условие>: <отступы><Блок инструкций 1 – тело цикла> [else: <отступы><Блок инструкций 2 – если в цикле не сработал break>] ``` break и else работают аналогично предыдущему случаю. ## 4.1. Цикл со счетчиком. ```py >>> rashod=300 >>> while rashod: ... print("Расход=",rashod) ... rashod-=50 ... Расход= 300 Расход= 250 Расход= 200 Расход= 150 Расход= 100 Расход= 50 ``` Как именно произошло завершение цикла? Нужно вспомнить, что все числа, кроме нуля, при конвертации в логический тип данных имеют логическое значение True: ```py >>> bool(50) True ``` И только нуль имеет значение False: ```py >>> bool(0) False ``` Сравниваемая в управляющей инструкции переменная уменьшается в самом цикле, поэтому, когда строка со сравнением обнаружит 0, то воспримет это как False, и действия по выводу и уменьшению числа выполняться больше не будут. ## Пункт 4.2. Пример с символьной строкой ```py >>> import math >>> stroka='Расчет процесса в объекте регулирования' >>> i=0 >>> sps2=[] >>> while i>> pylab.show() ``` График прикреплен файлом Figure_2.png ## Пункт 4.3. Определение, является ли число простым (делится только на самого себя или 1). ```py >>> chislo = 267 >>> kandidat = chislo // 2 >>> while kandidat > 1: if chislo % kandidat == 0: print(chislo, ' имеет множитель ', kandidat) break kandidat -= 1 else: print(chislo, ' является простым!') 267 имеет множитель 89 ``` Программа работает так: переменная kandidat отвечает за потенциальный делитель заданного числа. Изначально мы задаем половину от заданного числа, потому что у числа не может быть делителя большего, чем половина от него. Далее мы последовательно уменьшаем потенциальный множитель, каждый раз проверяя, получилось ли поделить без остатка. Если получилось, то число непростое, и цикл можно прекращать досрочно. Если цикл отработал до конца, не прервавшись, то число простое. Дополниим программу так, чтобы она проверяла все числа от 250 до 300. ```py >>> chislo = [x for x in range (250, 301)] >>> for now in chislo: kandidat = now // 2 while kandidat > 1: if now % kandidat == 0: print(now, ' имеет множитель ', kandidat) break kandidat -= 1 else: #ОБЯЗАТЕЛЬНО относится не к if и не к for, а к while print(now, " является простым!") 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 ``` ## Пункт 4.4. Инструкция continue. Она используется, когда надо при определенном условии не завершить весь цикл, а завершить только текущую итерацию. Пример (вывести только нечетные числа): ```py >>> n=[1,2,3,4,5,6,7,8,9,10] >>> for k in n: ... if k%2==0: ... continue ... print(k) ... 1 3 5 7 9 ```