41 вопрос о работе со строками в python / блог компании ruvds.com / хабр

Автор: | 18.07.2023

Плохой пример

Давайте рассмотрим действительно плохой пример. Допустим, мы объявили функцию и хотим проверить, хорошо ли она работает. 

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 – второй и т. д.

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