Маленькие бесполезные скрипты на 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 просмотров]