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

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

сейчас в статье: 34 скрипта Я по-прежнему считаю 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 ("Нет решения")

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 

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

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


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

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