Уверен, что вы хоть раз играли в эту интересную, но простую игру.
Цель этой игры, отбивать мяч от платформы и не упустить его.
При создании игры используются такие библиотеки как:
- tkinter, эта библиотека предустановленна на большинстве версиях Python и используется для создания самого оконного приложения.
- time, в нашем случае будет использоваться, что бы задать скорость мячу и платформе. Для установки зайдите в командную строку от имени администратора и напишите: pip install time проверьте что pip у вас установлен.
- random, в нашем случае будет использоваться , что бы мяч отскакивал в разных направлениях. Эта библиотека так же предустановленна на всех версиях Python.
- pygame, используется для создания графического интерфейса нашей игры. Эту библиотеку нужно скачать через командную строку, прописав: pip install pygame
from tkinter import * import time import random import pygame class Ball(): def __init__(self, canvas, platform, color): self.canvas = canvas self.platform = platform self.oval = canvas.create_oval(200, 200, 215, 215, fill=color) self.dir = [-3, -2, -1, 1, 2, 3] self.x = random.choice(self.dir) self.y = -1 self.touch_bottom = False def touch_platform(self, ball_pos): platform_pos = self.canvas.coords(self.platform.rect) if ball_pos[2] >= platform_pos[0] and ball_pos[0] <= platform_pos[2]: if ball_pos[3] >= platform_pos[1] and ball_pos[3] <= platform_pos[3]: return True return False def draw(self): self.canvas.move(self.oval, self.x, self.y) pos = self.canvas.coords(self.oval) if pos[1] <= 0: self.y = 3 if pos[3] >= 400: self.touch_bottom = True if self.touch_platform(pos) == True: self.y = -3 if pos[0] <= 0: self.x = 3 if pos[2] >= 500: self.x = -3 class Platform(): def __init__(self, canvas, color): self.canvas = canvas self.rect = canvas.create_rectangle(230, 300, 330, 310, fill=color) self.x = 0 self.canvas.bind_all(», self.left) self.canvas.bind_all(», self.right) def left(self, event): self.x = -2 def right(self, event): self.x = 2 def draw(self): self.canvas.move(self.rect, self.x, 0) pos=self.canvas.coords(self.rect) if pos[0] <= 0: self.x = 0 if pos[2] >= 500: self.x = 0 window = Tk() window.title(«Аркада») window.resizable(0, 0) window.wm_attributes(«-topmost», 1) canvas = Canvas(window, width=500, height=400) canvas.pack() platform = Platform(canvas, ‘green’) ball = Ball(canvas, platform, ‘red’) while True: if ball.touch_bottom == False: ball.draw() platform.draw() else: break window.update() time.sleep(0.01) window.mainloop()
ЯЗЫК ПИТОН ЗА 1 МИНУТУ ДЛЯ НОВИЧКОВ модуль turtle #shorts #python
Вот и весь код для этой интересной, простой и увлекательной игры. Вы так же можете модернизировать игру, добавив в неё например количество балов за отбитые мячи, или второй мяч.
Игра №2. Тетрис.
Эту игру знают все! Главная задача игрока не дать разным, геометрическим фигурам достигнуть «ФИНИША».
import sys, random from PyQt5.QtWidgets import QMainWindow, QFrame, QDesktopWidget, QApplication from PyQt5.QtCore import Qt, QBasicTimer, pyqtSignal from PyQt5.QtGui import QPainter, QColor
Уведомления на Python
Вы видите библиотеки, которые будут использоваться при создании данной игры, всех их нужно загрузить через командную строку вашего компьютера.
После того как установили нужные нам библиотеки, создаём класс с нашими переменными. класс назовём Tetris и будем использовать свойства отцовского класса, чтобы каждый раз не прописывать все переменные заново для каждого последующего класса.
class Tetris(QMainWindow): def __init__(self): super().__init__() self.initUI() def initUI(self): self.tboard = Board(self) self.setCentralWidget(self.tboard) self.statusbar = self.statusBar() self.tboard.msg2Statusbar[str].connect(self.statusbar.showMessage) self.tboard.start() self.resize(180, 380) self.center() self.setWindowTitle(‘Tetris’) self.show() def center(self): screen = QDesktopWidget().screenGeometry() size = self.geometry() self.move((screen.width()-size.width())/2, (screen.height()-size.height())/2)
После создания отцовского класса Tetris, создаём все остальные классы и переменные для уже других функций.
class Board(QFrame): msg2Statusbar = pyqtSignal(str) BoardWidth = 10 BoardHeight = 22 Speed = 300 def __init__(self, parent): super().__init__(parent) self.initBoard() def initBoard(self): self.timer = QBasicTimer() self.isWaitingAfterLine = False self.curX = 0 self.curY = 0 self.numLinesRemoved = 0 self.board = [] self.setFocusPolicy(Qt.StrongFocus) self.isStarted = False self.isPaused = False self.clearBoard() def shapeAt(self, x, y): return self.board[(y * Board.BoardWidth) + x] def setShapeAt(self, x, y, shape): self.board[(y * Board.BoardWidth) + x] = shape def squareWidth(self): return self.contentsRect().width() // Board.BoardWidth def squareHeight(self): return self.contentsRect().height() // Board.BoardHeight def start(self): if self.isPaused: return self.isStarted = True self.isWaitingAfterLine = False self.numLinesRemoved = 0 self.clearBoard() self.msg2Statusbar.emit(str(self.numLinesRemoved)) self.newPiece() self.timer.start(Board.Speed, self) def pause(self): if not self.isStarted: return self.isPaused = not self.isPaused if self.isPaused: self.timer.stop() self.msg2Statusbar.emit(«paused») else: self.timer.start(Board.Speed, self) self.msg2Statusbar.emit(str(self.numLinesRemoved)) self.update()
def paintEvent(self, event): painter = QPainter(self) rect = self.contentsRect() boardTop = rect.bottom() — Board.BoardHeight * self.squareHeight() for i in range(Board.BoardHeight): for j in range(Board.BoardWidth): shape = self.shapeAt(j, Board.BoardHeight — i — 1) if shape != Tetrominoe.NoShape: self.drawSquare(painter, rect.left() + j * self.squareWidth(), boardTop + i * self.squareHeight(), shape) if self.curPiece.shape() != Tetrominoe.NoShape: for i in range(4): x = self.curX + self.curPiece.x(i) y = self.curY — self.curPiece.y(i) self.drawSquare(painter, rect.left() + x * self.squareWidth(), boardTop + (Board.BoardHeight — y — 1) * self.squareHeight(), self.curPiece.shape()) def keyPressEvent(self, event): if not self.isStarted or self.curPiece.shape() == Tetrominoe.NoShape: super(Board, self).keyPressEvent(event) return key = event.key() if key == Qt.Key_P: self.pause() return if self.isPaused: return elif key == Qt.Key_Left: self.tryMove(self.curPiece, self.curX — 1, self.curY) elif key == Qt.Key_Right: self.tryMove(self.curPiece, self.curX + 1, self.curY) elif key == Qt.Key_Down: self.tryMove(self.curPiece.rotateRight(), self.curX, self.curY) elif key == Qt.Key_Up: self.tryMove(self.curPiece.rotateLeft(), self.curX, self.curY) elif key == Qt.Key_Space: self.dropDown() elif key == Qt.Key_D: self.oneLineDown() else: super(Board, self).keyPressEvent(event) def timerEvent(self, event): if event.timerId() == self.timer.timerId(): if self.isWaitingAfterLine: self.isWaitingAfterLine = False self.newPiece() else: self.oneLineDown() else: super(Board, self).timerEvent(event) def clearBoard(self): for i in range(Board.BoardHeight * Board.BoardWidth): self.board.append(Tetrominoe.NoShape) def dropDown(self): newY = self.curY while newY > 0: if not self.tryMove(self.curPiece, self.curX, newY — 1): break newY -= 1 self.pieceDropped() def oneLineDown(self): if not self.tryMove(self.curPiece, self.curX, self.curY — 1): self.pieceDropped() def pieceDropped(self): for i in range(4): x = self.curX + self.curPiece.x(i) y = self.curY — self.curPiece.y(i) self.setShapeAt(x, y, self.curPiece.shape()) self.removeFullLines() if not self.isWaitingAfterLine: self.newPiece()
def removeFullLines(self): numFullLines = 0 rowsToRemove = [] for i in range(Board.BoardHeight): n = 0 for j in range(Board.BoardWidth): if not self.shapeAt(j, i) == Tetrominoe.NoShape: n = n + 1 if n == 10: rowsToRemove.append(i) rowsToRemove.reverse() for m in rowsToRemove: for k in range(m, Board.BoardHeight): for l in range(Board.BoardWidth): self.setShapeAt(l, k, self.shapeAt(l, k + 1)) numFullLines = numFullLines + len(rowsToRemove) if numFullLines > 0: self.numLinesRemoved = self.numLinesRemoved + numFullLines self.msg2Statusbar.emit(str(self.numLinesRemoved)) self.isWaitingAfterLine = True self.curPiece.setShape(Tetrominoe.NoShape) self.update() def newPiece(self): self.curPiece = Shape() self.curPiece.setRandomShape() self.curX = Board.BoardWidth // 2 + 1 self.curY = Board.BoardHeight — 1 + self.curPiece.minY() if not self.tryMove(self.curPiece, self.curX, self.curY): self.curPiece.setShape(Tetrominoe.NoShape) self.timer.stop() self.isStarted = False self.msg2Statusbar.emit(«Game over») def tryMove(self, newPiece, newX, newY): for i in range(4): x = newX + newPiece.x(i) y = newY — newPiece.y(i) if x < 0 or x >= Board.BoardWidth or y < 0 or y >= Board.BoardHeight: return False if self.shapeAt(x, y) != Tetrominoe.NoShape: return False self.curPiece = newPiece self.curX = newX self.curY = newY self.update() return True def drawSquare(self, painter, x, y, shape): colorTable = [0x000000, 0xCC6666, 0x66CC66, 0x6666CC, 0xCCCC66, 0xCC66CC, 0x66CCCC, 0xDAAA00] color = QColor(colorTable[shape]) painter.fillRect(x + 1, y + 1, self.squareWidth() — 2, self.squareHeight() — 2, color) painter.setPen(color.lighter()) painter.drawLine(x, y + self.squareHeight() — 1, x, y) painter.drawLine(x, y, x + self.squareWidth() — 1, y) painter.setPen(color.darker()) painter.drawLine(x + 1, y + self.squareHeight() — 1, x + self.squareWidth() — 1, y + self.squareHeight() — 1) painter.drawLine(x + self.squareWidth() — 1, y + self.squareHeight() — 1, x + self.squareWidth() — 1, y + 1)
После создаём класс уже для самих объектов( фигур), назовём его Tetrominoe.
class Tetrominoe(object): NoShape = 0 ZShape = 1 SShape = 2 LineShape = 3 TShape = 4 SquareShape = 5 LShape = 6 MirroredLShape = 7
И ещё один класс, но уже будем задавать координаты фигурам.
class Shape(object): coordsTable = ( ((0, 0), (0, 0), (0, 0), (0, 0)), ((0, -1), (0, 0), (-1, 0), (-1, 1)), ((0, -1), (0, 0), (1, 0), (1, 1)), ((0, -1), (0, 0), (0, 1), (0, 2)), ((-1, 0), (0, 0), (1, 0), (0, 1)), ((0, 0), (1, 0), (0, 1), (1, 1)), ((-1, -1), (0, -1), (0, 0), (0, 1)), ((1, -1), (0, -1), (0, 0), (0, 1)) ) def __init__(self): self.coords = [[0,0] for i in range(4)] self.pieceShape = Tetrominoe.NoShape self.setShape(Tetrominoe.NoShape) def shape(self): return self.pieceShape def setShape(self, shape): table = Shape.coordsTable[shape] for i in range(4): for j in range(2): self.coords[i][j] = table[i][j] self.pieceShape = shape def setRandomShape(self): self.setShape(random.randint(1, 7)) def x(self, index): return self.coords[index][0] def y(self, index): return self.coords[index][1] def setX(self, index, x): self.coords[index][0] = x def setY(self, index, y): self.coords[index][1] = y def minX(self): m = self.coords[0][0] for i in range(4): m = min(m, self.coords[i][0]) return m
И завершаем наш код
def maxX(self): m = self.coords[0][0] for i in range(4): m = max(m, self.coords[i][0]) return m def minY(self): m = self.coords[0][1] for i in range(4): m = min(m, self.coords[i][1]) return m def maxY(self): m = self.coords[0][1] for i in range(4): m = max(m, self.coords[i][1]) return m def rotateLeft(self): if self.pieceShape == Tetrominoe.SquareShape: return self result = Shape() result.pieceShape = self.pieceShape for i in range(4): result.setX(i, self.y(i)) result.setY(i, -self.x(i)) return result def rotateRight(self): if self.pieceShape == Tetrominoe.SquareShape: return self result = Shape() result.pieceShape = self.pieceShape for i in range(4): result.setX(i, -self.y(i)) result.setY(i, self.x(i)) return result if __name__ == ‘__main__’: app = QApplication([]) tetris = Tetris() sys.exit(app.exec_())
Прикрепил код по кусочкам, код длинный единым кодом его не прикрепить.
Это немного не то, о чём вы подумали, это танки «на бумаге» они работают без графического интерфейса, выводя информацию на экран.
Для создания данной игры нам потребуется всего ода библиотека, random.
Создадим два обычных танка, которые будут иметь рандомный домаг, и один супер танк, у которого будет много xp и урона. У всех танков будет определённое количество xp, урона и брони, а так же свой экипаж.
import random class Tank: «»»Template of tanks»»» def __init__(self, model, armor, min_damage, max_damage, health): self.model = model self.armor = armor self.damage = random.randint(min_damage, max_damage) self.health = health def print_info(self): print(f» имеет лобовую броню мм при ед. здоровья и урон в единиц») def health_down(self, enemy_damage): self.health -= enemy_damage print(f»n:») print(f»Командир, по экипажу попали, у нас осталось очков здоровья») def shot(self, enemy): if enemy.health = self.health: self.health = 0 print(f»Экипаж танка уничтожен») else: enemy.health_down(enemy.damage) print(f»n:») print(f»Точно в цель, у противника осталось единиц здоровья») class SuperTank(Tank): «»»Template of superTanks»»» def __init__(self, model, armor, min_damage, max_damage, health): super().__init__(model, armor, min_damage, max_damage, health) self.forceArmor = True def health_down(self, enemy_damage): super().health_down(enemy_damage / 2)
Но если вы запустите нашу игру, ничего не произойдёт. Нужно прописать команду, которой танки будут стрелять друг по другу.
tank1 = Tank(«T-34», 90, 20, 30, 100) tank2 = Tank(«Tiger», 120, 10, 50, 120) tank1.print_info() tank2.print_info() tank1.shot(tank2) tank1.shot(tank2) tank1.shot(tank2) tank1.shot(tank2) tank1.shot(tank2) tank1.shot(tank2) tank1.shot(tank2)
Вот полный код программы:
import random class Tank: «»»Template of tanks»»» def __init__(self, model, armor, min_damage, max_damage, health): self.model = model self.armor = armor self.damage = random.randint(min_damage, max_damage) self.health = health def print_info(self): print(f» имеет лобовую броню мм при ед. здоровья и урон в единиц») def health_down(self, enemy_damage): self.health -= enemy_damage print(f»n:») print(f»Командир, по экипажу попали, у нас осталось очков здоровья») def shot(self, enemy): if enemy.health = self.health: self.health = 0 print(f»Экипаж танка уничтожен») else: enemy.health_down(enemy.damage) print(f»n:») print(f»Точно в цель, у противника осталось единиц здоровья») class SuperTank(Tank): «»»Template of superTanks»»» def __init__(self, model, armor, min_damage, max_damage, health): super().__init__(model, armor, min_damage, max_damage, health) self.forceArmor = True def health_down(self, enemy_damage): super().health_down(enemy_damage / 2) tank1 = Tank(«T-34», 90, 20, 30, 100) tank2 = Tank(«Tiger», 120, 10, 50, 120) tank1.print_info() tank2.print_info() tank1.shot(tank2) tank1.shot(tank2) tank1.shot(tank2) tank1.shot(tank2) tank1.shot(tank2) tank1.shot(tank2) tank1.shot(tank2)
Вы можете менять количество выстрелов и т.п.
Источник: vc.ru
30 лучших Python-проектов на GitHub на начало 2022 года
Наверняка многим из вас любопытно было бы узнать, какие Python-проекты являются самыми популярными на начало 2022 года. GitHub, безусловно, лучшее место для получения этой статистики. Пусть здесь можно найти не все проекты, но ему нет достойной альтернативы.
- 7 репозиториев, повышающих производительность;
- 3 репозитория с фреймворками;
- 5 репозиториев, которые облегчают машинное обучение;
- 4 репозитория, которые облегчают реальную жизнь;
- 6 репозиториев, которые собирают и систематизируют полезную информацию;
- 5 репозиториев, которые чему-то учат.
Теперь давайте посмотрим, как мы можем получить ранжированный список из GitHub API с помощью нескольких строк кода.
API, поиск и GitHub
Официальную документацию по API можно найти на этой странице. Я не буду её пересказывать, давайте сразу к делу. Самое прекрасное, что нам не нужно регистрироваться или запрашивать ключ API для использования этого способа. Конечно, у него есть ограничение по скорости — до 10 запросов в минуту, но этого вполне достаточно для тестирования кода и подключения ранжированного списка.
Прежде всего используем requests-модуль Python. Наверняка вы с ним знакомы. Также возьмём Pandas для преобразования данных.
import requests import pandas as pd
URL-адрес https://api.github.com/search/repositories строится на основе документации API. Поскольку мы ищем только проекты на основе Python, указываем аргумент language:python в запросе. Затем добавляем сортировку результатов поиска по количеству звёзд и упорядочиваем по убыванию.
Затем используем requests для обращения к API. Для этого подойдёт метод GET. Потом можно преобразовать результаты в словарь Python.
res = requests.get(url) res_dict = res.json()
Все результаты поиска будут в массиве с ключом «items». Размер страницы по умолчанию равен 30, так что мы сразу видим 30 лучших репозиториев.
repos = res_dict[‘items’] len(repos)
Кстати, на момент отправки запроса в общей сложности было 8 046 758 репозиториев Python.
Теперь давайте преобразуем массив элементов в фрейм данных Pandas.
Теперь удаляем все столбцы, которые не нужны, а ещё добавим столбец под названием year_on_github , чтобы узнать, когда этот проект был создан на GitHub.
repo_df = repo_df[[‘name’, ‘full_name’, ‘html_url’, ‘created_at’, ‘stargazers_count’, ‘watchers’, ‘forks’, ‘open_issues’]] repo_df[‘created_at’] = pd.to_datetime(repo_df[‘created_at’]) repo_df[‘created_year’] = repo_df[‘created_at’].dt.year repo_df[‘years_on_github’] = 2022 — repo_df[‘created_at’].dt.year
Эти проекты облегчают повседневную работу и повышают производительность, например, добавляют некоторые полезные функции.
1. thefuck (6 место, 65 988 звезд)
Этот инструмент может помочь нам исправить ошибки в предыдущей команде, когда мы используем консоль, например, в среде Linux или GitBash.
2. httpie (9 место, 53 255 звезд)
HTTPie — это HTTP-клиент командной строки. Его цель — сделать взаимодействие CLI с веб-сервисами максимально удобным для человека. HTTPie предназначен для тестирования, отладки и общего взаимодействия с API и HTTP-серверами. Команды http и https позволяют создавать и отправлять произвольные HTTP-запросы. Они используют простой и естественный синтаксис и обеспечивают форматированный и подсвеченный вывод.
3. you-get (12-е место, 42 791 звезда)
Это крошечная утилита командной строки для загрузки мультимедийного содержимого (видео, аудио, изображений) из интернета, если нет другого удобного способа сделать это.
4. LocalStack (16 место, 38 008 звёзд)
Этот репозиторий представляет собой эмулятор облачного сервиса, который запускается в одном контейнере на вашем ноутбуке или в вашей среде CI. С помощью LocalStack вы можете запускать приложения на своём локальном компьютере, не подключаясь к удаленному поставщику облачных услуг! Независимо от того, тестируете ли вы сложные приложения CDK или конфигурации Terraform или только начинаете изучать сервисы облачных провайдеров, LocalStack помогает ускорить и упростить рабочий процесс тестирования и разработки.
5. Shadowsocks (20-е место, 33 099 звёзд)
Shadowsocks — это бесплатный проект протокола шифрования с открытым исходным кодом, который широко используется в Китае для обхода интернет-цензуры. Репозиторий удалили из -за нарушения правил сервиса к моменту написания статьи.
6. rich (23-е место, 32 075 звёзд)
Этот репозиторий упрощает добавление цветов и стилей к выводу терминала. Он также может отображать красивые таблицы, прогресс-бары, делать синтаксическую подсветку кода, трейсбеки и многое другое — прямо из коробки.
7. certbot (30-е место, 28 587 звёзд)
Certbot является частью усилий EFF по шифрованию всего интернета. Безопасная связь в интернете основана на протоколе HTTPS, который требует использования цифрового сертификата, позволяющего браузерам проверять подлинность веб-серверов. Веб-серверы получают свои сертификаты от доверенных третьих сторон, называемых центрами сертификации (ЦС). Certbot — это простой в использовании клиент, который извлекает сертификат из Let’s Encrypt — открытого центра сертификации, запущенного EFF, Mozilla и другими — и развертывает его на веб-сервере.
Репозитории с фреймворками
Все эти репозитории представляют собой очень известные фреймворки, предназначенные либо для веб-разработки, либо для разработки другого программного обеспечения.
1. flask (7 место, 57 584 звезды)
Думаю, не нужно долго распинаться о том, что это. Если вы используете Python для веб-разработки, вы наверняка когда-либо использовали flask или, по крайней мере, знаете его.
2. scrapy (14 рейтинг, 42 471 звезда)
Это фреймворк, который необходимо изучить, если вы хотите использовать Python для парсинга веб-страниц. Он упрощает и автоматизирует работу по извлечению информации с веб-страниц. Используется для сканирования сайтов и извлечения структурированных данных с их страниц. Его можно использовать для самых разных целей, от интеллектуального анализа данных до мониторинга и автоматизированного тестирования.
3. fastapi (15 рейтинг, 40 363 звезды)
Ещё один популярный фреймворк для бэкенд-разработки. Его цель состоит в том, чтобы использовать наименьшее количество кода для написания обычных веб-API. Если ваш бэкэнд не слишком сложен, используйте его.
Репозитории, облегчающие машинное обучение
1. models (5 место, 72 417 звёзд)
Если вы слышали о машинном обучении с использованием Python, то наверняка что-нибудь слышали и о TensorFlow. Этот репозиторий также называется «TensorFlow Model Garden». Он организует модели машинного обучения и реализует их с помощью TensorFlow с примерами. Модели могут быть официально от TensorFlow, от некоторых известных исследовательских проектов или коммьюнити. Они могут экономить время, когда нужно использовать любые модели машинного обучения в TensorFlow.
2. keras (8-е место, 53 638 звёзд)
Очень популярный фреймворк машинного обучения на Python. Он предоставляет множество высокоуровневых API-интерфейсов, которые позволяют специалисту по обработке данных обучать deep learning модель с наименьшим количеством кода.
3. Face_recognition (13 рейтингов, 42 762 звезды)
Как следует из названия, этот проект может распознавать лица и управлять ими с помощью Python или командной строки. Утверждается, что это самая простая в мире библиотека распознавания лиц. Просто добавьте изображение с человеческими лицами, оно идентифицирует и найдет его. Затем вы даже можете изменить его, используя некоторые готовые функции.
4. Real-Time-Voice-Cloning (21-е место, 32 607 звёзд)
Я бы скорее поместил это в категорию машинного обучения, так как это потрясающий проект, но важно, чтобы им не злоупотребляли. По сути, он может «выучить» чей-то голос по 5-секундной записи речи, а затем использовать «выученный» голос, чтобы говорить что угодно. Ниже демонстрационное видео от автора.
5. DeepFaceLab (27 место, 30 651 звезда)
Если вы видели «дипфейковые» ролики, скорее всего, они созданы этим на базе этого проекта. Он запоминает человеческое лицо и «имплантирует» его в другое видео, чтобы заменить исходное лицо на то, которое нужно добавить. Может быть много этических проблем, но этот проект действительно потрясающий.
Репозитории, которые облегчают реальную жизнь
Эти репозитории написаны на Python, но используются в реальной жизни. Они могут либо сэкономить наше время, либо позволить нам делать какие-то интересные штуки.
1. Hоmе Assistant (11 место, 48 763 звезды)
Этот репозиторий представляет собой Hоmе Assistant с открытым исходным кодом, которая ставит на первое место локальный контроль и конфиденциальность. Работает благодаря огромному коммьюнити экспертов и энтузиастов DIY. Идеально подходит для работы на Raspberry Pi или локальном сервере. Используется во многих успешных продуктах, таких как Amazon Alexa и Google Cast.
2. openpilot (24 место, 31 998 звёзд)
Этот репозиторий представляет собой систему помощи водителю с открытым исходным кодом. Выполняет функции адаптивного круиз-контроля (ACC), автоматического центрирования полосы движения (ALC), предупреждения о лобовом столкновении (FCW) и предупреждения о выходе из полосы движения (LDW) для растущего числа поддерживаемых марок, моделей и годов выпуска автомобилей. Однако вам нужно купить их продукт и установить его на свой автомобиль. Это не совсем DIY, но жизнь действительно облегчает.
3. XX-Net (26 место, 31 002 звезды)
Это прокси-инструмент для обхода китайского «Великого файерволла», позволяющий китайским интернет-пользователям посещать сайты вроде YouTube и Facebook.
4. 12306 (28 место, 30 401 звезда)
12306 — это номер горячей линии для бронирования билетов на поезд в Китае, он также использовался в качестве доменного имени, когда они запустили онлайн-бронирование около 15 лет назад. Этот репозиторий представляет собой инструмент автоматического бронирования билетов, потому что мест может не хватать в часы пик, и забронировать их довольно сложно. Вот так разработчики решают проблемы :).
Репозитории, которые собирают и систематизируют полезную информацию
1. public-apis (1-е место, 173 658 звёзд)
В этом репозитории собраны сотни бесплатных API, которые можно использовать для разработки программного обеспечения и веб-приложений. Многие из них очень интересны, например Fun Facts, который случайным образом генерирует забавный факт каждый раз, когда мы его вызываем. Есть также несколько очень полезных API, таких как Colormind API, которые можно использовать для создания великолепных цветовых кодов, которые потенциально можно использовать в визуализации данных. Кроме того, существует множество открытых государственных API, которые можно использовать для получения статистических данных о стране.
2. awesome-python (4 место, 112 609 звёзд)
В этом репозитории собраны сотни других «потрясающих» Python-проектов с GitHub . Проекты разбиты по категориям, чтобы было проще найти нужный.
3. awesome-machine-learningе (10-е место, 52 487 звёзд)
Как и в предыдущем случае, в этом репозитории собраны проекты машинного обучения.
4. funNLP (17 место, 35 922 звезды)
Это китайский репозиторий, хотя он будет понятен и англоязычной аудитории. Однако в документации нет англоязычной версии. Он предоставляет словари НЛП, (чувствительные слова, наборы инструментов НЛП и некоторые учебные материалы).
5. interview_internal_reference (19 рейтинг, 33 135 звёзд)
Ещё один китайский репозиторий, в котором собраны частые вопросы на интервью от таких известных компаний, как Huawei. Он также предоставляет базовые знания, которые вы должны знать как разработчик данных, такие как алгоритмы и принципы проектирования баз данных.
6. Deep-Learning-Papers-Reading-Roadmap (24-е место, 31 521 звезда)
Если вы хотите изучить машинное обучение с нуля, этот репозиторий может стать хорошим началом. Он рисует «дорожную карту» развития машинного обучения в истории, используя научные статьи.
Репозитории, которые чему-то учат
Эти репозитории не предназначены для кода. Их можно рассматривать как «книгу» с открытым исходным кодом. Информация, которую они содержат, может быть использована для изучения чего-либо.
1. system-design-primer (2-е место, 157 775 звёзд)
Этот репозиторий — настоящее сокровище для тех, кто хочет начать карьеру системного архитектора. Он знакомит с множеством полезных концепций. Вы можете найти почти всё, что хотите знать, например, когда использовать SQL или NoSQL, как проектировать распределенную реляционную базу данных и что такое обратный прокси.
2. Python-100-Days (3-е место, 113 812 звёзд)
Это репозиторий на китайском языке. В нём знания по программированию на Python разделены на 100 частей, чтобы учащиеся могли пройти весь курс за 100 дней, если они будут упорно изучать по одной части в день. К сожалению, он не переведен на английский язык.
3. PayloadsAllTheThings (18 рейтингов, 33 407 звёзд)
В этом репозитории представлен список полезных нагрузок и средств обхода безопасности веб-приложений. Если вы хотите быть опытным веб-разработчиком, который хочет избежать популярных дыр и ловушек в системе безопасности, этот материал является обязательным для изучения. Почти все концепции реализованы на примере Python.
4. AiLearning (22-е место, 32 517 звёзд)
Репозиторий на китайском языке, обучающий от основ Python до фреймворка PyTorch ML.
5. d2l-zh (29 место, 29, 618 звёзд)
Книга называется «Погружение в глубокое обучение». Хотя сам репозиторий китайский, английскую версию (исходную версию) можно найти без особого труда.
Заключение
Очевидно, что рейтинг может не совсем верно отражать реальную ценность того или иного репозитория. Это сухие статистические данные, основанные на количестве закладок и оценок. А как известно, есть ложь, большая ложь и статистика. Тем не менее, кое-что интересное найти в этом списке можно.
Надеюсь, и вы тоже найдёте что-то для себя.
Что ещё интересного есть в блоге Cloud4Y
Подписывайтесь на наш Telegram-канал, чтобы не пропустить очередную статью. Пишем не чаще двух раз в неделю и только по делу.
Источник: habr.com
Лучшие Проекты Для Начинающих Python-Разработчиков
2022-06-12 в 1:52, admin , рубрики: junior python, pet-project, pylounge, python, обучение программированию, Программирование, Учебный процесс в IT
Чтобы научиться ходить – надо ходить, чтобы научиться подтягиваться – надо подтягиваться, чтобы научиться решать задачи по физике – надо решать задачи по физике. Так говорил преподаватель физики в моём университете, и эта аналогия применима и к программированию.
Можно сколько угодно упираться в сухую теорию, но без применения своих знаний на практике научиться программировать невозможно. В этой статье я подобрал несколько проектов для начинающих python-разработчиков. Эти проекты помогут закрепить теорию, применить полученные знания на практике и набить руку в написании кода. Некоторые из них даже можно добавить в будущее портфолио. Я объясню, чем хорош каждый проект, какие навыки и темы он позволяет проработать, а также сориентирую какие библиотеки и технологии можно использовать для его реализации.
Цель данного «топа» – это не создание самого оригинального портфолио и не перечисление уникальных проектов. Цель статьи разобраться в простых вещах, технологиях и темах, которые помогут развить практические навыки программирования. Поэтому не стоит ждать здесь сборку Оптимуса Прайма, программирование Звезды смерти и создание двигателя на китовом жире. Мы пройдёмся по простым, но в тоже время базовым вещам. Ведь как говорил один мой приятель: «Всё великое начинается с малого».
Парсер
Первый проект в списке – парсер сайтов. Это программа, которая просматривает код веб-сайта и получает оттуда какую-то информацию.
Предположим, есть сайт «Авито». Мы можем сделать программу, которая будет «как бы заходить» на Авито; просматривать объявления из раздела «Аренда квартир в Москве» (через программный код на страницах); и записывать в текстовый файл информацию из этих объявлений.
Пусть скрипт пишет в файл ссылку на объявление, контактный телефон, цену и описание. Затем этот файл сортируется по цене аренды, и на выходе мы сможем выбрать самые дешёвые квартиры. Такая программа и будет являться парсером или, как их часто называют, веб-скрапером.
В тренировочно-образовательных целях необходимо всё сделать максимально вручную, но без фанатизма. Поэтому используем модуль requests для работы с сетевыми запросами (для получения кода сайта, регистрации, авторизации). Библиотека BeautifulSoup понадобится для разбора и выдергивания информации из HTML-кода сайта, который мы получили с помощью requests.
Разработка парсера заставит разобраться с тем, что такое, зачем нужны и как работают сетевые протоколы HTTP/HTTPS. Придётся выяснить, что такое HTTP-запрос – из чего он состоит; как работать с GET, POST, PUT, DELETE-запросами; чем они отличаются; как формировать заголовки запросов. Предстоит покопаться со статус-кодами, URL-адресами, схемами авторизации, сессиями, редиректами, прокси и куки-файлами. Параллельно познакомиться с форматом JSON и вникнуть в HTML/CSS-код, семантику и DOM-модель веб-страницы.
Работа с сетевыми протоколами – это фундаментальные computer science навыки, без которых называть себя полноценным программистом немного не справедливо.
Мне кажется, пример с квартирами на Авито идеально подходит для пробы пера. Поэтому попробуйте написать скрипт, который создаст файл с информацией о всех трехкомнатных квартирах, которые продают в твоем городе, по цене, скажем, дороже 3 000 000 рублей.
На скелет подобного проекта можно нарастить мяса в виде подключения базы данных, многопоточного выполнения или вообще превратить парсер в пул Telegram-ботов, о которых мы и поговорим дальше.
Бот
Каждый мужчина должен посадить сына, вырастить дом и построить дерево, а каждый питонист должен сделать хотя бы одного бота для социальной сети или мессенджера.
Бот – это простой проект, но в тоже время, он даст новичку навыки работы со сторонними библиотеками, асинхронностью и, что самое главное, опыт работы со сторонним API.
Однако прежде придётся разобраться, что такое API, вникнуть в понятие синхронности/асинхронности, потренировать понимание ООП, если сделать бота классом, а не просто набором функций.
Масштабировать сложность проекта можно до бесконечности. Например, прикрутить базу данных или заставить бота присылать уведомления, когда изменяются цены в интернет-магазине. Если бот как-то взаимодействует с файлами на компьютере, то придётся параллельно освоить и работу с файловой системой.
В ходе разработки возникнут вопросы: как хранить в проекте секретные данные (токены, пароли), и как разделить бизнес логику приложения. Веcь код, отвечающий за работу непосредственно с площадкой, стоит вынести в один модуль, а код обработки полученных данных в другой модуль. Этим всё не ограничится. В процессе всплывёт ещё много других подводных камней. А это ценный практический опыт, который нам и нужен.
Загрузка (то есть деплой) бота на хостинг по типу Heroku или Google App Engine – уже отдельная история, которая также прокачает твои технические навыки.
Если хочется сделать бота ВКонтакте, то смотрим в сторону библиотек vkwave и vkbottle. Они современные, асинхронные и простые в использовании. Синхронный и уже местами забагованный vk_api использовать не советую.
Для Telegram рекомендую полностью асинхронный Aiogram.
В качестве альтернативы можно использовать модуль pytelegrambotapi. Он попроще и поддерживает как синхронный, так и асинхронный режим работы.
В случае с Discord ботами самым популярным является модуль discord.py (c 9 000 звёзд на GitHub). Он асинхронный, хорошо документирован и прост в освоении. По принципу использования и написания кода похож на Aiogram и vkwave.
Если разобраться, как работать с одной из перечисленных библиотек, то с другими проблем уже не возникнет. Этот принцип справедлив для многих модулей и фреймворков не только языка Python. Об этом я ещё скажу дальше.
Идея проекта попроще: бот, который по запросу присылает случайный фильм из файла или БД.
Вариант посложнее: бот для учёта финансов. Пишешь ему сообщение сколько денег потратил и на что. Он записывает всё в Google-таблицу, БД или Excel-таблицу и ведёт какую-нибудь статистику.
Можно сделать бота, который следит за ценами. Отправляешь ему ссылку на товар. Если на этот товар появляется скидка, бот присылает уведомление.
В случае с ботами всё ограничивается лишь вашей усидчивостью и фантазией. Ковыряйтесь на здоровье!
Веб-приложение (интернете магазин)
Если браться за создание сайта, то это должен быть не блог, не клон Instagram, не онлайн предсказатель будущего, а именно интернет-магазин.
Придётся разобраться с админ-панелью сайта, регистрацией, авторизацией, личным кабинетом, избранными товарами, корзиной, категориями товаров, подключением базы данных, миграциями, разграничением прав доступа, пагинацией, сессиями и кучей всего другого.
В качестве усложнения проекта можно добавить систему оплаты, скидочные промокоды, раздел с лидерами продаж, кеширование, отправку чека на почту или рекомендательную систему, основанную на in-memory СУБД Redis или вообще модели машинного обучения.
А если вы совсем без тормозов, то прикрутите REST API сайта. Для этого потребуется дополнительно вникнуть в вопросы сериализации JSON-объектов, работе с сетевыми протоколами и прочему.
Разработка веб-сайта познакомит вас с паттерном проектирования MVC (модель-представление-контроллер), HTML/CSS и, возможно, JavaScript кодом.
Основываясь на своём опыте, скажу, что для освоения веб-разработки лучше варианта чем Django нет. Django большой фреймворк, в котором по умолчанию есть модули для всего, что я перечислял выше. Кроме того, он базируется на классическом, упомянутом ранее шаблоне MVC (правда там он называется MVT, но не суть).
Изучая Django придётся научиться работать с маршрутизацией, моделями данных, миграциями, контроллерами, шаблонизаторами HTML и ORM (это специальная штука, которая позволяет работать с базой данных без SQL запросов, а через питоновские объекты). Много предстоит поработать с ООП, потому что все модели данных представлены классами. Часто приходится использовать наследование.
Важно, что практически все современные популярные питоновские и не только фреймворки устроены точно также, как Django. Если вы разберётесь с Django, понять, как работает PHPшный Laravel, Jav’овый Spring или Ruby on Rails не составит труда.
Django ORM практически идентичен Eloquent из Laravel, шаблонизаторы тоже плюс/минус у всех похожи, модели и миграции отличаются чисто косметически.
Потом, для расширения кругозора, можно ещё взглянуть на микрофреймворк Flask.
Выбирайте предметную область, которая вам интересна. Любите компьютерные игры – создаём магазин игр, тащитесь по топовому шмоту – вот вам магазин одежды. Короче стараемся получить максимум удовольствия. И едем дальше.
GUI
Разработка приложений с графическим интерфейсом не является основной сферой применения Python. Однако это не значит, что GUI на нем не пишут совсем.
В качестве тренировочного опыта, лично я бы остановился на создании Аудио проигрывателя для компьютера. На функционал не скупимся. Добавляем возможность работать с плейлистами, управление воспроизведением (старт, стоп, пауза, перемотка), стоит добавить анимацию звуковой дорожки, ползунки громкости и т.д. Про уникальный дизайн также не забываем.
Для графики рекомендую использовать фреймворк PyQt, а для работы с аудио библиотеку Pygame.
PyQt – более фундаментальный и сложный графический фреймворк, чем tkinter или pysimplegui. Поэтому обратить внимание стоит именно на него. Тут по аналогии с MVC веб-фреймворками. Разберись с базовыми принципами и дальше проблем не будет. Под базой здесь я подразумеваю концепцию событий (сигналов) и обработчиков событий (слотов).
PyQt также поможет прокачаться в понимании ООП, потому что все графические объекты представлены классами, а наследование используется повсеместно.
Внешний вид элементов в PyQt задаётся в графическом Дизайнере ручками или с помощью CSS-свойств в коде, что делает разработку проще.
По PyQt в Интернете много уроков, есть даже отдельные книги, что также плюс.
Отмечу, что многие графические приложения основаны на шаблоне проектирования MVP (модель-представление-представитель). Это вариация шаблона MVC на котором базируются веб-приложения.
Pygame – простая и популярная библиотека для работы с мультимедиа объектами. Позволяет работать с аудио, видофайлами, а если в ней хорошо разобраться, можно и 2D игру сделать.
Data Science-приблуды
Сферы искусственного интеллекта и Data Science занимают большую часть сообщества Python-разработчиков. Да, проекты подобного рода специфичны и вникать в них всем необязательно. Но не упомянуть о них я не мог.
Анализ данных – гигантская область, в которую входит математика, computer science и программирование. Разбор всех этих тем выходит за рамки данной статьи и заслуживает отдельного цикла.
Как по мне интересный проект – анализ настроения пользователя по его комментарию на форуме, или на вполне конкретном сайте, например, Кинопоиске. Оригинальностью проект не блещет. Но покопаться придётся.
Это задача из сферы обработки естественного языка (Natural Language Processing или NLP). Для работы с NLP стоит обратить внимание на библиотеки: NLTK, TextBlob, spacy, Gensim и CoreNLP. Пара слов о каждой.
NLTK – основная библиотека для NLP, позволяет обрабатывать тексты для классификации, токенизации, стемминга, разметки, фильтрации, работать с семантическими рассуждениями и многим другим. В первую очередь знакомиться именно с этой библиотекой.
TextBlob – обёртка над NLTK, которая предоставляет простой интерфейс для этой библиотеки. Иногда ею просто удобнее пользоваться.
spacy – модуль, который помогает решать спектр задач: от определения частей речи и выделения именованных сущностей, до создания собственных моделей анализа.
Gensim – библиотека тематического моделирования. Позволяет обрабатывать тексты, работать с векторными моделями слов (например, Word2Vec или FastText) и создавать тематические модели текстов.
CoreNLP – модуль для распознавания свойств текста.
Пока далеко не ушли от кино. Вспомним одну из классических задач машинного обучения – разработку системы рекомендаций. Рекомендательная система – это программа, которая будет угадывать предпочтения пользователя в плане выбора фильма. Для её написания придется научиться работать с такими базовыми библиотеками для любого data scientist’а как Pandas, Numpy, Matplotlib и Scikit.
Pandas нужен для обработки данных, NumPy для математических вычислений, Matplotlib позволяет визуализировать данные, то есть строить диаграммы и графики, а Scikit содержит модели машинного обучения и инструменты для работы с ними.
Следующий большой класс задач – компьютерное зрение. Не мудрствуя лукаво, создаём приложение, которое по фото или видео определяет наличие/отсутствие маски на лице человека. Самая ходовая библиотека компьютерного зрения – это OpenCV. Её и предстоит изучать. Также стоит ознакомиться со сверточными нейронными сетями и концепцией deep learning в целом.
Обучающие data-сеты для любого из указанных проектов можно спокойно найти в Интернете.
В этом топе, как и в большинстве интернет-подборок, не оказалось из рядя вон уникальных проектов. Почему так? Почему большинство python-каналов переполнено роликами по написанию однотипных ботов, парсеров и скриптов? Все просто! Все перечисленное – это базовые вещи, отвечающие за понятные базовые навыки, через развитие которых необходимо пройти каждому python -разработчику.
Чтобы найти что-то по-настоящему оригинальное, предлагаю поделиться вашими идеями интересных pet-проектов в комментариях.
Знаете, учиться всегда тяжело. А по началу очень тяжело. Но я в тебя верю! Господь тоже в тебя верит! Но на всякий случай, для подстраховки, он создал тебе в помощь Google.
Не забывай про это.
P.S. Также есть видеоверсия данной статьи на YouTube.
Источник: www.pvsm.ru