Данная статья написана для тех, кто только начал изучать Python. В ней я пошагово опишу создание простого счетчика слов из txt-файлов, применяя Tkinter. Исходный код написан под Python 2.7, в конце статьи я добавлю несколько комментариев относительно того, как перенести его под 3.6
С чего начинаем?
Никаких незаурядных лестниц в программе не будет, так что рекомендую писать в IDLE; конечно же, без проблем можно писать и в PyCharm’е, и в Эклипсе.
Время создать первую и последнюю функцию, которая, собственно, будет выполнять все подсчёты:
def counter(): with open(filename) as file: #открываем через менеджер контекста, filename определим позже text = file.read() #считываем содержимое text = text.replace(«n», » «) text = text.replace(«,», «»).replace(«.», «»).replace(«?», «»).replace(«!», «»).replace(«—», «») text = text.lower() #убираем верхний регистр words = text.split() #создаем в список, где каждый элемент — слово
Итак, что выполняет эта функция?
Пишем простую программу на Python используя функции: счётчик слов
Всё очевидно: открывает файл, считываем содержимое, убирает всякие символы и создает список из содержимого файла. Не стоит забывать убрать верхний регистр методом lower для корректной дальнейшей проверки на повторение слов. Дальше мы будем обрабатывать этот список. Фактически, считав длину этого списка функцией len, нам уже будет известно количество слов.
Количество уникальных слов
Чтобы посчитать кол-во уникальных слов, создадим ещё один список, в который будет через цикл заносить слова, которых ещё в нём не было:
nonrep_words = list() for word in words: if word in nonrep_words: #проверка, «есть ли данный элемент уже в списке?» pass #если есть, то ничего не делаем else: nonrep_words.append(word) #если нет, то добавляем
Далее мы просто будет считывать длину списка nonrep_words.
Графическая оболочка
Для начала нам следует подключить соответствующие модули в нашу программу:
import Tkinter, Tkconstants, tkFileDialog from Tkinter import *
Теперь после определения нашей главной функции напишем код, который будет отображать главное окно, название нашей программки, кнопку «Импортировать файл» и поле вывода:
root = Tk() #создаем окно frame = Frame(root) #используем фрейм для позиционирования frame.grid() #используем упаковщик grid title = Label(frame, text=»Word counter») #название программы title.grid(row=1, column=1) #упаковываем grid’ом, позицию элементов можно менять, изменяя параметры row и column import_btn = Button(frame, text=»Import file. «, command=counter) #создаём кнопку import_btn.grid(row=2, column=1, pady=4) output = Text(frame, width=45, height=3) #создаём поле вывода output.grid(row=4, columnspan=3) root.mainloop() #запускаем цикл обработки событий
Вообще-то можно и не использовать фрейм для кнопки, лейбла и текстового поля, но если вы захотите на досуге добавить в дальнейшем ещё несколько каких-либо функций, то фрейм будет полезен для позиционирования.
Счётчик кликов на python (питон) tkinter
При создании кнопки мы забиндили её на функцию counter.
Импорт файла и вывод
В начало определения функции counter добавим строчки:
output.delete(«0.0″,»end») filename = tkFileDialog.askopenfilename()
Здесь всё просто: чистим поле вывода методом delete, затем открываем файл методом askopenfilename и передаём его имя переменной filename.
Далее в конец функции добавим:
output.insert(«end»,»Amount of words: %dn» % len(words)) output.insert(«end»,»Amount of nonrepeatable words: %dn» % len(nonrep_words))
Здесь мы выводим длину двух списков: списка всех слов и списка уникальных слов.
Весь код программы:
import Tkinter, Tkconstants, tkFileDialog from Tkinter import * def counter(): output.delete(«0.0″,»end») filename = tkFileDialog.askopenfilename() with open(filename) as file: text = file.read() text = text.replace(«n», » «) text = text.replace(«,», «»).replace(«.», «»).replace(«?», «»).replace(«!», «»).replace(«—», «») text = text.lower() words = text.split() nonrep_words = list() for word in words: if word in nonrep_words: pass else: nonrep_words.append(word) output.insert(«end»,»Amount of words: %dn» % len(words)) output.insert(«end»,»Amount of nonrepeatable words: %dn» % len(nonrep_words)) root = Tk() frame = Frame(root) frame.grid() title = Label(frame, text=»Word counter») title.grid(row=1, column=1) import_btn = Button(frame, text=»Import file. «, command=counter) import_btn.grid(row=2, column=1, pady=4) output = Text(frame, width=45, height=3) output.grid(row=4, columnspan=3) root.mainloop()
Для версии 3.6
Для данной версии питона должны быть внесены следующие изменения:
- При подключении модулей tkinter пишем с маленькой буквы; tkFileDialog убираем и пишем вместо него from tkinter import filedialog
- Соответственно, при импорте файла tkFileDialog.askopenfilename заменяем на filedialog.askopenfilename
- Возможно, потребуется дописать encoding=’utf-8′ при открытии файла через менеджер
контекста
Источник: habr.com
Цикл со счетчиком
Цикл со счетчиком используется в тех случаях, когда мы четко знаем, какое количество повторений нам необходимо сделать. В языке Basic этот цикл записывается следующим образом:
for X=НачальноеЗначение to КонечноеЗначение Step Шаг
Тело цикла
Next X
Разберем эту запись более подробно:
Первая строка служит началом цикла и определяет количество повторений. Количество повторений задается с помощью специальной переменной, которая меняется от заданного начального значения к конечному с определенным шагом. Каждый раз, когда переменная увеличивает свое значение на шаг, цикл команду или серию команд, называемую телом цикла. Когда переменная достигает конечного значения, выполнение цикла прекращается. Количество шагов, необходимое для достижения переменной своего конечного значения и определяет количество повторений цикла.
Пример:
for A=1 to 10 Step 1
Тело цикла
Next X
В данном цикле за количество повторений отвечает переменная А. Значение этой переменной будет изменяться от единицы (начальное значение) до 10(конечное знанчение) с шагом 1. Таким образом, переменная А будет принимать следующие значения:1,2,3,4,5,6,7,8,9,10
1 — при первом выполнении цикла
2 — при втором выполнении
3 — при третьем выполнении
.
9 — при девятом выполнении цикла
10 — при десятом и финальном выполнении
Таким образом, данный цикл совершит 10 повторений
Вторая строка — тело цикла. Тело цикла — одна или несколько команд, которые будут повторяться ровно столько раз, сколько будет определено первой строкой.
Третья строка — конец цикла. Дословно это выглядит примерно как «Повторение закончено, переходим к следующему значению переменной А»
Чтобы сделать 10 повторений вовсе не обязательно использовать начальное значение 1 и конечное 10. 10 повторений можно реализовать и другим способом:
for A=30 to 75 Step 5
В этом случае переменная А будет принимать следующие значения: 30,35,40,45,50,55,60,65,70,75, что обеспечит те же 10 повторений цикла.
Можно и иначе: for A=0 to 0.9 Step 0.1
В этом случае цикл совершит все те же 10 повторений, а переменная А будет принимать следующие значения: 0, 0.1, 0.2 ,0.3, 0.4, 0.5, 0.6, 0.7, 0.8, 0.9
Количество повторений можно легко вычислить по формуле: (Конечное значение-Начальное значение)/Шаг + 1
Принудительный выход из цикла
Для принудительного выхода из цикла можно использовать команду Exit For, например:
for i=1 to 50 step 1
if i=10 then exit for
next x
Значение счетчика данного цикла дойдет всего до 10, после чего произойдет принудительное завершение цикла
Источник: savantheon.ru
Как создать приложение-счетчик, используя только чистые функции
В этой статье вы столкнетесь с проблемой реализации простого приложения Counter на JavaScript с использованием только чистых функций.
Чистые функции
Чистая функция — это функция с двумя основными свойствами:
- Давая тот же ввод, он возвращает тот же вывод
- Не имеет побочных эффектов. Побочным эффектом является любое общение с внешней средой.
Тривиальный пример — функция sum .
function sum(x, y)
Давая один и тот же ввод, sum всегда возвращает один и тот же вывод. Он не делает ничего, кроме вычисления суммы двух входных данных, поэтому у него нет побочных эффектов.
console.log(sum(1,2));
Возможно, вы слышали, что чистые функции великолепны. Их легче тестировать, понимать, отлаживать и так далее.
При этом давайте поставим реальный вопрос.
Можете ли вы создавать простые вещи, используя только чистые функции?
Если ваш ответ да, попробуйте создать приложение Counter, используя только чистые функции.
Приложение счетчика
Приложение счетчика показывает счетчик на экране и позволяет увеличивать или уменьшать его.
Давайте посмотрим, что это включает в себя:
- показ счетчика экрана
- хранение счетчика
- прослушивание событий кликов DOM
- увеличение/уменьшение счетчика
Допустим, вы пытаетесь написать функцию, показывающую число на экране, как показано ниже.
let count = 0; function renderCount(count)< document.getElementById(«panel»).innerHTML = ` $ `; > renderCount(count);
Является ли renderCount чистым или нечистым?
Это нечисто. Он изменяет DOM. Это побочный эффект, делающий его нечистым.
Более того, нам нужно прослушивать события кликов DOM и реагировать на них.
function renderCount(count) < document.getElementById(«panel»).innerHTML = `
$ > Increment
` > function updateCount()
Прослушивание событий DOM является побочным эффектом.
Вторая задача состоит в том, чтобы изменить счет.
Предположим, например, что вы пишете функцию, updateCount увеличивающую счетчик.
let count = 0; function updateCount() < count = count + 1; renderCount(count); >renderCount(count);
Является ли updateCount чистым или нечистым?
Это нечистая функция, потому что она изменяет переменную за пределами своей локальной области видимости.
Так как же тогда мы можем реализовать простое приложение Counter, используя только чистые функции?
Одним из возможных ответов является использование потока Model-View-Update.
Обновление вида модели
Model-View-Update разбивает приложение на три основные части, как следует из названия.
Модель сохраняет все данные приложения, которые могут измениться.
Представление — это функция, которая берет модель и создает для нее HTML.
Обновление — это функция, принимающая модель и сообщение и возвращающая новую модель.
В этом примере сообщение представляет собой простую строку.
Вот как может выглядеть исходная модель.
const initialModel =
Представление берет модель и создает HTML-код, отображающий число и две кнопки.
function View(model) < return ` $ > Increment > Decrement ` >
Является ли функция View чистой?
Да, это. Он получает объект модели и создает строку HTML. Вот и все. Он не изменяет DOM и не прослушивает события DOM.
Обновление берет модель и возвращает новую модель, обрабатывая строковые сообщения Increment и Decrement .
function updateCounter(model, message) < switch(message)< case ‘Increment’: return < number: model.number + 1 >case ‘Decrement’: return < number: model.number — 1 >default: return model; > >
Является ли функция updateCounter чистой?
Да, это. Он берет модель и сообщение и создает новый объект модели. Он не изменяет входной объект модели.
Нечистая библиотека
Как мы можем заставить исходную модель, функцию обновления и просмотра работать вместе?
Как мы можем заставить приложение счетчика работать? Приложение должно отображать количество на экране, оно должно прослушивать события и изменять количество.
Ответ подразумевает, что нам нужна специальная библиотека для решения этих нечистых задач.
Попробуем его построить.
Функция render принимает модель и функцию представления. Он создает HTML с помощью функции просмотра и обновляет DOM. Это нечистая функция, использующая чистую функцию представления.
function render(model, View)
Нам нужно обрабатывать события DOM. Функция dispatch использует чистую функцию обновления для создания нового значения модели. Затем он использует это значение для обновления переменной model .
Функция dispatch нечиста, потому что она изменяет переменную model вне своей локальной области видимости. Он также вызывает render нечистую функцию.
Функция, использующая другие нечистые функции, является нечистой. render нечисто, поэтому dispatch тоже нечисто.
let model; let update; function dispatch(message)
Функция start инициализирует модель и отображает исходные значения на экране с помощью функции render . render нечисто, поэтому start тоже нечисто.
start изменяет переменные за пределами своей локальной области, так что еще один побочный эффект.
function start(initialModel, View, updateArg)
Теперь, когда мы запускаем приложение, мы связываем вместе исходную модель, представление и функции обновления.
start(initialModel, View, updateCounter)
Последние мысли
Чистая функция — это функция, вычисляющая новое значение на основе своих входных данных и не имеющая побочных эффектов.
Написание простого приложения, использующего только чистую функцию, становится почти невозможным в отсутствие фреймворка, выполняющего нечистую логику.
Поток Model-View-Update предлагает решение для написания приложения с использованием только чистых функций.
Источник: digitrain.ru