Programmeerimise alused

Самоучитель Python 3 в PDF

dmitry.fedotov@tthk.ee

Занятие 1

Вводное занятие. Входное тестирование знаний. Алгоритмы и блок-схемы

Занятие 2

Введение в Python. Переменные. Конструкции IF-ELIF-ELSE

Занятие 3

Циклы. Циклы с предусловием. Циклы с постусловием. Циклы со счетчиком. Циклы перебора.

Цикл по счетчику
osnovanie=int(input("Введите основание степени"))
stepen=int(input("Введите показатель степени"))
resultat=osnovanie
for i in range(1,stepen):# i меняется от 1 до(!!!)stepen 
    #цикл будет выполняться столько раз, сколько в stepen
    resultat=resultat*osnovanie
print(osnovanie, "в степени", stepen, "равно", resultat)
Цикл с постусловием
while True:
    otvet=input("Купи слоника") # действие в цикле
    if otvet=="куплю": #условие выхода из цикла
        break
    else:# действие, если условие выхода не выполнилось
        print("все говорят",otvet,"а ты возьми и")
Цикл с предусловием
# вывести все четные числа от 2 до введенно пользователем
chislo=int(input("Введите произвольное число"))
drugoe=2
while drugoe<=chislo:
    print(drugoe)
    drugoe+=2 # drugoe=drugoe+2
Легенда о шахматах
# Легенда о шахматах
Summa=0 # общая сумма зерен
kletka=1 # количество зерен на первой клетке
for i in range(1,9):
    for j in range(1,9):
        Summa=Summa+kletka # Summa+=kletka
        kletka=kletka*2 # kletka*=2
print("Мудрец получит", Summa, "зерен")

Задание: программа “ЭХО”

Занятие 4

Массивы: Списки, Словари, Кортежи

Массивы
Список – Нумерованный массив. Индекс является целым числом от 0
Словарь – Ассоциативный массив. Индекс является словом только лат. и цифры
Кортеж – Список, в который нельзя записывать значения в момент выполнения программы
Текстовая строка воспринимается как список, каждая буква – отдельный элемент

jaschik=[20,34,56] #Список
Objem=jaschik[0]*jaschik[1]*jaschik[2]
print("Ящик с размерами: ширина - ",jaschik[0])
print("длина - ",jaschik[1])
print("высота - ",jaschik[2])
print("Объем ящика равен: ",Objem)

jaschik[2]=100
print(jaschik)
korobka=(5,7,10) # Кортеж Tuple 
objem2=korobka[0]*korobka[1]*korobka[2]
print("Объем коробки: ", objem2)
korobka[1]=6 # выдаст ошибку, в кортеж записывать нельзя
chelovek={"ik":37895665515,"nimi":"Ivar"} # Словарь Dict 
print(chelovek["nimi"])
primer={1:"Odin","1":"Vtoroj"}
print(primer["1"])
kakojToTekst="однажды в студеную зимнюю пору"
print(kakojToTekst[8]) # отпечатает букву "в"
print(kakojToTekst[-3]) # отпечатает "o" - третья с конца
print(kakojToTekst[10:17]) # выборка с 10 до(!!!) 17 
print(kakojToTekst[19:-6])
# анализ персонального кода
ik="58653121421"
pol=ik[0]
god=ik[1:3]
mesjac=ik[3:5]
den=ik[5:7]
gender=["","mees","naine","mees","naine","mees","naine"]
kuu=["","Jaanuar","Veebruar","Märts","Aprill","Mai",
     "Juuni","Juuli","August","September","Oktoober",
     "November","Detsember"]
month={"01":"Jaanuar","02":"Veebruar","03":"Märts",
       "04":"Aprill","05":"Mai","06":"Juuni",
       "07":"Juuli","08":"August","09":"September",
       "10":"Oktoober","11":"November","12":"Detsember"}
print(gender[int(pol)])
print(kuu[int(mesjac)])
print(month[mesjac])
Домашнее задание на 2024-01-15:

Дан массив целых чисел. Массив произвольной длины.
1. Создать алгоритм нахождения минимального и максимального числа в массиве.
2. Написать код по созданному алгоритму.

Занятие 5

Функция перевода строки в дату

Время в формате Unix

Урок 2024-02-05

Файл 1:

import math
from random import randint
# создание функции
def max3(a,b=0,c=0):
    if a>b:
        res=a
    else:
        res=b
    if c>res:
        res=c
    return res

def vCyl(d,h):
    V=math.pi*(d**2)/4*h
    return V

def mulN(*razmer):
    res=1
    for a in razmer:
        res=res*a
    return res

def DnDice(*sides):
    '''sides - через запятую количество сторон на каждом кубике'''
    for N in sides:
        print('На кубике',N,"выпало",randint(1,N))


def user(**userData):
    print("Имя пользователя", userData['name'])
    if userData['age']>18:
        print("Доступ разрешен")
    else:
        print("В доступе отказано")


Файл 2:

from tund20240205 import max3,vCyl,mulN,DnDice,user

print(max3(max3(2,4),max3(1,3,6),max3(8)))

print(max3(c=3,b=1,a=0))

print(vCyl(2,3))
print(vCyl(3,2))
print(vCyl(h=3,d=2))
print(mulN(2,3)) 
print(mulN(4,4,8))
print(mulN(1,2,3,4,5,6,7,8,9))

DnDice(6,12,3)

user(name='Dmitry',age=35)
user(name='Евгений',age=16)

Урок 12.02.2024

import math
def getDistance(x1=0,y1=0,z1=0,x2=0,y2=0,z2=0):
    R=math.sqrt((x2-x1)**2+(y2-y1)**2+(z2-z1)**2)
    return R

Задание:

import geometry
# путь №1. Указаны координаты точек [x,y]
route1=[[0,0],[0,4],[3,4],[3,0],[0,0]]
# путь №2. Указаны координаты точек [x,y,z]
route2=[[0,0,0],[1,1,0],[1,1,1],[1,0,0],[2,0,0],[4,1,1],
        [4,2,3],[3,5,0]]
# Написать код или функцию, которая будет считать суммарную
# длину указанных маршрутов с помощью функции getDistance

Урок 13.02.2024

#Объединение массивов. Способ 1
dict1={1:'a',2:'b'}
dict2={2:'c',3:'d'}
dict3=dict1|dict2
print(dict3)

#Объединение массивов. Способ 2
dict4={'es':8.30,'te':8.30}
dict5={'te':14.45,'ko':11.35}
dict6={**dict4,**dict5}
print(dict6)

#Объединение массивов. Способ 3
dict7={'Tallinn':-3,'Pärnu':-1}
dict8=dict7.copy()
dict8['Tallinn']=-10
print(dict7['Tallinn'])
dict9={'Tartu':-4,'Rakvere':-8}
dict8.update(dict9)
print(dict8)

#Сложное создание массива
list1=['Jan','Feb','Mar','May']
list2=[31,29,31,30]
dict10=dict(zip(list1,list2))
print(dict10)

# удаление элемента по ключу
del dict10['Mar']
print(dict10)

del list1[1]
list1.pop(2)
print(list1)
print(list1[1])

#добавление информации 
list1.append('Jun')
list1.insert(1,'Feb')
print(list1)

Задание:

Исходные данные:
List M1
1) Jan
2) Feb
3) Mar
4) Apr
5) May
6) Jun
7) Jul
8) Aug
9) Sep
10) Oct
11) Nov
12) Dec

List M2
1) Янв
2) Фев
3) Мар
4) Апр
5) Май
6) Июн
7) Июл
8) Авг
9) Сен
10) Окт
11) Ноя
12) Дек

List M3
1) 31
2) 28
3) 31
4) 30
5) 31
6) 30
7) 31
8) 31
9) 30
10) 31
11) 30
12) 31

Собрать из трех списков словарь по следующим правилам:
Первый индекс – английское название месяца (М1)
второй индекс – 0 или 1
Значением будут являться соответствующая информация из списков M2 и М3

Пример:
M4[‘Jan’][0] => Янв
M4[‘Jan’][1] => 31

Урок 2024-03-04. Работа с файлами

Функции работы с файлами

Открытие файла

f = open(‘text.txt’, ‘r’)

РежимДействие
‘r’открытие на чтение (является значением по умолчанию).
‘w’открытие на запись, содержимое файла удаляется, если файла не существует, создается новый.
‘x’открытие на запись, если файла не существует, иначе исключение.
‘a’открытие на дозапись, информация добавляется в конец файла.
‘b’открытие в двоичном режиме.
‘t’открытие в текстовом режиме (является значением по умолчанию).
‘+’открытие на чтение и запись

Чтение из файла

Чтение всего файла или ограниченного количества информации
>>> f = open('text.txt') 
>>> f.read(1) 
'H' 
>>> f.read()
'ello world!\nThe end.\n\n'
Чтение из файла построчно

Задание:
Задача 2

Стоимость заказа
Имеется текстовый файл prices.txt с информацией о
заказе из интернет магазина. В нем каждая строка с
помощью символа табуляции \t разделена на три колонки:

наименование товара;
количество товара (целое число);
цена (в евро) товара за 1 шт. (целое число).

тетрадь 48 листов 5 1.15
ручка синяя 8 0.34
карандаш 6 0.25
папка 1 2.50

Напишите программу, подсчитывающую общую стоимость заказа.

shoplist=open('info/shoplist.txt','r',encoding='utf-8')
total=0
for stroka in shoplist:
    info=stroka.split('\t')
    print("количество",int(info[1]),"Цена",float(info[2]))
    total+=(int(info[1])*float(info[2]))
print("ИТОГО:",total)
Пример 2

Теперь прочитаем этот список с помощью функции readline():

with open('file.txt', 'r', encoding='utf-8') as f:
    print(f.readline())
Пример 3

Все строки файла можно прочитать с помощью метода readlines(), возвращающего содержимое в виде списка вместе со специальными символами:

with open('file.txt', 'r', encoding='utf-8') as f:
data = f.readlines()
print(data)
>>> ['Морковь\n', 'Сметана\n', 'Мука\n', 'Яблоки']

Такое чтение можно реализовать и без метода readlines(), воспользовавшись конструктором списков 

list():
with open('file.txt', 'r', encoding='utf-8') as f:
data = list(f)
print(data)
>>> ['Морковь\n', 'Сметана\n', 'Мука\n', 'Яблоки']

Задание на уроке

'''
Дано: текстовый файл, содержащий несколько строк.
Задача: переставить строки в обратном порядке.
'''
# часть 1
stroki=open('year.txt','r',encoding='utf-8')
data=list(stroki)
stroki.close()
# часть 2
data.reverse()
# часть 3
stroki=open('year.txt','w',encoding='utf-8')
N=len(data)
for stroka in data:
    test=stroka.find('\n')
    if test==-1:
        stroka=stroka+'\n'
    elif N==1:
       stroka=stroka[0:stroka.find('\n')] 
    stroki.write(stroka)
    N=N-1
stroki.close() 

Задание на уроке 2024-03-05

Предыстория

Принцесса и людоед
(Г. Сапгир)


Принцесса
Была прекрасная,
Погода
Была ужасная.
Днем,
Во втором часу,
Заблудилась
Принцесса в лесу.

Смотрит – полянка
Прекрасная,
На полянке землянка
Ужасная.

А в землянке –
Людоед:
– Заходи-ка
На обед.
Он хватает нож,
Дело ясное,
Вдруг увидел,
Какая… прекрасная!

Людоеду сразу стало
Худо.
– Уходи, – говорит,
– Отсюда.
Аппетит – говорит, –
Ужасный.
Слишком вид – говорит, –
Прекрасный!
И пошла
Потихоньку принцесса,
Прямо к замку
Вышла из леса.
Вот какая
Легенда ужасная!
Вот какая
Принцесса прекрасная!

А, может быть, было все наоборот:
Принцесса
Была ужасная,
Погода
Была прекрасная.
Днем,
Во втором часу,
Заблудилась
Принцесса в лесу.

Смотрит – полянка
Ужасная,
На полянке землянка
Прекрасная.

А в землянке
Людоед:
– Заходи-ка
На обед.
Он хватает нож,
Дело ясное,
Вдруг увидел,
Какая… ужасная!

Людоеду сразу стало
Худо.
– Уходи, – говорит, –
Отсюда.
Аппетит, – говорит, –
Прекрасный.
Слишком вид, – говорит,
Ужасный.
И пошла
Потихоньку принцесса,
Прямо к замку
Вышла из леса.
Вот какая
Легенда прекрасная!
Вот какая
Принцесса ужасная

Задание

В текстовом файле дана первая часть произведения (левая колонка).
Написать программу, которая поменяет все слова “прекрасная” (“прекрасный”) и “ужасная” (“ужасный”) местами с соблюдением регистра так, чтобы получилась вторая часть произведения (правая колонка)

zamena={'прекр':'уж','Прекр':'Уж','уж':'прекр','Уж':'Прекр'}
stih=open('stihi.txt','r',encoding='utf-8')
newStih=[]
for stroka in stih:
    for key, value in zamena.items():
        if stroka.find(key)>-1:
            novaja=stroka[0:stroka.find(key)]+value+stroka[(stroka.find(key)+len(key)):len(stroka)]
            stroka=novaja
            break
    newStih.append(stroka)
stih.close()
stih=open('stihi.txt','w',encoding='utf-8')
for stroka in newStih:
    stih.write(stroka)
stih.close()

2024-04-16

def cezar(textToCode, D):
    # программа шифрования кодом Цезаря
    # textToCode - текст, который необходимо зашифровать
    # D - сдвиг по направлению алфавита
    #print(cezar("Однажды, в Студеную Зимнюю Пору",8))
    #print(cezar("Цлхзолг, й Щьылмхыё Прфхёё Чцшы",-8))
    alfavit="аАбБвВгГдДеЕёЁжЖзЗиИйЙкКлЛмМнНоОпПрРсСтТуУфФхХцЦчЧшШщЩьЬыЫъЪэЭюЮяЯ"
    newString=''
    for bukva in textToCode:
        N=alfavit.find(bukva)
        M=N+2*D
        if M>=len(alfavit):
            M=M-len(alfavit)
        if N==-1:
            newString=newString+bukva
        else: 
            newString=newString+alfavit[M]
    return newString
from cezar3 import cezar
with open('skazka.txt','r', encoding='utf-8') as file:
    # file=open('skazka.txt','r', encoding='utf-8')
    for stroka in file:
        print(cezar(stroka,4))
from cezar3 import cezar
with open('skazka.txt','r',encoding='utf-8') as fileIn,open('skazka2.txt','w',encoding='utf-8') as fileOut:
    for stroka in fileIn:
        fileOut.write(cezar(stroka,6))
from cezar3 import cezar
with open('skazka.txt','r',encoding='utf-8') as fileIn:
    with open('skazka2.txt','w',encoding='utf-8') as fileOut:
        for stroka in fileIn:
            fileOut.write(cezar(stroka,6))

Ссылка на рабочий файл OMNIVA
Написать код, который в файл с названием eestiLocation.csv запишет из файла locations.csv все строки о почтовых объектах, которые находятся на территории Эстонии в объектах Maxima

Задание:

На Гугл карте выбрать произвольное метоположение на территории одного из трех прибалтийских государств (Эстония, Латвия, Литва).

Из адреса в виде “https://www.google.com/maps/d/viewer?mid=1JhqflJGOj866uRe5IMNr6G3XE3A&hl=en&ll=59.3927845000268%2C24.722360104376843&z=16

Выбрать вручную два параметра после символов II= и %2C

Пример:

  1. 59.3927845000268
  2. 24.722360104376843

Написать код, который спросит эти два параметра и выдаст список тех объектов OMNIVA, до которых можно будет добарться пешком в течение получаса.

Исходя из средней скорости пешехода – 5 км/ч

Расстояние изменять по теореме Пифагора.

59,38073389 24,69941394
59,37359275 24,66629852

0,033876642 2
0,042345803 2,5