Оглавление
Плохой пример
Давайте рассмотрим действительно плохой пример. Допустим, мы объявили функцию и хотим проверить, хорошо ли она работает.
def square_of(num): return num * num
Эта функция просто возвращает квадрат числа, переданного в качестве аргумента. Проверить ее работу мы можем так:
print(square_of(2)) print(square_of(3)) print(square_of(4)) # Вывод: 4 9 16
Кажется, все работает. Но на практике у нас будет куда больше строк кода. Кроме того, в коде может быть много функций , выводящих разные вещи в область output-а. В в таких условиях можно не сразу понять, какой именно вывел ту или иную строку в консоли.
Хороший тон — добавить небольшое описание в содержимое , чтобы видеть, какую именно информацию он выводит.
print('Квадрат 2:', square_of(2)) print('Квадрат 3:', square_of(3)) print('Квадрат 4:', square_of(4)) # Вывод: Квадрат 2: 4 Квадрат 3: 9 Квадрат 4: 16
Выглядит гораздо лучше. Но согласитесь, прописывать все это каждый раз довольно утомительно. К тому же, после дебага нам скорее всего придется все эти print-ы удалять.
# Методы Entry
Методы для виджетов — это встроенные функции, которые позволяют менять объект или получать информацию о нем.
Виджет Entry имеет ряд методов. Основные из них:
- : вставляет в текстовое поле строку по определенному индексу;
- : возвращает введенный в текстовое поле текст;
- : удаляет символ по индексу . Если указан параметр , то удаление производится до индекса . Чтобы удалить до конца, в качестве второго параметра можно использовать значение .
Используем методы в программе:
12345678910111213141516171819202122232425262728293031
При запуске программы в оба текстовых поля добавляется текст по умолчанию:
12
Кнопка Clear очищает оба поля, вызывая метод :
123
Вторая кнопка, используя метод , получает введенный текст:
12
Как видно из примера, нам необязательно обращаться к тексту в через переменные типа , можно это сделать напрямую через метод .
Установка PyAutoGUI в Python
Процесс установки PyAutoGUI довольно прост для всех операционных систем. Однако существует несколько зависимостей для Mac и Linux, которые необходимо установить перед установкой и использованием библиотеки PyAutoGUI в программах.
Windows
Для Windows PyAutoGUI не имеет зависимостей. Просто запустите следующую команду в командной строке, и установка будет завершена.
$ pip install PyAutoGUI
Mac
Для Mac сначала необходимо последовательно установить модули pyobjc-core и pyobjc. Ниже приведены команды, которые необходимо последовательно запустить в терминале для успешной установки:
$ pip3 install pyobjc-core $ pip3 install pyobjc $ pip3 install pyautogui
Linux
Для Linux единственная зависимость – это python3-xlib (для Python 3). Чтобы установить его, а затем pyautogui, запустите в своем терминале две указанные ниже команды:
$ pip3 install python3-xlib $ pip3 install pyautogui
Условный оператор
В языке python синтаксис обладает интересной особенностью: дело в том, что в коде нет операторных скобок ( или ); вместо них отступы указывают, какие операторы выполнять внутри той или иной конструкции.
Зачем отступы и где их ставить?
1 2 3 4 |
if x > : if x < 2: else: оператор |
Следует обратить внимания, что знак сравнения в Питоне записывается, как два знака :
1 2 3 4 5 6 |
if x < : блок1 elif x == : # сравнение! блок2 else: блок3 |
Другой пример использования условия:
1 2 3 4 5 6 |
if x < : print('мало') elif x == : print('средне') else: print('много') |
Сложные условия
- Использование двойных неравенств разрешено:
1 2 3 4 |
if < x < 2: if < y < 2: else: оператор |
Пример использования условия c :
1 2 3 4 5 6 |
if x < : print('мало') elif - <= x <= : print('средне') else: print('много') |
Кроме того, можно применять логический оператор (И):
if x >= 30 and x <= 40: ... |
Использование с оператором :
site = "my.ru" if "ru" in site: print("Условие выполнено!") # Условие выполнено! |
Кроме того, можно применять логический оператор (ИЛИ):
site = "my.ru" if "my" in site or site.endswith(".ru"): # заканчивается на ... print("Условие выполнено!") |
Аналог тернарного оператора:
uchenik_1 = 5 uchenik_2 = 2 otlichnik = "первый ученик" if uchenik_1 > uchenik_1 else "второй ученик" print(otlichnik) # первый ученик |
Задание Python 1_6: Запрашивается количество часов и заработок в час. Рассчитать зарплату. Если работник работал более 40 часов, — то зарплата умножается на коэффициент 1,5. Оформить в формате дружелюбного интерфейса.
Пример: Дан год. Определить високосный ли год или нет? Вывести или (логическое значение).Указания: Год является високосным если он кратен 4, но при этом не кратен 100, либо кратен 400.
Решение:
year = 2017 is_true = year % 4 == and (year % 100 != or year % 400 == ) print(is_true) |
Задание Python 1_7: Напишите программу, которая определяет, верно ли, что введённое число – четырёхзначное. Вывести или (логическое значение).
Задание Python 1_8: Напишите программу, которая вводит с клавиатуры номер месяца и определяет, сколько дней в этом месяце. Предусмотреть сообщение об ошибке в случае ввода неверного числа.
! Решения заданий можно попросить у администратора, выслав письмо с запросом на электронный адрес (внизу веб-страницы). В письме укажите Ваши ФИО, город, должность (учитель/ученик/студент). Укажите, занимаетесь ли самостоятельно и номер урока, решения которого необходимо выслать.
Использование
Теперь, несмотря на то, что существует множество классов, в которых реализована возможность использования , нам интересно посмотреть, как она работает, чтобы мы могли написать ее сами!
Во-первых, оператор with сохраняет ссылку на объект в объекте контекста.
Объект контекста — это объект, который содержит дополнительную информацию о своем состоянии, такую как модуль или область видимости и т. д. Это полезно, поскольку мы можем сохранять или восстанавливать состояние этого объекта.
А теперь идем дальше. После создания объекта контекста он вызывает метод dunder для объекта.
Оператор __enter__ фактически выполняет работу по открытию ресурсов для объекта, таких как файл или сокет. Обычно при необходимости мы можем реализовать его для сохранения состояния объекта контекста.
Теперь помните ключевое слово ? Это фактически возвращает объект контекста. Поскольку нам нужен объект, возвращаемый функцией open(), мы используем ключевое слово для получения объекта контекста.
Использование необязательно, особенно если у вас есть ссылка на исходный объект контекста в другом месте.
После этого мы входим во вложенный блок операторов.
После того, как вложенный блок закончился, ИЛИ, если в нем есть исключение, программа всегда выполняет для объекта контекста.
Это первая функция безопасности, о которой мы говорили ранее. Итак, что бы ни случилось, мы всегда будем использовать для освобождения ресурсов и выхода из контекста.
Наконец, если возможно, может быть реализован так, чтобы восстановить состояние объекта контекста, чтобы он вернулся в то состояние, к которому он принадлежал.
Чтобы было понятнее, давайте рассмотрим пример создания нашего собственного диспетчера контекста для класса.
Общие функции
В этом разделе мы собираемся охватить некоторые из наиболее часто используемых функций из библиотеки PyAutoGUI.
position()
Прежде чем мы сможем использовать функции PyAutoGUI, нам нужно импортировать их в нашу программу:
import pyautogui as pag
Эта функция position() сообщает нам текущее положение мыши на экране:
pag.position()
Вывод:
Point (x = 643, y = 329)
onScreen()
Функция onScreen() сообщает нам, существует ли на экране точка с координатами x и y:
print(pag.onScreen(500, 600)) print(pag.onScreen(0, 10000))
Вывод:
True False
Здесь мы видим, что первая точка существует на экране, но вторая точка выходит за пределы.
size()
Функция size() находит высоту и ширину (разрешение) экрана.
pag.size()
Вывод:
Size (width = 1440, height = 900)
Ваш результат может отличаться и будет зависеть от размера вашего экрана.
Получение данных input
Получение данных — один из важнейших компонентов любой программы. Например, простой калькулятор получает данные от пользователя, когда тот вводит с клавиатуры числа, нажимает на элементы интерфейса калькулятора, даже вставляет скопированное выражение.
Входные данные в Python 3 обычно сохраняются в переменных или списках, чтобы их можно было обработать. Синтаксис операции ввода выглядит так:
a = input()
Если выполнить данный код в интерактивном режиме в IDLE, курсор переместиться новую строку и программа будет ожидать ввода данных, которые будут записаны в переменную .
Кроме того, оператор позволяет перед запросом ввода вывести какой-либо текст, например:
a = input("Введите своё имя")
Таким образом можно дать подсказку пользователю, что нужно ввести. В отличие от строго типизированных языков программирования Python позволяет вводить любые типы данных без их явного указания. То есть пользователь может ввести как строку, так и число. Синтаксис команды ввода от этого не изменится.
Однако, часто нужно получить данные определенного типа, например, калькулятор ожидает число, а пользователь вводит строку. Для этого используется приведение типа, в данном случае к целочисленному:
a = int(input("Введите целое число"))
Если пользователь введет строку или дробь, интерпретатор Python возбудит исключение. Поэтому для ввода используют оператор try-except:
try: a = int(input("Введите целое число")) except: print("Ошибка, введено не целое число")
Дополнительно про проверку, введено ли число, можно прочитать в отдельной статье.
Также можно запрашивать ввод в бесконечном цикле, выход из которого осуществляется только тогда, когда пользователь вводит данные нужного типа:
while True: try: a = int(input("Введите целое число: ")) except: print("Вы ввели не целое число, ошибка") continue break
Функция в Python
Если какая то задача выполняется многократно в программе, то не обязательно эту задачу расписывать во всех разделах программы, достаточно поместить код в функцию и в последующем вызывать эту функцию по мере необходимости.
Напишем функцию, которая вычисляет квадрат своего аргумента и выводит на экран:
>>> def square(number):
… «»»Вычисление квадрата числа»»»
… (number 2)
…
>>> square(5)25
>>> square(124.45)15487.802500000002
Определение функции начинается с ключевого слова def, за которым следует имя функции — square. Имя функции, как и имена переменных рекомендуется писать с букв нижнего регистра, а в именах, состоящих из нескольких слов, составляющие должны разделяться символами подчеркивания. Далее в круглых скобках записываются параметры (аргументы) функции, разделенные запятыми. Функция square имеет только один аргумент с именем number — значение, возводимое в квадрат. В случае отсутствия параметров у функции пустые круглые скобки обязательны. В конце строки за параметрами всегда ставится двоеточие ().
После двоеточия новая строка должна идти с отступом (4 пробела). Все строки с отступом образуют тело или блок функции. В «Руководстве по стилю кода Python» указано, что первой строкой блока функции должна быть doc-строка, кратко поясняющая назначение функции: «»»Вычисление квадрата числа»»». Сам код в теле функции состоит всего из одной строки (number 2).
Команда squre(5) вызывает функции square() и передает ей значение аргумента, для выполнения команды . Функция возводит число в квадрат и выводит на экран.
args, returncode, stdout
Разберём subprocess более подробно
python3 subprocess_lesson.py
total 12
drwxrwxr-x 2 andrei andrei 4096 Nov 30 17:57 .
drwxrwxr-x 3 andrei andrei 4096 Nov 30 17:57 ..
-rw-rw-r— 1 andrei andrei 195 Nov 30 16:51 subprocess_lesson.py
p1
CompletedProcess(args=’ls -la’, returncode=0)
p1.args
ls -la
p1.returncode
0
p1.stdout
None
Чтобы не выводить результат в терминал а сохранить в переменную, нужно
воспользоваться опцией capture_output=True
python3 subprocess_lesson.py
b’total 12\ndrwxrwxr-x 2 andrei andrei 4096 Nov 30 18:41 .\ndrwxrwxr-x 3 andrei andrei 4096 Nov 30 18:40 ..\n-rw-rw-r— 1 andrei andrei 92 Nov 30 18:41 subprocess_lesson.py\n’
Если byte вывод вам не нравится его можно декодировать
python3 subprocess_lesson.py
total 12
drwxrwxr-x 2 andrei andrei 4096 Nov 30 18:41 .
drwxrwxr-x 3 andrei andrei 4096 Nov 30 18:40 ..
-rw-rw-r— 1 andrei andrei 101 Nov 30 18:46 subprocess_lesson.py
Или можно использовать опцию text=True
total 12
drwxrwxr-x 2 andrei andrei 4096 Nov 30 18:41 .
drwxrwxr-x 3 andrei andrei 4096 Nov 30 18:40 ..
-rw-rw-r— 1 andrei andrei 101 Nov 30 18:46 subprocess_lesson.py
Ещё один вариант перенаправления вывода stdout=subprocess.PIPE
python3 subprocess_lesson.py
total 12
drwxrwxr-x 2 andrei andrei 4096 Nov 30 18:41 .
drwxrwxr-x 3 andrei andrei 4096 Nov 30 18:40 ..
-rw-rw-r— 1 andrei andrei 101 Nov 30 18:46 subprocess_lesson.py
Вывод в файл
Встроенные функции
print (x, sep = 'y') печатает x объектов, разделенных y
len (x) возвращает длину x (s, L или D)
min (L ) возвращает минимальное значение в L
max (L) возвращает максимальное значение в L
sum (L) возвращает сумму значений в диапазоне L
range(n1,n2,n) (n1, n2, n) возвращает последовательность чисел от n1 до n2 с шагом n
abs (n) возвращает абсолютное значение n
round (n1, n) возвращает число n1, округленное до n цифр
type (x) возвращает тип x (string, float, list, dict…)
str (x) преобразует x в string
list (x) преобразует x в список
int (x) преобразует x в целое число
float (x) преобразует x в число с плавающей запятой
help (s) печатает справку о x
map (function, L) Применяет функцию к значениям в L
Пример программы
В программах ввод и вывод взаимосвязаны, например, пользователь вводит данные, программа обрабатывает их и выводит обратно на экран. Даже если программа не консольная, а с графическим интерфейсом, то если пользователь нажал на кнопку «Запустить», он всё равно ввел в программу данные, которые дали сигнал для выполнения какой-либо функции.
Приведём пример консольной программы, которая выполняет операции над числами. То есть осуществляет ввод и вывод данных в консоль на Python 3. Мы вводим два числа, выбираем операцию, которую надо совершить над ними: сложение, вычитание, умножение или деление. Программа вычисляет результат и выводит его.
# Операции над двумя числами def sum(a, b): return a + b def sub(a, b): return a - b def mult(a, b): return a * b def div(a, b): return a / b def main(): while True: try: #Вводим числа a = float(input("Введите первое число: ")) b = float(input("Введите второе число: ")) c = int(input("Номер операции:\n1) +\n2) -\n3) *\n4) /\n")) except: print("Нужно ввести число, попробуйте ещё раз ...\n") continue # Повторяем ввод, если введено не число break # Выходим из цикла, если числа введены правильно # Применяем нужную операцию в зависимости от ввода cond = {1 : sum(a, b), 2 : sub(a, b), 3 : mult(a, b), 4 : div(a, b)} # Выводим результат операции print(cond) if __name__ == "__main__": main()
Вот пример работы:
Таким образом у нас получился консольный калькулятор. Как было написано выше, для красоты можно сделать ввод и вывод цветным, меняя цвет фона и вводимых символов.
Также на нашем сайте есть пример калькулятора с графическим интерфейсом. Для этого в ней была использована библиотека Tkinter.
Syntax of input() function
The syntax of the function is:
input("Your name: ") |
As parameter it takes a string, that is printed in the terminal.This is an optional parameter, sometimes called .
The parameter is a text printed to the screen. If we speak about text we say string.
You can print information to the user, i.e. what value they should enter.
The input() function:
- Use the input() function to get Python user input from keyboard
- Press the enter key after entering the value.
- The program waits for user input indefinetly, there is no timeout.
- The input function returns a string, that you can store in a variable
- Terminate with Ctrl-D (Unix) or Ctrl-Z+Return (Windows)
Поле ввода Entry
Последнее обновление: 13.05.2017
Элемент Entry представляет поле для ввода текста. Конструктор Entry принимает следующие параметры:
Entry(master, options)
Где master — ссылка на родительское окно, а options — набор следующих параметров:
-
bg: фоновый цвет
-
bd: толщина границы
-
cursor: курсор указателя мыши при наведении на текстовое поле
-
fg: цвет текста
-
font: шрифт текста
-
justify: устанавливает выравнивание текста. Значение LEFT выравнивает текст по левому краю, CENTER — по центру,
RIGHT — по правому краю -
relief: определяет тип границы, по умолчанию значение FLAT
-
selectbackground: фоновый цвет выделенного куска текста
-
selectforeground: цвет выделенного текста
-
show: задает маску для вводимых символов
-
state: состояние элемента, может принимать значения NORMAL (по умолчанию) и DISABLED
-
textvariable: устанавливает привязку к элементу StringVar
-
width: ширина элемента
Определим элемент Entry и по нажатию на кнопку выведем его текст в отдельное окно с сообщением:
from tkinter import * from tkinter import messagebox def show_message(): messagebox.showinfo("GUI Python", message.get()) root = Tk() root.title("GUI на Python") root.geometry("300x250") message = StringVar() message_entry = Entry(textvariable=message) message_entry.place(relx=.5, rely=.1, anchor="c") message_button = Button(text="Click Me", command=show_message) message_button.place(relx=.5, rely=.5, anchor="c") root.mainloop()
Для вывода сообщения здесь применяется дополнительный модуль messagebox, содержащий функцию showinfo(), которая собственно и выводит введенный в текстовое поле текст.
Для получения введенного текста используется комп StringVar, как было описано в одной из предыдущих тем.
Теперь создадим более сложный пример с формой ввода:
from tkinter import * from tkinter import messagebox def display_full_name(): messagebox.showinfo("GUI Python", name.get() + " " + surname.get()) root = Tk() root.title("GUI на Python") name = StringVar() surname = StringVar() name_label = Label(text="Введите имя:") surname_label = Label(text="Введите фамилию:") name_label.grid(row=0, column=0, sticky="w") surname_label.grid(row=1, column=0, sticky="w") name_entry = Entry(textvariable=name) surname_entry = Entry(textvariable=surname) name_entry.grid(row=0,column=1, padx=5, pady=5) surname_entry.grid(row=1,column=1, padx=5, pady=5) message_button = Button(text="Click Me", command=display_full_name) message_button.grid(row=2,column=1, padx=5, pady=5, sticky="e") root.mainloop()
Методы Entry
Элемент Entry имеет ряд методов. Основные из них:
-
insert(index, str): вставляет в текстовое поле строку по определенному индексу
-
get(): возвращает введенный в текстовое поле текст
-
delete(first, last=None): удаляет символ по индексу first. Если указан параметр last, то удаление производится до индекса last. Чтобы удалить до конца, в качестве второго параметра можно
использовать значение END.
Используем методы в программе:
from tkinter import * from tkinter import messagebox def clear(): name_entry.delete(0, END) surname_entry.delete(0, END) def display(): messagebox.showinfo("GUI Python", name_entry.get() + " " + surname_entry.get()) root = Tk() root.title("GUI на Python") name_label = Label(text="Введите имя:") surname_label = Label(text="Введите фамилию:") name_label.grid(row=0, column=0, sticky="w") surname_label.grid(row=1, column=0, sticky="w") name_entry = Entry() surname_entry = Entry() name_entry.grid(row=0,column=1, padx=5, pady=5) surname_entry.grid(row=1,column=1, padx=5, pady=5) # вставка начальных данных name_entry.insert(0, "Tom") surname_entry.insert(0, "Soyer") display_button = Button(text="Display", command=display) clear_button = Button(text="Clear", command=clear) display_button.grid(row=2, column=0, padx=5, pady=5, sticky="e") clear_button.grid(row=2, column=1, padx=5, pady=5, sticky="e") root.mainloop()
При запуске программы сразу же в оба текстовых поля добавляется текст по умолчанию:
name_entry.insert(0, "Tom") surname_entry.insert(0, "Soyer")
Кнопка Clear очищает оба поля, вызывая метод delete:
def clear(): name_entry.delete(0, END) surname_entry.delete(0, END)
Вторая кнопка, используя метод get, получает введенный текст:
def display(): messagebox.showinfo("GUI Python", name_entry.get() + " " + surname_entry.get())
Причем, как видно из примера, нам необязательно обращаться к тексту в Entry через переменные типа StringVar, мы можем это сделать напрямую через метод get.
НазадВперед
Вывод данных. Функция print()
Что такое функция в программировании, узнаем позже. Пока будем считать, что – это такая команда языка Python, которая выводит то, что в ее скобках на экран.
>>> print(1032) 1032 >>> print(2.34) 2.34 >>> print("Hello") Hello
В скобках могут быть любые типы данных. Кроме того, количество данных может быть различным:
>>> print("a:", 1) a: 1 >>> one = 1 >>> two = 2 >>> three = 3 >>> print(one, two, three) 1 2 3
Можно передавать в функцию как непосредственно литералы (в данном случае «a:» и 1), так и переменные, вместо которых будут выведены их значения. Аргументы функции (то, что в скобках), разделяются между собой запятыми. В выводе вместо запятых значения разделены пробелом.
Если в скобках стоит выражение, то сначала оно выполняется, после чего уже выводит результат данного выражения:
>>> print("hello" + " " + "world") hello world >>> print(10 - 2.5/2) 8.75
В предусмотрены дополнительные параметры. Например, через параметр можно указать отличный от пробела разделитель строк:
>>> print("Mon", "Tue", "Wed", "Thu", ... "Fri", "Sat", "Sun", sep="-") Mon-Tue-Wed-Thu-Fri-Sat-Sun >>> print(1, 2, 3, sep="//") 1//2//3
Параметр позволяет указывать, что делать, после вывода строки. По-умолчанию происходит переход на новую строку. Однако это действие можно отменить, указав любой другой символ или строку:
>>> print(10, end="") 10>>>
Обычно используется не в интерактивном режиме, а в скриптах, когда несколько выводов подряд надо разделить не переходом на новую строку, а, скажем, запятыми. Сам переход на новую строку обозначается символом ‘\n’. Если присвоить это значение параметру , то никаких изменений в работе функции вы не увидите, так как это значение и так присвоено по-умолчанию:
>>> print(10, end='\n') 10 >>>
Однако, если надо отступить на одну дополнительную строку после вывода, то можно сделать так:
>>> print(10, end='\n\n') 10 >>>
Следующее, что стоит рассказать о функции – это использование форматирования строк. На самом деле оно никакого отношения к не имеет, а применяется к строкам. Однако часто форматирование используется в сочетании с вызовом функции .
Форматирование может выполняться в так называемом старом стиле или с помощью строкового метода . Старый стиль также называют Си-стилем, так как он схож с тем, как происходит вывод на экран в языке C. Рассмотрим пример:
>>> pupil = "Ben" >>> old = 16 >>> grade = 9.2 >>> print("It's %s, %d. Level: %f" % ... (pupil, old, grade)) It's Ben, 16. Level: 9.200000
Здесь вместо трех комбинаций символов , , подставляются значения переменных pupil, old, grade. Буквы , , обозначают типы данных – строку, целое число, вещественное число. Если бы требовалось подставить три строки, то во всех случаях использовалось бы сочетание .
Хотя в качестве значения переменной grade было указано число 9.2, на экран оно вывелось с дополнительными нулями. Однако мы можем указать, сколько требуется знаков после запятой, записав перед буквой точку с желаемым числом знаков в дробной части:
>>> print("It's %s, %d. Level: %.1f" ... % (pupil, old, grade)) It's Ben, 16. Level: 9.2
Теперь посмотрим на метод :
>>> print("This is a {0}. It's {1}." ... .format("ball", "red")) This is a ball. It's red. >>> print("This is a {0}. It's {1}." ... .format("cat", "white")) This is a cat. It's white. >>> print("This is a {0}. It's {1} {2}." ... .format(1, "a", "number")) This is a 1. It's a number.
В строке в фигурных скобках указаны номера данных, которые будут сюда подставлены. Далее к строке применяется метод . В его скобках указываются сами данные (можно использовать переменные). На нулевое место подставится первый аргумент метода , на место с номером 1 – второй и т. д.
На самом деле возможности метода существенно шире, и для их изучения понадобился бы отдельный урок. Нам пока будет достаточно этого.