БлогNot. Маленькие бесполезные скрипты на Python :)

Маленькие бесполезные скрипты на Python :)

сейчас в статье: 40 скриптов Я по-прежнему считаю Python неудачным языком "для удушения программирования", но жизнь заставляет иногда иметь с ним дело.

Показанные примеры не претендуют на совершенство и применялись в учебных целях. Так просто выкинуть жалко, запостим сюда.

В настоящее время в логе 5 разделов - "Система", "Арифметика", "Обработка строк", "Списки и другие составные типы данных", "Файлы и библиотеки".

Простой учебник для начинающих можно найти, например, на "Метаните", ну или тут.

Примеры проверялись в консольном проекте типа "Приложение Python" актуальных сборок Visual Studio (какие компоненты "Студии" установить - внизу по первой ссылке). Возможно, это будет иногда пополняться.

Для поиска на странице нужных слов нажмите в браузере комбинацию клавиш Ctrl+F и введите или вставьте слова в окно поиска.

1. Система

1.1. Узнать длину строку в байтах.

def ByteSize(string):
 return len(string.encode("utf8"))
print(ByteSize("Привет, мир!"))
print(ByteSize("Hello, world!"))

1.2. Получить объём памяти, используемой объектом (в байтах).

import sys
print(sys.getsizeof("Python"))
print(sys.getsizeof(100))
print(sys.getsizeof(True))
list = [1,2,3]
print(sys.getsizeof(list))

1.3. Отменить для print переход к новой строке консоли.

#способ 1
import sys
sys.stdout.write("Привет, ")
sys.stdout.write("мир!")

print("") #Печать пустой строки

#способ 2
print("Привет, ", end="")
print("мир!")

1.4. Вычислить время выполнения функции скрипта. На примере вычисления простых чисел, не превышающих 10000 с помощью решета Эратосфена.

import time

def sieve(a,n):
 a[1] = 0
 i = 2
 while i <= n:
  if a[i] != 0:
   j = i + i
   while j <= n :
    a[j] = 0
    j = j + i
  i += 1
 a = set(a)
 a.remove(0)
 return a
 
n = 10000
a = [i for i in range(n + 1)]
start_time= time.time()
list = sieve(a,n)
end_time= time.time()
print(list)
timetaken = round(end_time - start_time,6)
print(f"Время выполнения: {timetaken}")

1.5. Последовательно запустить несколько исполняемых файлов из скрипта. Код ругается в консоль, но запускает.

import subprocess
import os

# Папка 
current_directory = "C:\\WINDOWS\\SYSTEM32"
 
def run_exe(exe_file):
 try:
  full_path = os.path.join(current_directory, exe_file)
  process = subprocess.Popen(full_path, stdout=subprocess.PIPE, stderr=subprocess.PIPE)
  stdout, stderr = process.communicate(timeout=2) #2 секунды
  print(f"Запущен файл: {exe_file}")
  print("STDOUT:")
  print(stdout.decode())
  print("STDERR:")
  print(stderr.decode())
 except Exception as e:
  print(f"Ошибка при запуске файла {exe_file}: {e}")

# Исполняемые файлы
exe_file_1 = r"notepad.exe"
exe_file_2 = r"mspaint.exe"
exe_file_3 = r"calc.exe"
 
# Запуск каждого exe файла в отдельном процессе
run_exe(exe_file_1)
run_exe(exe_file_2)
run_exe(exe_file_3)

2. Арифметика

2.1. Подсчитать тригонометрическую функцию от угла, заданного в градусах, а не в радианах и округлить результат до 2 знаков в дробной части.

import math
print(round(math.sin(math.radians(30)),2))

2.2. Поменять местами значения двух переменных. Здесь это можно сделать без использования третьей.

a=3
b="Hello"
a, b = b, a
print(a, b)

2.3. Реализовать "заготовку" для простого консольного калькулятора на Python.

Многабукаф, развернуть
import math

def summa (first, second):
 return first + second

def sub (first, second):
 return first - second

def mult (first, second):
 return first * second

def div (first, second):
 return first / second

def calc(first, second, oper):
 result = None
 if oper == '+':
  result = summa(first, second)
 elif oper == '-':
  result = sub(first, second)
 elif oper == '*':
  result = mult(first, second)
 elif oper == '/':
  if (second == 0):
   print('Деление на ноль запрещено!')
   return
  result = div(first, second)
 elif oper == '%':
  result = first / second * 100
 elif oper == '**':
  result = first ** second
 elif oper == 'log':
  result = math.log(first, second)
 else:
  print('Некорректная операция!')
 return result

def operation():
 mes = input('Выберите операцию (Введите +, -, *, /, %, **, log):\n '
    '+ - сложение двух чисел\n'
    '- - вычитание двух чисел\n'
    '* - умножение двух чисел\n'
    '/ - деление двух чисел\n'
    '% - процент первого числа от второго\n'
    '** - возведение первого числа в степень второго\n'
    'log - логарифм первого числа по основанию второго\n')
 if mes == '+':
  print('Вы выбрали сумму')
 elif mes == '-':
  print('Вы выбрали разность')
 elif mes == '*':
  print('Вы выбрали умножение')
 elif mes == '/':
  print('Вы выбрали деление')
 elif mes == '%':
  print('Вы выбрали нахождение процента первого числа от второго')
 elif mes == '**':
  print('Вы выбрали возведение в степень')
 elif mes == 'log':
  print('Вы выбрали логарифм')
 correct_operations = ['+', '-', '*', '/', '%', '**', 'log']
 while mes not in correct_operations:
  print('Такой операции нет в списке. Попробуйте ещё!')
  mes = input()
 return mes

def run():
 try:
  first = int(input('Укажите первое число: '))
 except ValueError:
  first = int(input('Вы ввели некорректные данные. Пожалуйста, введите целое число.'))
 try:
  second = int(input('Укажите второе число: '))
 except ValueError:
  second = int(input('Вы ввели некорректные данные. Пожалуйста, введите целое число.'))
 op = operation()
 result = calc(first, second, op)
 print(f'Результат: {result}')

progam_is_running = True
while(progam_is_running):
 run()
 answer = input('Желаете продолжить?\n'
   ' Введите + если да и прочий символ, если нет: ')
 if answer != '+':
  progam_is_running = False

2.4. Напечатать таблицу умножения с выравниваем выражений по правому краю.

Вот такую (развернуть)
 1*1=1  1*2=2  1*3=3  1*4=4  1*5=5  1*6=6  1*7=7  1*8=8  1*9=9
 2*1=2  2*2=4  2*3=6  2*4=8 2*5=10 2*6=12 2*7=14 2*8=16 2*9=18
 3*1=3  3*2=6  3*3=9 3*4=12 3*5=15 3*6=18 3*7=21 3*8=24 3*9=27
 4*1=4  4*2=8 4*3=12 4*4=16 4*5=20 4*6=24 4*7=28 4*8=32 4*9=36
 5*1=5 5*2=10 5*3=15 5*4=20 5*5=25 5*6=30 5*7=35 5*8=40 5*9=45
 6*1=6 6*2=12 6*3=18 6*4=24 6*5=30 6*6=36 6*7=42 6*8=48 6*9=54
 7*1=7 7*2=14 7*3=21 7*4=28 7*5=35 7*6=42 7*7=49 7*8=56 7*9=63
 8*1=8 8*2=16 8*3=24 8*4=32 8*5=40 8*6=48 8*7=56 8*8=64 8*9=72
 9*1=9 9*2=18 9*3=27 9*4=36 9*5=45 9*6=54 9*7=63 9*8=72 9*9=81
table = []
size = 10
for i in range(1, size):
 for j in range(1, size):
  table.append((f"{i}*{j}={i*j}"))
width = max(len(row) for row in table)
cnt = 0
for row in table:
 print(*(f"{row:>{width}}"), sep="", end=" ")
 cnt += 1
 if (cnt%(size-1)==0):
  print ("")

2.5. Написать функцию суммирования произвольного количества числовых аргументов. Из суммирования исключаются аргументы-строки, кроме тех, которые могут служить записью чисел.

def summa(*args):
 def isfloat(num):
  try:
   float(num)
   return True
  except ValueError:
   return False
 numbers = [ x for x in args if isinstance(x, (int, float)) or x.isnumeric() or isfloat(x)]
 return sum(float(v) for v in numbers)

print(summa("-1.", 2, 3, "abc", ''))       # 4.0  
print(summa(1, 2, 3.5, "4"))               # 10.5
print(round(summa("1e3","1e","-999.9"),1)) # 0.1

На самом деле, в условии всё лишнее, кроме if isfloat(x), поскольку всё равно складываем вещественные числа. Более короткий вариант функции вообще мог бы быть таким:

def summa(*args):
 res = 0
 for i in args:
  try:
   res += float(i)
  except ValueError:
   continue
 return res
Комментарий к етому:
Отчего, отчего, отчего Python г**но?
Оттого, что кто-то любит питониста! (C)

2.6. Выйти из нескольких вложенных циклов сразу, учитывая, что в Питоне нет goto.

В коде ищется первое решение равенства и выполняется выход из подпрограммы, если таковое найдено.

Нужно учесть, что при наличии finally Питон в любом случае сгенерирует исключение, к которому относится этот оператор.

def test(n):
 try:
  for x in range(1, n):
   for y in range(1, n):
    for z in range(1, n):
     if 3*x + 2*y + 5*z == n:
      raise Exception("Решение найдено")
 except Exception as e:
  print(e)
 finally:
  return [x,y,z]

n = 1000
[x,y,z] = test(n)
if x*y*z != (n-1)*(n-1)*(n-1):
 print(f"x = {x}, y = {y}, z = {z}")
else:
 print ("Нет решения")

2.7. Заданы координаты 2 точек на плоскости (x1,y1), (x2,y2). Найти коэффициенты a, b прямой y(x)=a*x+b, проходящей через точки.

def line2(x1, y1, x2, y2):
 # a*x1+b=y1, a*x2+b=y2, откуда a = (y2-y1)/(x2-x1), если вычесть уравнения
 # Вычисляем коэффициент a (наклон)
 a = (y2 - y1) / (x2 - x1)
 # Вычисляем коэффициент b
 b = y1 - a * x1
 return a, b

# Запрос координат у пользователя
x1, y1 = map(float, input("Введите координаты первой точки x1, y1: ").split(","))
x2, y2 = map(float, input("Введите координаты второй точки x2, y2: ").split(","))
# Нахождение коэффициентов
a, b = line2(x1, y1, x2, y2)
print (f"Уравнение прямой: {a}*x+{b}=y")

Координаты вводятся через запятую, например, для x1=-1, y1=1 вводим -1,1

В этом коде мы предполагаем, что вводимые данные корректны, например, x1 не равно x2; в реальном приложении стоит добавить обработку ошибок.

2.8. Преобразовать дробь в правильную, при необходимости сократив её числитель и знаменатель.

from fractions import Fraction

def convert_improper_fraction_to_mixed_fraction(numerator, denominator):
 # Всё число
 whole_number = numerator // denominator
 whole_number_str = str(whole_number)
 # Остаток
 remainder = numerator % denominator
 # Правильная дробь
 proper_fraction = Fraction(remainder, denominator)
 fraction_str = str(proper_fraction)
 # Вернуть смешанную дробь в виде строки
 return whole_number_str + ' ' + fraction_str

print (convert_improper_fraction_to_mixed_fraction(13, 5))

2.9. Треугольник задан тремя парами координат вершин (x1,y1), (x2,y2), (x3,y3). Если по введенным координатам можно построить треугольник, вводим также координаты произвольной точки (x,y) и определяем, попадает ли она в треугольник

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

Так как накопления вещественных величин в цикле нет, стандартной точности должно хватать для сравнения площадей.

def area(x1, y1, x2, y2, x3, y3):
 return abs((x1*(y2 - y3) + x2*(y3 - y1) + x3*(y1 - y2)) / 2.0)

def is_point_in_triangle(x1, y1, x2, y2, x3, y3, x, y):
 # Площадь треугольника ABC
 A = area(x1, y1, x2, y2, x3, y3)
 # Площади треугольников PAB, PAC, PBC
 A1 = area(x, y, x2, y2, x3, y3)
 A2 = area(x1, y1, x, y, x3, y3)
 A3 = area(x1, y1, x2, y2, x, y)
 # Проверяем, равна ли сумма площадей A1, A2 и A3 площади A
 return A == A1 + A2 + A3

# Ввод координат вершин треугольника
x1, y1 = map(float, input("Введите координаты первой вершины (x1, y1): ").split())
x2, y2 = map(float, input("Введите координаты второй вершины (x2, y2): ").split())
x3, y3 = map(float, input("Введите координаты третьей вершины (x3, y3): ").split())

# Проверяем, можно ли построить треугольник
if (x1, y1) == (x2, y2) or (x1, y1) == (x3, y3) or (x2, y2) == (x3, y3):
 print("Треугольник не может быть построен с заданными координатами.")
else:
 # Ввод координат точки
 x, y = map(float, input("Введите координаты точки (x, y): ").split())
 # Проверяем, находится ли точка внутри треугольника
 if is_point_in_triangle(x1, y1, x2, y2, x3, y3, x, y):
  print("Точка находится внутри треугольника или на его границе.")
 else:
  print("Точка находится вне треугольника.")

2.10. Найти произведение сумм квадратов элементов строк матрицы.

import numpy as np
#Пример матрицы A(3,2)
A = np.array([[1, 2],
              [3, 4],
              [5, 6]])
#Сумма квадратов элементов каждой строки
sum_of_squares = np.sum(A**2, axis=1)
#Произведение сумм квадратов
product = np.prod(sum_of_squares)
#Результат
print("Матрица A:")
print(A)
print("\nСуммы квадратов элементов каждой строки:")
print(sum_of_squares)
print("\nПроизведение сумм квадратов:", product)

2.11. для заданных года, месяца и дня месяца y, m, d определить день недели по формуле Зеллера (год должен быть не меньше 1582).

def day_of_week(y, m, d):
	m -= 3
	y += m // 12
	m %= 12
	temp = y + y // 4 - y // 100 + y // 400
	return (temp + (m * 13 + 12) // 5 + d) % 7
	
print (day_of_week(2025, 2, 16)) # 0 = Вс

3. Обработка строк

3.1. Преобразовать строку в верхний или нижний регистр символов.

str1 ="Барабашка программист"
str2 ="И СИРОЖА ТОЖЕ"
print(str1.upper())
print(str2.lower())

3.2. Сделать первые буквы слов прописными.

str = "сделай ПЕРВЫЕ буквы слов большими."
print(str.title())

3.3. Получить строку, содержащую гласные буквы из другой строки (кириллица).

def get_vowels(String):
 return [each for each in String if each in "аеёиоуыэюя"]
print(''.join(str(el) for el in get_vowels("Получи гласные из строки")))

3.4. Продублировать выводимую строку несколько раз.

n=5
string="Строка"
print(string * n)

3.5. Узнать, является ли строка перестановкой букв (анаграммой) другой строки.

from collections import Counter
def anagrams(str1, str2):
 return Counter(str1) == Counter(str2)
print(anagrams("аббат", "бабат"))

3.6. Проверить, является ли строка палиндромом ("перевёртышем").

def palindrome(data):
 return data == data[::-1]
print(palindrome("абрака акарба")) #True
print(palindrome("абракадабра")) #False

3.7. Отформатировать при выводе строку с подстановкой значений переменных.

str ="программист"
val = 123.456
format1 ="Это {} номер {}".format(str,val)
print (format1)
print (f"Это {str} номер {round(val)}")

3.8. Найти подстроку в строке.

programmers = [
 "Ночальнег",
 "Иксперд",
 "Розроботчег",
 "Тестер"
]
#способ 1
for p in programmers:
 if p.find("р") != -1:
  print(p)

print("")

#способ 2
for p in programmers:
 if "перд" in p:
  print(p)

3.9. Отформатировать строку в стиле библиотеки <cstdio>.

По-уродски, но можно.

str = "Имя %s, ДР %02d.%02d.%04d, з/п %.2f, рейтинг %06d" % ("Вася",11,2,2000,12345.567,1500)
print(str)

4. Списки и другие составные типы данных

4.1. Получить первый, последний или нужный элемент списка.

list = ["Python", "JavaScript", "C++", "Java", "C#"]
print(list[0])  #Python
print(list[-1])  #C#
print(list.pop()) #C#, убрана из списка!
print(list[0]) #Python
print("")
for i in list:
 print(i)

4.2. Преобразовать список в строку.

list1=["C#","JavaScript","C++"]
list2=["Python", "Kaka"]
print("There are" , ", ".join(list1))
print(", ".join(list2))

4.3. Проверить, есть ли в списке повторяющиеся значения.

def check_duplicate(lst):
 return len(lst) != len(set(lst))
print(check_duplicate([1,2,3,4,1])) # True
print(check_duplicate([1,2,3])) # False

4.4. Отфильтровать пустые значения в списке (такие, как false, 0, None, "").

def Filtering(lst):
 return list(filter(None,lst))
lst=[None,1,3,0,"",5,7," ",False,"False",None]
print(Filtering(lst))

4.5. Отсортировать список.

list = ["milk", "banana", "fish"]
list1 = ["D","C","B","A"]
list2 = [1,2,3,4,5]
list.sort()
print(list)
list1.sort()
print(list1)
print(sorted(list2, reverse=True))

4.6. Отсортировать словарь.

dic = {
 'pizza': 200,
 'burger': 56,
 'pepsi': 25,
 'сoffee': 14
}
sorted_dic= sorted(dic.items(), key=lambda x: x[1]) #по цене
print(sorted_dic)

4.7. Случайно перемешать элементы списка. Инициалзировать генератор случайных чисел при этом не нужно.

from random import shuffle
list1=[1,2,3,4,5,6]
list2=["A","B","C","D"]
shuffle(list1)
print (list1)
shuffle(list2)
print (list2)

4.8. Объединить два словаря.

def merge(dic1,dic2):
 dic3=dic1.copy()
 dic3.update(dic2)
 return dic3
dic1={1:"c++", 2:"c#"}
dic2={3:"Java", 4:"Python", 5: "c++"}
dic3 = merge(dic1,dic2)
print(dic3, sep=' ') #всё
print(*dic3, sep=' ') #ключи
print(list(dic3.values()), sep=' ') #значения

4.9. Разбить список на сегменты указанного размера.

def chunk(my_list, size):
 return [my_list[i:i+size] for i in range(0,len(my_list), size)]
list = [1, 2, 3, 4, 5, 6, 7]
list = chunk(list, 2)
print (list)

4.10. То же самое с использованием функции-генератора.

def chunk_list(lst, chunk_size):
 for i in range(0, len(lst), chunk_size):
  yield lst[i:i+chunk_size]
list = [1, 2, 3, 4, 5, 6, 7]
for chunk in chunk_list(list, 2):
 print(chunk)

4.11. Создать список значений, отвечающих некоторому условию (в нашем случае, чётных натуральных чисел).

list = [i for i in range(2,100) if i % 2 == 0] 
print (list)

4.12. Выбрать из списка только тех сотрудников, у которых зарплата (4-е число) попадает в диапазон значений от 20000 до 40000 включительно.

persons = [
 ['Смирнов', 'Илья', 5, 50000], 
 ['Петров', 'Иван', 1, 20000], 
 ['Терехова', 'Анна', 15, 35000]]
print(*(x[0] for x in persons if 20000 <= x[3] <= 40000),sep="\n")

Больше примеров на "Метаните"

5. Файлы и библиотеки

5.1. Составить частотную таблицу слов текстового файла.

Кстати, так и не добился нормального выхода из скрипта в случае, если файл с введённым именем не существует, всё в уродливой ветви else:.

import os

# возвращает список слов
def get_words(text):
 # приводим текст к нижнему регистру
 text = text.lower()
 # разбиваем текст по пробельным символам
 # и удаляем с конца слов символы ' .,?!:;-—'
 words = [word.strip(' .,?!:;-—') for word in text.split()]
 # оставляем только те слова, которые состоят из букв
 words = list(filter(lambda word: word.isalpha(), words))
 return words

# возвращает словарь слов
# ключ: уникальное слово
# значение: количество его вхождений
def get_words_dict(words):
 words_dict = dict()
 # формируем словарь
 # если слово не существует - создаём, затем увеличиваем счётчик
 for word in words:
  if word not in words_dict:
   words_dict[word] = 0
  words_dict[word] += 1
 return words_dict

def main():
 filename = input("Введите путь к файлу: ")
 if not os.path.exists(filename):
  print("Указанный файл не существует")
 else:
  with open(filename, encoding="utf8") as file:
   text = file.read()
  words = get_words(text)
  words_dict = get_words_dict(words)
  # получаем пары (ключ, значение)
  words_list = list(words_dict.items())
  # сортируем список по убыванию количества вхождений слов
  words_list.sort(key=lambda x: x[1], reverse=True)
  # получаем длину самого длинного слова
  max_len = max([len(item[0]) for item in words_list])
  # выводим на экран результаты работы программы
  # если слов много, то в этом месте программа может тормозить
  print(f"Кол-во слов: {len(words)}")
  print(f"Кол-во уникальных слов: {len(words_list)}")
  print("Все использованные слова:")
  for item in words_list:
   print(item[0].rjust(max_len), item[1])

if __name__ == "__main__":
 main()

5.2. Покажем работу с файлом PGN средствами внешней библиотеки chess.

Идём в верхнем меню Visual Studio к пункту Средства - Командная строка - Командная строка разработчика, выполняем в консоли команду

pip install chess

Проверяем, что пакет установлен и есть в активной конфигурации:

pip list

Уточняем, что пакет видим в текущем окружении Питон (Обозреватель решений - вкладка Окружения Python, открываем в списке "Пакеты" вместо "Общие сведения"). Удалить лишние (устаревшие) окружения можно через Visual Studio Installer.

Теперь пакет доступен для новых проектов и выполняется, например, такой код:

import chess
import chess.pgn

pgn = open("file.pgn")
game = chess.pgn.read_game(pgn)
board = game.board()

for move in game.mainline_moves():
 board.push(move)
 print(board)
 print(board.fen())

Файл file.pgn находился в одной папке с файлом .py и содержал такой текст:

1.e4 g6 2.d4 Bg7 3. Nc3 c6 4. Bc4 d6 5. Qf3 e6 
6. Nge2 b5 7. Bb3 a5 8.a3 Ba6 9.d5 cxd5 10.exd5 e5 
11. Ne4 Qc7 12.c4 bxc4 13. Ba4+ Nd7 14. N2c3 Ke7 15. Nxd6 Qxd6 
16. Ne4 Qxd5 17. Bg5+ Ndf6 18. Rd1 Qb7 19. Rd7+ Qxd7 20. Bxd7 h6 
21. Qd1 1-0 

("Отложенная задница обезьяны" им. нашего друга ГМ Широва отсюда).

5.3. По введённым месяцу и году определить количество дней в этом месяце. Можно же делать и вот так по-идиотски, применяя крупнокалиберное на воробьёв.

from datetime import datetime 
month = int(input("Введите номер месяца: ")) 
year = int(input("Введите год: ")) 
def days_in_month(month, year): 
 try: 
  if month == 12: 
   next_month = datetime(year + 1, 1, 1) 
  else: 
   next_month = datetime(year, month + 1, 1) 
  current_month = datetime(year, month, 1) 
  delta = next_month - current_month 
  return delta.days 
 except ValueError: 
   return  
days = days_in_month(month, year) 
print(f"Количество дней в месяце: {days}")

24.02.2024, 15:30 [351 просмотр]


теги: учебное список программирование studio textprocessing python

К этой статье пока нет комментариев, Ваш будет первым