Вы не можете выбрать более 25 тем Темы должны начинаться с буквы или цифры, могут содержать дефисы(-) и должны содержать не более 35 символов.

23 KiB

Отчет по теме 5

Голощапов Дмитрий, А-01-23

1 Подготовка к началу работы

Запуск оболочки IDLE и установка рабочего каталога

>>>import os
>>>os.chdir('C:\\Users\\Дмитрий\\OneDrive\\Рабочий стол\\Goloshchapov\\python-labs\\TEMA5')

Управляющие инструкции, как и в других языках программирования, используются в Python для разветвления линий потока. Их применение имеет как сходство, так и заметные отличия по сравнению с другими языками программирования. В программах на Python они применяются по следующей общей схеме: <Управляющая инструкция>: <отступы><Блок инструкций>

Здесь управляющая инструкция начинается зарезервированными словами, такими как if, while, for… и дополняется логическим выражением, со значением True или False. Блок инструкций – это совокупность инструкций на языке Python, возможно, включающая вложенные управляющие инструкции. Относительно управляющей инструкции блок инструкций сдвигается вправо с использованием одинаковых отступов, задаваемых либо некоторым числом пробелов, либо одной или несколькими табуляциями.

2 Изучение блока ЕСЛИ

Были изучены и применены различные конструкции блоков с использованием условия if. Рассмотрены также elif и else. Изучены блоки условий, записываемые в одну строку.

Общее правило написания: if <условие>: <отступы><Блок инструкций, выполняемый, если условие истинно> [elif <условие2>: <отступы><Блок инструкций2, выполняемый, если условие2 истинно> ] [else: < отступы><Блок инструкций3, выполняемый, если условие ложно> ]

Условие задается в виде логического выражения, которое может принимать значение True или False. Блок инструкций может располагаться на нескольких строках. Отступы во всех строках блока должны быть одинаковыми по отношению к первому символу управляющей инструкции. Если имеется вложенная управляющая инструкция, то она вводится с таким же отступом, а все строки ее блоков – отступают по отношению к ее первому символу. Признак конца блока – отсутствие отступов в очередной строке или ввод пустой строки. Если в Блоке инструкций только одна инструкция, её можно записывать без отступов сразу за знаком «:».

>>> porog = 35
>>> rashod1 = 21
>>> rashod2 = 15
>>> if rashod1>=porog:
...     dohod=12
... elif rashod2==porog:
...     dohod=0
... else:
...     dohod=-8
... 
...     
>>> dohod
-8


>>> if rashod1>=3 and rashod2==4:
... 		dohod=rashod1
... 		if rashod2==porog or rashod1<rashod2:
... 			dohod=porog
... 
>>> dohod
-8

В конструкции if-elif-else всегда выполняется только одна ветвь. Даже если условие в elif также истинно, оно не будет проверено и, соответственно, не выполнится, если до этого уже выполнился блок if. Это связано с тем, что после выполнения любого блока инструкции (будь то if, elif или else) остальные части конструкции игнорируются.

>>> if porog==3:
... 		dohod=1
... elif porog==4:
... 		dohod=2
... elif porog==5:
... 		dohod=3
... else:
... 		dohod=0
... 
>>> dohod
0

Условные инструкции могут записываться также в одну строку в операторе присваивания по следующей схеме: <Объект>=<значение 1> if <условие> else <значение 2> или ещё: if <условие>: <инструкция1>[;<инструкция2>….]

>>> dohod=2 if porog>=4 else 0
>>> dohod
2
>>> if porog>=5 : rashod1=6; rashod2=0
... 
>>> rashod1;rashod2
6
0

3 Изучение блока For

Был изучен и применен блок for, разобрана простая конструкция и несколько сложных.

Общее правило написания: for <Объект-переменная цикла> in <объект>: <отступы><Блок инструкций 1 – тело цикла> [else: < отступы ><Блок инструкций 2 – если в цикле не сработал break>]

Здесь <объект> - любой определенный до начала цикла объект из классов строка, список, кортеж, множество, словарь. <Объект-переменная цикла> - объект, в качестве значений которого поочередно будут задаваться элементы объекта, которые могут быть объектами любого типа. <Блок инструкций 1 – тело цикла> - совокупность инструкций, которая может содержать или не содержать инструкцию break, вызывающую досрочное завершение цикла при некоторых условиях. Блок инструкций 1 обычно выполняется многократно по мере того, как объект-переменная цикла принимает значения из сложного объекта. Если в цикле имеется необязательная часть: else и Блок инструкций 2, то он будет выполняться перед завершением цикла только в том случае, если при выполнении цикла не было его прерывания по инструкции break. Если в Блоке инструкций 1 или в Блоке инструкций 2 только одна инструкция, то её можно записывать без отступов сразу за двоеточием.

3.1 Изучение простого цикла for

Был применен простой цикл for, который перебирает числа из сгенерированной последовательности и каждый раз увеличивает заданное значение на это число.

>>> temperatura=5
>>> for i in range(3,18,3):
... 	temperatura+=i
... 
... 	
>>> temperatura
50

3.2 Изучение первого сложного цикла for

Был применен цикл for, который приписывает к списку первый его элемент каждую итерацию, до тех пор, пока длина списка не будет равна или больше 10. Испробованы два способа передачи списка - как изменяемый список и как неизменяемую копию.

>>> 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, и объект, изменяющийся внутри цикла. Если список изменяется во время цикла, это влияет на последующие итерации. (При этом else в данном случае относится к if, а не к for)

>>> sps=[2,15,14,8]
>>> for k in sps[:]:
... 	if len(sps)<=10:sps.append(sps[0]) #В этом варианте список итерируется по копии, то есть исходному списку, чья длина всегда равна 4. Цикл выполняется 4 раза, так как список имеет 4 элемента.
... 	else:break
... 
>>> sps
[2, 15, 14, 8, 2, 2, 2, 2]

3.3 Изучение второго сложного цикла for

Был приненен цикл for, в котором при каждой итерации для i от 0 до 9, созданный пустой список пополняется значением от 1 до 100 и подсчитывается сумма чисел в списке. При достижении суммы числа более 500, итерация прерывается. Если же итерации успевают закончиться естественным образом и сумма получается значением менее 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 # Значение не было выведено автоматически из-за того что значение превышает 500
545

Повтор операций:

>>> ss=0
>>> sps5=[]
>>> for i in range(10):
... 	sps5.append(rn.randint(1,100))
... 	ss=sum(sps5)
... 	if ss>500: break
... else:
... 	print(ss)
... 
... 	
458 # В данном случае сумма не превышает 500, поэтому она вывелась автоматически

3.4 Изучение цикла с символьной строкой

Был применен цикл, который перебирает каждый символ из stroka и дополняет им ранее созданную пустую строку stroka1.

>>> stroka='Это – автоматизированная система'
>>> stroka1=""
>>> for ss in stroka:
... 	stroka1+=" "+ss
... 
... 	
>>> stroka1
' Э т о   –   а в т о м а т и з и р о в а н н а я   с и с т е м а'
>>> ss
'а'

Переменная ss проходит по всему строковому объекту, на каждой итерации принимая значение одного знака. Этот знак с предшествующим пробелом дописывается в конец другой, изначально пустой строки. Цикл закончится, когда закончится исходная строка.

3.5 Изучение записи цикла в строке

Был использован цикл для создания сигналов (цикл создает список из чисел, вычесленных по определенному выражению, в которое входит i, изменяемое в ходе итераций от 0 до 99). А также построоен график отображения сигналов.

>>> import math
>>> sps2=[math.sin(i*math.pi/5+2) for i in range(100)]
>>> import pylab
>>> pylab.plot(range(100), sps2)
[<matplotlib.lines.Line2D object at 0x00000272256E6490>]
>>> pylab.title("Сигналы")
Text(0.5, 1.0, 'Сигналы')
>>> pylab.show()

Здесь используется конструкция list comprehention (генератор списков). В общем виде она выглядит так: <итоговый список> = [<выражение> for <элемент> in <исходный объект> if <условие>]

4 Изучение цикла While

Были изучены и применены различные варианты циклов с использованием блоков while.

Общее правило написания: while <Условие>: <отступы><Блок инструкций 1 – тело цикла> [else: <отступы><Блок инструкций 2 – если в цикле не сработал break>] Здесь <Условие> - некоторое логическое выражение. Если на очередном витке цикла оно принимает значение True (или не равно 0), то выполняется Блок инструкций 1. При этом, если в этом блоке присутствует инструкция break и она будет выполнена, то цикл завершается, иначе – переходит к новому витку цикла. В блоке инструкций 1 могут быть изменены значения объектов, входящих в Условие и его значение тоже может измениться. Если же его значением останется True, то вновь выполняется Блок инструкций 1 и т.д. Если в цикле присутствует Блок инструкций 2, то он будет выполнен, если завершение цикла произошло не по инструкции break, а по значению False (или значению =0) условия.

4.1 Изучение цикла while со счетчиком

Был применен цикл while, который уменьшает значение rashod на 50 единиц. Здесь rashod = True до тех пор пока его значение положительное. Когда rashod становится равным 0, цикл прерывается. На каждой итерации печатается значение rashod.

>>> rashod=300
>>> while rashod:
... 	print("Расход=",rashod)
... 	rashod-=50
... 
Расход= 300
Расход= 250
Расход= 200
Расход= 150
Расход= 100
Расход= 50

4.2 Изучение цикла while с символьной строкой

Был применен цикл while, который для каждой i, что изменяется от 0 до длины строки stroka, вычисляет значение r, используя выражение, в которое входит i, и формирует из этих значений список. Далее по значениям из списка был построен график.

>>>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(range(len(stroka)), sps2)
[<matplotlib.lines.Line2D object at 0x00000272272AB610>]
>>> pylab.title("процесс регульрования")
Text(0.5, 1.0, 'процесс регульрования')
>>> pylab.show()

4.3 Изучения блока while для проверки числа на свойство простого числа

Был применен цикл while, который проверяет остаток от деления заданного числа, на все числа начиная от половины собственного значения до 2, при этом если хоть раз этот остаток равен 0, то выводится надпись о том, что число имеет множитель и цикл прерывается. Если же остаток никогда не равен 0, то цикл выполняется до тех пор, пока делитель не будет равен единице и после этого будет выведена надпись, что число является простым.

>>> 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

Также предыдущий код был изменен таким образом, что был добавлен цикл for, который еще перебирает числа от 250 до 300 включительно и выполняет вышеописанные операции с каждым числом.

>>> for chislo in range(250, 301):  # Проходим по диапазону чисел
...     kandidat = chislo // 2  # Для значений chislo > 1
...     while kandidat > 1:
...         if chislo % kandidat == 0:  # Остаток от деления
...             print(chislo, ' имеет множитель ', kandidat)
...             break  # else выполняться не будет
...         kandidat -= 1
...     else:  # При завершении цикла while без break
...         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

5 Завершение работы в IDLE

Был завершен сеанс в среде IDLE.