Язык Python. Первое знакомство. Часть 3.

Факультативы
Python — современный универсальный интерпретируемый язык программирования. Его достоинства: 1. Кроссплатформенность и бесплатность. 2. Простой синтаксис и богатые возможности позволяют записывать программы очень кратко, но в то же время понятно. 3. По простоте освоения язык сравним с бейсиком, но куда более богат возможностями и значительно более современен. 4. Богатая стандартная библиотека, возможность разработки промышленных приложений (для работы с сетью, GUI, базами данных и т.д.) Большинство школьных олимпиад по информатике поддерживают язык Python. C 2015 года в текстах задач ЕГЭ примеры приводятся также и на языке Python. Практика показывает, что задания ЕГЭ по информатике, в которых требуется написать программу, существенно проще решать с использованием языка Python, чем классических языков Бейсик, Паскаль, C/C++.
Шкурин Дмитрий Николаевич
Содержимое публикации

Простойкалькулятор

from tkinter import * 

root = Tk() 
# создадим два поля ввода

A = Entry(width=20)
B = Entry(width=20)
#
создадимкнопки

btn_plus = Button(text="+")
btn_minus = Button(text="-")
btn_umn = Button(text="*")
btn_dell = Button(text="/")
btn_clear = Button(text="Clear")
#
создадимтекстовоеполедляпечатирезультатавычислений
Lbl = Label(bg='black', fg='white', width=20)
#
опишемреакциюкнопокнанажатие

def plus(event):
    #
получаеминформациюизполейввода
    a = int(A.get())
    b = int(B.get())
    #
меняемтекст,отображаемыйвтекстовомполе
    Lbl['text'] = str(a + b)

def minus(event):
    a = int(A.get())
    b = int(B.get())
    Lbl['text'] = str(a - b)

def umn(event):
    a = int(A.get())
    b = int(B.get())
    Lbl['text'] = str(a * b)

def dell(event):
    a = int(A.get())
    b = int(B.get())
    Lbl['text'] = str(a / b)    

def clear(event):
    Lbl['text'] = ''           
#связываем кнопки с событием нажатия

btn_plus.bind('<Button-1>', plus)
btn_minus.bind('<Button-1>', minus)
btn_umn.bind('<Button-1>', umn)
btn_dell.bind('<Button-1>', dell)
btn_clear.bind('<Button-1>', clear)
#
упаковываемвиджеты

A.pack()
B.pack()
btn_plus.pack()
btn_minus.pack()
btn_umn.pack()
btn_dell.pack()
btn_clear.pack()
Lbl.pack()
#
запускаемглавныйцикл
root.mainloop()

Радуга

from tkinter import *

root = Tk()

#создаемтекстовоеполе
Lbl = Label(width=20)
#
описываемреакциюкнопокнанажатие
def f1(event):
    Lbl['text'] = '
красный'
def f2(event):
    Lbl['text'] = '
оранжевый'
def f3(event):
    Lbl['text'] = '
желтый'
def f4(event):
    Lbl['text'] = '
зеленый'
def f5(event):
    Lbl['text'] = '
голубой'
def f6(event):
    Lbl['text'] = '
синий'    
def f7(event):
    Lbl['text'] = '
фиолетовый'    
#
создаемкнопки
btn1 = Button(width = 20, bg = 'red')
btn2 = Button(width = 20, bg = 'orange')
btn3 = Button(width = 20, bg = 'yellow')
btn4 = Button(width = 20, bg = 'lightgreen')
btn5 = Button(width = 20, bg = 'skyblue')
btn6 = Button(width = 20, bg = 'blue')
btn7 = Button(width = 20, bg = 'purple')
#
связываемсобытиенажатиянакнопкуссоответствующейфункцией
btn1.bind('<Button-1>', f1)
btn2.bind('<Button-1>', f2)
btn3.bind('<Button-1>', f3)
btn4.bind('<Button-1>', f4)
btn5.bind('<Button-1>', f5)
btn6.bind('<Button-1>', f6)
btn7.bind('<Button-1>', f7)
#
упаковываемвиджеты
Lbl.pack()
btn1.pack()
btn2.pack()
btn3.pack()
btn4.pack()
btn5.pack()
btn6.pack()
btn7.pack()

mainloop()

ШифрАтбаш

from tkinter import *

root = Tk()
root.withdraw()
message = simpledialog.askstring('
ШифрАтбаш','Введитесекретноесообщение:')
messagebox.showinfo('
Зашифрованноесообщение', message[::-1])

root.mainloop()

Swap-шифр с разворотом

from tkinter import simpledialog, Tk, messagebox

root = Tk()
root.withdraw()

# пишем функцию, которая переворачивает сообщение
def f(message):
    #если в сообщении нечетное количество символов, добавим знак '!'
    if len(message) % 2 != 0:
        message += '!'
    #превратим строку с сообщением в список символов        
    A = list(message)
    #поменяем местами нулевой и первый символ, второй и третий, и так далее
    for i in range(0, len(A), 2):
        A[i], A[i + 1] = A[i + 1], A[i]
    #склеим строку из символов списка
    return ''.join(A)    

#бесконечный цикл
while True:
    #спросим, что делать
    task = simpledialog.askstring('Задание', 'Что сделать: зашифровать или расшифровать?')
    if task == 'зашифровать':
        #попросим ввести сообщение
        message = simpledialog.askstring('Сообщение', 'Введите секретное сообщение:')
        #обработаем сообщение нашей функцией
        new_message = f(message)
        #выведем сообщение, предварительно развернув его задом наперед
        messagebox.showinfo('Зашифрованное сообщение', new_message[::-1])
    elif task == 'расшифровать':
        message = simpledialog.askstring('Сообщение', 'Введите шифровку:')
        message = message[::-1]
        new_message = f(message)
        messagebox.showinfo('Расшифрованное сообщение', new_message)
    else:
        break
root.mainloop()

Шифр Цезаря

'У символов строки в питоне тоже есть номера (как и у элементов списка). Например,если

s = 'FOXFORD'

то s[0] = 'F', s[1] = 'O', …, s[6] = 'D'.

Если мы хотим узнать, есть ли в строке s какой-то символ, например, 'F', мы можем воспользоваться функцией find.

 

Пример.

 

s = 'FOXFORD' # строка, в которой ищем
smb = 'F' # символ, который ищем
x = s.find(smb) # номер первого вхождения символа smb в строку s
print(x) # будет напечатано 0, потому что 'F' стоит в нулевой позиции
# если бы smb = 'R', то было бы напечатано число 5. 

Если мы хотим получить символ, который находится в строке s правее символа с номером x на три позиции, то нужно написать такую строку:

print(s[x + 3])

Для того, чтобы перебрать все символы строки, можно воспользоваться циклом for в таком виде:

s = 'FOXFORD'
for smb in s:
    print(smb
)

# такая программа переберет все символы строки и напечатает каждый из них на отдельной строке    

 

Воспользуемся этими знаниями для того, чтобы реализовать шифрование с помощью шифра Цезаря.

 

from tkinter import *

root = Tk()
root.withdraw()

# напишем функцию, которая шифрует сообщение шифром Цезаря с ключом key
def f(message, key):
    '''создадим строку, состоящую из символов русского алфавита'''
    abc = 'АБВГДЕЁЖЗИЙКЛМНОПРСТУФХЦЧШЩЪЫЬЭЮЯ'
    '''удвоим ее, чтобы можно было, например, сдвигать символ Я на три позиции вправо. Теперь можно использовать любой ключ от 1 до 26
если вы хотите более длинный ключ, нужно умножить строку не на 2, а на большее число'''
    abc = abc * 2
    '''создадим переменную new_message, в которой будет записана шифровка, исходно это пустая строка'''
    new_message = ''
    '''поскольку в строке abc только большие буквы, то сделаем все буквы сообщения, которое будем шифровать, тоже большими'''
    message = message.upper()
    '''переберем все символы сообщения, для каждого узнаем его номер в строке abc'''
    for smb in message:
        x = abc.find(smb)
        ''' "сдвинем" символ на key символов вправо и прибавим к новому сообщению'''
        new_message += abc[x + key]
    return new_message        
while True:
    task = simpledialog.askstring('
Задание', 'Чтосделать:зашифроватьилирасшифровать?')
    if task == '
зашифровать':
        message = simpledialog.askstring('
Сообщение', 'Введитесекретноесообщение:')
        key = simpledialog.askstring('
Ключ', 'Скакимключомшифруем?') 
       new_message = f(message, int(key))
        messagebox.showinfo('
Зашифрованноесообщение', new_message)
    elif task == '
расшифровать':
        message = simpledialog.askstring('
Сообщение', 'Введитешифровку:')
        key = simpledialog.askstring('
Ключ', 'Скакимключомдешифруем?')
        '''
длятого,чтобырасшифроватьсообщение,нужносдвигатьсимволывлевопоалфавиту,поэтомувфункциюпередадимотрицательноезначениеключа'''
        new_message = f(message, -int(key))
        messagebox.showinfo('
Расшифрованноесообщение', new_message)
    else:
        break

root.mainloop()

 

Как сделать квадрат, у которого стороны одного цвета, а внутренность -- другого

Если вы хотите нарисовать красный квадрат и залить его красным цветом, можно написать такой код:

 

from turtle import*
color('red')
pensize(10)
pendown()
begin_fill()
for i in range(4):
    forward(100)
    left(90)
end_fill()

Если же вам хочется, чтобы цвет внутренности отличался от цвета границ, нужно поменять цвет после того как стороны будут нарисованы, но до того, как закончится заливка:

from turtle import*
color('red')
pensize(10)
pendown()
begin_fill()
for i in range(4):
    forward(100)
    left(90)
color('blue')
end_fill()

Работа с текстовыми файлами в Python

ОТКРЫТИЕ ФАЙЛА

Для каждого файла, с которым необходимо производить операции ввода-вывода, нужно связать специальный объект – поток. Открытие файла осуществляется функцией open, которой нужно передать два параметра. Первый параметр (можно также использовать именованный параметр file) имеет значение типа str, в котором записано имя открываемого файла. Второй параметр (можно также использовать именованный параметр mode) —это значение типа str, которое равно “r”, если файл открывается для чтения данных (read), “w”, если на запись (write), при этом содержимое файла очищается, и “a” — для добавления данных в конец файла (append). Если второй параметр не задан, то считается, что файл открывается в режиме чтения.

Функция open возвращает ссылку на файловый объект, которую нужно записать в переменную, чтобы потом через данный объект использовать методы ввода-вывода. Например:

input = open('input.txt', 'r')
output = open('output.txt', 'w')

ЧТЕНИЕ ДАННЫХ ИЗ ФАЙЛА

Для файла, открытого на чтение данных, можно вызывать следующие методы, позволяющие читать данные из файла. 

Метод readline() считывает одну строку из файла (до символа конца строки ‘\n’, возвращается считанная строка вместе с символом ‘\n’. Если считывание не было успешно (достигнут конец файла), то возвращается пустая строка. Для удаления символа ‘\n’ из конца файла удобно использовать метод строки rstrip(). Например:

s = s.rstrip().

Метод readlines() считывает все строки из файла и возвращает список из всех считанных строк (одна строка — один элемент списка). При этом символы ‘\n’ остаются в концах строк.

Метод read() считывает все содержимое из файла и возвращает строку, которая может содержать символы ‘\n’. Если методу read передать целочисленный параметр, то будет считано не более заданного количества символов. Например, считывать файл побайтово можно при помощи метода read(1).

ВЫВОД ДАННЫХ В ФАЙЛ

Данные выводятся в файл при помощи метода write, которому в качестве параметра передается одна строка. Этот метод не выводит символ конца строки ‘\n’ (как это делает функция print при стандартном выводе), поэтому для перехода на новую строку в файле необходимо явно вывести символ ‘\n’.

Также можно выводить данные в файл при помощи функции print, если передать ей еще один именованный параметр file, равный ссылке на открытый файл. Например:

output = open('output.txt', 'w')
print(a, b, c, file=output)

ЗАКРЫТИЕ ФАЙЛА

После окончания работы с файлом необходимо закрыть его при помощи метода close().

Пример
Следующая программа считывает все содержимое файла input.txt, записывает его в переменную s, а затем выводит ее в файл output.txt.

input = open('input.txt', 'r')
output = open('output.txt', 'w')
s = input.read()
output.write(s)
input.close()
output.close()

А вот аналогичная программа, но читающая данные посимвольно:

input = open('input.txt', 'r')
output = open('output.txt', 'w')
c = input.read(1)
while len(c) > 0:
    output.write(c)
    c = input.read(1)
input.close()
output.close()

Модуль datetime в языке Python

Для работы с датой и временем в Python'е есть модуль datetime. Подключить его можно стандартной строкой import datetime.

Обсудим некоторые возможности, предоставляемые этим модулем.

1. Получим время в формате, понятном Питону, для текущего момента:

today = datetime.datetime.now()
print(today)

2. Точно так же можно генерировать любую дату. Например, 9 мая 2000 года в формате, понятном нам, можно записать так: 9.05.2000. Для того, чтобы перевести эту дату в формат, понятный Питону, нужно написать такую строку:

day = datetime.datetime(2000,5,9) #сначала пишем год, потом месяц, потом число
print(day)

При этом считается отсечка времени в 0 часов 0 минут 0 секунд этого дня. Для того, чтобы задать еще и точное время, есть еще три параметра:

day = datetime.datetime(2000,5,9,12,30,10) # 12 часов 30 минут 10 секунд 9 мая 2000 года
print(day)

Программа целиком выглядит так:

import datetime
today = datetime.datetime.now()
print(today)
day = datetime.datetime(2000,5,9,12,30,10) # 12
часов 30 минут 10 секунд 9 мая 2000 года
print(day)

3. Из даты, записанной в формате, понятном Питону, можно получать информацию о днях, часах, минутах и секундах:

import datetime
today = datetime.datetime.now()
print('Текущий год', today.year)
print('Текущий  месяц',today.month) # нумерация месяцев ведется с 1
print('Сегодняшний день',today.day)
print('Текущий час', today.hour)
print('Текущая минута', today.minute)
print('Текущая секунда', today.second)

Также, можно узнать, например, номер дня недели (нумерация ведется с 0) с помощью такого свойства: 

today.weekday()

Напишем программу, которая определяет день недели для конкретной даты и определим день недели, в который родился Александр Сергеевич Пушкин.

import datetime
days = {0: 'понедельник', 1: 'вторник', 2: 'среда',3: 'четверг',4: 'пятница',5: 'суббота',6: 'воскресенье'}
birthday = datetime.datetime(1799, 6, 6) # день рождения А.С.Пушкина 6 июня 1799 года по новому стилю
today = datetime.datetime.now()
x = birthday.weekday()
y = today.weekday()
print('День недели, в который родился А.С. Пушкин:', days[x])
print('Сегодня:', days[y])

4. Также Питон позволяет вычитать даты друг из друга, определяя количество дней (а также часов, минут и секунд), прошедшее между двумя событиями.

import datetime
day1 = datetime.datetime(2019, 1, 1)
day2 = datetime.datetime(2019, 3, 8, 9, 0, 0)
print('От наступления Нового года до 9 утра 8 марта прошло вот столько времени:', day2-day1)
print('А так можем посчитать только дни:', (day2-day1).days)

Программа 1. Напишем программу, выводящую на экран текущее время и обновляющее его с некоторой частотой.

Сначала просто выведем текущее время:

from tkinter import Tk, Canvas
import datetime

root = Tk()
canvas = Canvas(width = 400, height = 400, bg = 'deepskyblue')
canvas.pack()

today = datetime.datetime.now()
h = today.hour
m = today.minute
s = today.second
text = canvas.create_text(200,30,anchor = 'n',fill = 'orange', font = 'Verdana 20', text = '
Текущеевремя')
text_time = canvas.create_text(200,60,anchor = 'n',fill = 'green', font = 'Verdana 18', text = str(h)+'
часов ' + str(m)+' мин '+str(s)+' сек ')

Для того, чтобы время менялось, нужно добавить бесконечный цикл, внутри которого модифицировать текст с некоторой частотой (как часто происходят изменения, определяет задержка времени sleep)

from tkinter import Tk, Canvas
import datetime, time

root = Tk()
canvas = Canvas(width = 400, height = 400, bg = 'deepskyblue')
canvas.pack()

today = datetime.datetime.now()
h = today.hour
m = today.minute
s = today.second

text = canvas.create_text(200,50,anchor = 'n',fill = 'orange', font = 'Verdana 20', text = 'Текущеевремя')
text_time = canvas.create_text(200,100,anchor = 'n',fill = 'green', font = 'Verdana 18', text = str(h)+'
часов ' + str(m)+' мин '+str(s)+' сек ')

while True:
    today = datetime.datetime.now()
    h = today.hour
    m = today.minute
    s = today.second
    canvas.itemconfig(text_time, text = str(h)+'
часов ' + str(m)+' мин '+str(s)+' сек ')
    root.update_idletasks() #
этаиследующаястрокаоченьважны,безнихвынеувидитехолст
    root.update()
    time.sleep(0.1)

Программа 2. Напишем календарь ожидания, который определяет, сколько дней осталось до значимых событий, например, до дней рождения членов вашей семьи.

Создадим файл events.txt, в котором запишем дни рождения родственников в таком формате:

День рождения мамы,05.06.2019
День рождения папы,09.08.2019
День рождения бабушки,25.12.2019
День рождения дедушки,12.10.2019
Новый год,01.02.2020

Будем считать, что все дни рождения еще только предстоят. 

Наша программа будет считывать из файла строки, каждую строку разбивать на две по запятой (с помощью команды split(',')), затем преобразовывать вторую строку (с датой) в формат, понятный Питону, вычислять разницу между этой датой и сегодняшней и выводить соответствующую информацию на экран.

Для того, чтобы это сделать, можно воспользоваться продвинутой функцией strptime из модуля datetime:

t = '01.01.2020' # строка, в которой хранится дата в формате, понятном нам
event_date = datetime.strptime(t,'%d.%m.%Y') '''переводим в формат, понятный Питону. Обратите внимание на то, что в %d.%m.%Y точки соответствуют разделителям внутри t, если бы t = '01/01/2020', то мы бы писали %d/%m/%Y, а буква Y должна быть заглавной, а не строчной, как m и d'''

Но то же самое можно сделать и вручную:

t = '01.01.2020' # строка, в которой хранится дата в формате, понятном нам
date = t.split('.') # теперь date = ['01','01','2020']
event_date = datetime.datetime(int(date[2]), int(date[1]), int(date[0])) 



ПРОГРАММА-КАЛЕНДАРЬ. ПЕРВЫЙ ВАРИАНТ.

 from tkinter import *

import datetime 
file = open('events.txt','r',encoding='utf-8')
list_events = [] # создаем список для хранения информации о днях рождения
today = datetime.datetime.now()
for line in file: # перебираем все строки в файле
    line = line.rstrip() # отрезаем у строки концевые пробелы
    kto,kogda = line.split(',') # разбиваем строку по запятой
    ##вычислим, сколько дней осталось до события и запишем в список пару (событие, оставшееся количество дней)
    #переведем дату в формат, понятный питону:
    #kogda -  строка, в которой хранится дата в формате, понятном нам, например, '01.01.2020'
    date = kogda.split('.') # теперь date = ['01','01','2020']
    event_date = datetime.datetime(int(date[2]), int(date[1]), int(date[0])) # перевели в формат, понятный питону
    print(event_date)
    days_until = (event_date - today).days # посчитали, сколько дней осталось
    list_events.append((kto, days_until)) #записываем информацию в список
file.close()

root = Tk()
c = Canvas(width = 800, height = 800, bg = 'deepskyblue')
c.pack()
c.create_text(200,50,anchor = 'w', fill = 'red', font = 'Arial 28 bold underline', text = 'Календарь дней рождений')

space = 100 # переменная, отвечающая за высоту расположения очередного текстового поля
for event in list_events: # перебираем все события
    event_name = event[0] # чей день рождения
    event_days = event[1] # сколько дней осталось
    display = event_name + ' через ' + str(event_days) + ' д.'   #сконструировали строку для вывода 
    c.create_text(100,space,anchor='w', fill='orange', font='Verdana 18 bold', text = display)
    space+=50 # следующий текст будет ниже на 50 пикселей

Недостатки программы: 

1. события не упорядочены по времени 

2. если какое-то событие уже прошло, будет отображаться отрицательное время

Исправим это.

Для того, чтобы отсортировать события, нужно добавить такой код (перед циклом for events …)

def f(x):
    return x[1]
list_events.sort(key = f)

Если событие прошло, то есть, до него отрицательное количество дней, прибавим к этому числу количество дней в году (в 2019 году 365 дней). 

ПРОГРАММА-КАЛЕНДАРЬ. ВТОРОЙ ВАРИАНТ.

from tkinter import *
import datetime 
file = open('events.txt','r',encoding='utf-8')
list_events = [] # создаем список для хранения информации о днях рождения
today = datetime.datetime.now()
for line in file: # перебираем все строки в файле
    line = line.rstrip() # отрезаем у строки концевые пробелы
    kto,kogda = line.split(',') # разбиваем строку по запятой
    ##вычислим, сколько дней осталось до события и запишем в список пару (событие, оставшееся количество дней)
    #переведем дату в формат, понятный питону:
    #kogda -  строка, в которой хранится дата в формате, понятном нам, например, '01.01.2020'
    date = kogda.split('.') # теперь date = ['01','01','2020']
    event_date = datetime.datetime(int(date[2]), int(date[1]), int(date[0])) # перевели в формат, понятный питону
    days_until = (event_date - today).days # посчитали, сколько дней осталось
    if days_until < 0:
        days_until += 365
    list_events.append((kto, days_until)) #записываем информацию в список
file.close()

root = Tk()
c = Canvas(width = 800, height = 800, bg = 'deepskyblue')
c.pack()
c.create_text(200,50,anchor = 'w', fill = 'red', font = 'Arial 28 bold underline', text = 'Календарь дней рождений')

space = 100 # переменная, отвечающая за высоту расположения очередного текстового поля
def f(x):
    return x[1]
list_events.sort(key = f)
for event in list_events: # перебираем все события
    event_name = event[0] # чей день рождения
    event_days = event[1] # сколько дней осталось
    display = event_name + ' через ' + str(event_days) + ' д.'   #сконструировали строку для вывода 
    c.create_text(100,space,anchor='w', fill='orange', font='Verdana 18 bold', text = display)
    space+=50 # следующий текст будет ниже на 50 пикселей

Комментировать
Свидетельство участника экспертной комиссии
Оставляйте комментарии к работам коллег и получите документ бесплатно!
Подробнее
Также Вас может заинтересовать
Информатика
Конспект занятия по информатики для дошкольников «Сценарий открытого занятия по робототехнике "Умный волчок".»
Информатика
Конспект занятия по информатики для 1 класса «Конспект урока по информатике. "Цепочки"»
Информатика
Факультативы по информатики для 5 класса «Образовательный проект "Графический дизайнер"»
Комментарии
Добавить
публикацию
После добавления публикации на сайт, в личном кабинете вы сможете скачать бесплатно свидетельство и справку о публикации в СМИ.
Cвидетельство о публикации сразу
Получите свидетельство бесплатно сразу после добавления публикации.
Подробнее
Свидетельство за распространение педагогического опыта
Опубликует не менее 15 материалов и скачайте бесплатно.
Подробнее
Рецензия на методическую разработку
Опубликуйте материал и скачайте рецензию бесплатно.
Подробнее
Свидетельство участника экспертной комиссии
Стать экспертом и скачать свидетельство бесплатно.
Подробнее
Помощь