6 مهر 1402
تهران، خیابان آزادی، تقاطع قریب
برنامه نویسی نرم افزار برنامه نویسی وب

پروژه های برنامه نویسی پایتون برای افراد حرفه‌ای (2)

پروژه های برنامه نویسی پایتون برای افراد حرفه‌ای (2)

در قسمت اول از این پست دو قسمتی، با 15 مورد از پروژه های برنامه نویسی پایتون برای افراد مبتدی و متوسط آشنا شدید. در این قسمت، با 15 مورد دیگر از پروژه های برنامه نویسی پایتون برای افراد متوسط و حرفه‌ای آشنا خواهید شد.

پروژه های پایتون در حد متوسط (بخش 2)

پروژه های برنامه نویسی پایتون: Queue

این مورد از پروژه های برنامه نویسی پایتون یک کلاس جدید برای پیاده سازی Queue ایجاد می‌کند. این یک ساختار داده رایج در علوم کامپیوتر، برای زمانی است که نیاز به رسیدگی به سناریوهای First-In-First-Out (FIFO) دارید، مانند صف‌های message ، تسک‌های CPU و غیره.

کد این پروژه ساده است و به شما فرصت تمرین بیشتری را با برنامه نویسی شیءگرا می‌دهد. Queue را امتحان کنید تا به نحوه عملکرد آن پی ببرید. سپس آماده استفاده از این ساختار داده در پروژه‌های دیگر خود خواهید بود.

Source Code:

				
					'''
Queue Data Structure
-------------------------------------------------------------
'''


class Queue:

   def __init__(self):
       self.items = []

   def __repr__(self):
       return f'Queue object: data={self.items}'

   def is_empty(self):
       return not self.items

   def enqueue(self, item):
       self.items.append(item)

   def dequeue(self):
       return self.items.pop(0)

   def size(self):
       return len(self.items)

   def peek(self):
       return self.items[0]


if __name__ == '__main__':
   q = Queue()
   print(q.is_empty())
   q.enqueue('First')
   q.enqueue('Second')
   print(q)
   print(q.dequeue())
   print(q)
   print(q.size())
   print(q.peek())
				
			

پروژه های برنامه نویسی پایتون: مثلث پاسکال

این مورد از پروژه های برنامه نویسی پایتون، مثلث پاسکال را با استفاده از عبارات شرطی و حلقه‌ها (loops) پرینت می‌کند. همچنین از ماژول ریاضی کتابخانه استاندارد و تابع factorial برای ارزیابی معادله «تعداد ترکیبات» استفاده می‌کند که برای تولید مقادیر (values) در مثلث کاربرد دارد.

Source Code:

				
					'''
Pascal's Triangle
-------------------------------------------------------------
Number of combinations via "n choose k" or nCk = n! / [k! * (n-k)!]
'''


from math import factorial


def pascal_triangle(n):
   for i in range(n):
       for j in range(n-i+1):
           print(end=' ')

       for j in range(i+1):
          
           print(factorial(i)//(factorial(j)*factorial(i-j)), end=' ')

       print()


if __name__ == '__main__':
   pascal_triangle(5)
				
			

پروژه های برنامه نویسی پایتون: Blackjack

این مورد به عنوان یکی از جالب‌ترین پروژه های برنامه نویسی پایتون، برای هر کسی که از بازی‌های کارتی لذت می‌برد، جذاب خواهد بود. چرا که قرار است بازی Blackjack را تقلید کنیم. این یک بازی کارتی فوق‌العاده محبوب با قوانین نسبتاً ساده است: مهمترین آن‌ها این است که برای برنده شدن به امتیاز 21 نیاز دارید، یا باید امتیازتان نسبت به پخش‌کننده کارت بیشتر باشد، بدون این‌که مقدار آن از 21 بالا بزند و بسوزید!

این بزرگترین پروژه موجود در این لیست است که بیشتر مهارت‌هایی را که در پروژه های برنامه نویسی پایتون قبلی پوشش دادیم، با هم ترکیب می‌کند. از جمله ایجاد کلاس‌ها، حلقه‌ها، دستورات شرطی، وارد کردن ماژول‌ها، پذیرش ورودی کاربر و string formatting.

وقت خود را صرف کار روی بخش‌های مختلف این کد کنید و آن را به پروژه‌های قبلی مرتبط کنید تا ببینید تکنیک‌های مختلف چگونه با هم کار می‌کنند. این چیزی نیست که قبلاً ندیده باشید، فقط کمی متفاوت پکیج‌بندی شده و برای ایجاد یک شبیه‌ساز بازی کاملاً functional ترکیب شده است.

و باید بگوییم که سعی کنید کل روز مشغول بازی با آن نشوید! ولی کاملاً درکتان می‌کنیم اگر این کار را انجام دهید!

Source Code:

				
					'''
Blackjack
-------------------------------------------------------------
'''


import random
import os


class Card:

   def __init__(self, card_face, value, symbol):
       self.card_face = card_face
       self.value = value
       self.symbol = symbol


def show_cards(cards, hidden):
   s = ''
   for card in cards:
       s = s + '\t ________________'
   if hidden:
       s += '\t ________________'
   print(s)

   s = ''
   for card in cards:
       s = s + '\t|                |'
   if hidden:
       s += '\t|                |'
   print(s)

   s = ''
   for card in cards:
       if card.card_face in ['J', 'Q', 'K', 'A']:
           s = s + '\t|  {}             |'.format(card.card_face)
       elif card.value == 10:
           s = s + '\t|  {}            |'.format(card.value)
       else:
           s = s + '\t|  {}             |'.format(card.value)

   if hidden:
       s += '\t|                |'
   print(s)

   s = ''
   for card in cards:
       s = s + '\t|                |'
   if hidden:
       s += '\t|      * *       |'
   print(s)

   s = ''
   for card in cards:
       s = s + '\t|                |'
   if hidden:
       s += '\t|    *     *     |'
   print(s)

   s = ''
   for card in cards:
       s = s + '\t|                |'
   if hidden:
       s += '\t|   *       *    |'
   print(s)

   s = ''
   for card in cards:
       s = s + '\t|                |'
   if hidden:
       s += '\t|   *       *    |'
   print(s)

   s = ''
   for card in cards:
       s = s + '\t|       {}        |'.format(card.symbol)
   if hidden:
       s += '\t|          *     |'
   print(s)

   s = ''
   for card in cards:
       s = s + '\t|                |'
   if hidden:
       s += '\t|         *      |'
   print(s)

   s = ''
   for card in cards:
       s = s + '\t|                |'
   if hidden:
       s += '\t|        *       |'
   print(s)

   s = ''
   for card in cards:
       s = s + '\t|                |'
   if hidden:
       s += '\t|                |'
   print(s)

   s = ''
   for card in cards:
       s = s + '\t|                |'
   if hidden:
       s += '\t|                |'
   print(s)

   s = ''
   for card in cards:
       if card.card_face in ['J', 'Q', 'K', 'A']:
           s = s + '\t|            {}   |'.format(card.card_face)
       elif card.value == 10:
           s = s + '\t|           {}   |'.format(card.value)
       else:
           s = s + '\t|            {}   |'.format(card.value)
   if hidden:
       s += '\t|        *       |'
   print(s)

   s = ''
   for card in cards:
       s = s + '\t|________________|'
   if hidden:
       s += '\t|________________|'
   print(s)
   print()


def deal_card(deck):
   card = random.choice(deck)
   deck.remove(card)
   return card, deck


def play_blackjack(deck):
   player_cards = []
   dealer_cards = []
   player_score = 0
   dealer_score = 0
   os.system('clear')

   while len(player_cards) < 2:
       player_card, deck = deal_card(deck)
       player_cards.append(player_card)
       player_score += player_card.value

       # If dealt a second Ace, adjust player score
       if len(player_cards) == 2:
           if player_cards[0].value == 11 and player_cards[1].value == 11:
               player_cards[0].value = 1
               player_score -= 10

       print('PLAYER CARDS: ')
       show_cards(player_cards, False)
       print('PLAYER SCORE = ', player_score)

       input('Continue...')

       dealer_card, deck = deal_card(deck)
       dealer_cards.append(dealer_card)
       dealer_score += dealer_card.value

       # If dealt a second Ace, adjust dealer score
       # Note: adjusts 2nd card to hide that the dealer has an Ace
       if len(dealer_cards) == 2:
           if dealer_cards[0].value == 11 and dealer_cards[1].value == 11:
               dealer_cards[1].value = 1
               dealer_score -= 10

       print('DEALER CARDS: ')
       if len(dealer_cards) == 1:
           show_cards(dealer_cards, False)
           print('DEALER SCORE = ', dealer_score)
       else:
           show_cards(dealer_cards[:-1], True)
           print('DEALER SCORE = ', dealer_score - dealer_cards[-1].value)

       input('Continue...')

   if player_score == 21:
       print('PLAYER HAS A BLACKJACK!!!!')
       print('PLAYER WINS!!!!')
       quit()
   os.system('clear')

   print('DEALER CARDS: ')
   show_cards(dealer_cards[:-1], True)
   print('DEALER SCORE = ', dealer_score - dealer_cards[-1].value)
   print()
   print('PLAYER CARDS: ')
   show_cards(player_cards, False)
   print('PLAYER SCORE = ', player_score)

   while player_score < 21:
       choice = input('Enter H to Hit or S to Stand: ').upper()
       if len(choice) != 1 or (choice not in ['H', 'S']):
           os.system('clear')
           print('Invalid choice!! Try Again...')
           continue

       if choice.upper() == 'S':
           break
       else:
           player_card, deck = deal_card(deck)
           player_cards.append(player_card)
           player_score += player_card.value
           card_pos = 0

           # If dealt an Ace, adjust score for each existing Ace in hand
           while player_score > 21 and card_pos < len(player_cards):
               if player_cards[card_pos].value == 11:
                   player_cards[card_pos].value = 1
                   player_score -= 10
                   card_pos += 1
               else:
                   card_pos += 1
          
           if player_score > 21:
               break

           os.system('clear')
           print('DEALER CARDS: ')
           show_cards(dealer_cards[:-1], True)
           print('DEALER SCORE = ', dealer_score - dealer_cards[-1].value)
           print()
           print('PLAYER CARDS: ')
           show_cards(player_cards, False)
           print('PLAYER SCORE = ', player_score)

   os.system('clear')
   print('PLAYER CARDS: ')
   show_cards(player_cards, False)
   print('PLAYER SCORE = ', player_score)
   print()
   print('DEALER IS REVEALING THEIR CARDS....')
   print('DEALER CARDS: ')
   show_cards(dealer_cards, False)
   print('DEALER SCORE = ', dealer_score)

   if player_score == 21:
       print('PLAYER HAS A BLACKJACK, PLAYER WINS!!!')
       quit()

   if player_score > 21:
       print('PLAYER BUSTED!!! GAME OVER!!!')
       quit()

   input('Continue...')
   while dealer_score < 17:
       os.system('clear')
       print('DEALER DECIDES TO HIT.....')
       dealer_card, deck = deal_card(deck)
       dealer_cards.append(dealer_card)
       dealer_score += dealer_card.value

       # If dealt an Ace, adjust score for each existing Ace in hand
       card_pos = 0
       while dealer_score > 21 and card_pos < len(dealer_cards):
           if dealer_cards[card_pos].value == 11:
               dealer_cards[card_pos].value = 1
               dealer_score -= 10
               card_pos += 1
           else:
               card_pos += 1

       print('PLAYER CARDS: ')
       show_cards(player_cards, False)
       print('PLAYER SCORE = ', player_score)
       print()
       print('DEALER CARDS: ')
       show_cards(dealer_cards, False)
       print('DEALER SCORE = ', dealer_score)
       if dealer_score > 21:
           break
       input('Continue...')

   if dealer_score > 21:
       print('DEALER BUSTED!!! YOU WIN!!!')
       quit()
   elif dealer_score == 21:
       print('DEALER HAS A BLACKJACK!!! PLAYER LOSES!!!')
       quit()
   elif dealer_score == player_score:
       print('TIE GAME!!!!')
   elif player_score > dealer_score:
       print('PLAYER WINS!!!')
   else:
       print('DEALER WINS!!!')


def init_deck():
   suits = ['Spades', 'Hearts', 'Clubs', 'Diamonds']
   # UNICODE values for card symbol images
   suit_symbols = {'Hearts': '\u2661', 'Diamonds': '\u2662',
                   'Spades': '\u2664', 'Clubs': '\u2667'}
   cards = {'A': 11, '2': 2, '3': 3, '4': 4, '5': 5, '6': 6,
            '7': 7, '8': 8, '9': 9, '10': 10, 'J': 10, 'Q': 10, 'K': 10}
   deck = []
   for suit in suits:
       for card, value in cards.items():
           deck.append(Card(card, value, suit_symbols[suit]))
   return deck


if __name__ == '__main__':
   deck = init_deck()
   play_blackjack(deck)
				
			

پروژه های برنامه نویسی پایتون: Reddit Bot

این مورد از پروژه های برنامه نویسی پایتون، یک Reddit Bot خودکار با چند ماژول جدید ایجاد می‌کند، که praw و enchant نام دارند. (به دستورات نصب pip مراجعه کنید).

این یک کانسپت نسبتاً ساده است، زیرا برنامه هر کامنت را در یک subreddit انتخاب شده بررسی می‌کند و سپس به هر نظری که حاوی یک trigger phrase از پیش تعریف شده است، پاسخ می‌دهد. به منظور انجام این کار، برای تعامل با Reddit و ایجاد کلمات مشابه کامنت، از ماژول praw استفاده می‌کنیم که به ما امکان می‌دهد پاسخ مناسبی به سؤالات بدهیم.

این یک ایده واقعاً مفید است، چرا که یاد می‌گیرید چگونه به سؤالات موجود در subreddit خود پاسخ دهید. شما فقط باید این کد را گسترش دهید تا برای سؤالات از پیش تعریف‌شده، پاسخ‌های خودکار ارائه دهد. (احتمالاً پیشتر متوجه شده‌اید که افراد زیادی در Reddit این کار را می‌کنند!).

نکته مهم: شما باید این دستورالعمل‌ها را بررسی کنید تا client_id ، client_secret ، نام کاربری، پسوورد و user_agent خود را در دست داشته باشید. شما به این اطلاعات نیاز دارید تا از طریق رابط API به reddit ها کامنت دهید.

Source Code:

				
					'''
Reddit Reply Bot
-------------------------------------------------------------
pip install praw pyenchant
'''


import praw
import enchant


def reddit_bot(sub, trigger_phrase):
   reddit = praw.Reddit(
       client_id='your_client_id',
       client_secret='your_client_secret',
       username='your_username',
       password='your_pw',
       user_agent='your_user_agent'
   )

   subreddit = reddit.subreddit(sub)
   dict_suggest = enchant.Dict('en_US')

   for comment in subreddit.stream.comments():
       if trigger_phrase in comment.body.lower():
           word = comment.body.replace(trigger_phrase, '')
           reply_text = ''
           similar_words = dict_suggest.suggest(word)
           for similar in similar_words:
               reply_text += (similar + ' ')
           comment.reply(reply_text)


if __name__ == '__main__':
   reddit_bot(sub='Python', trigger_phrase='useful bot')
				
			

پروژه های برنامه نویسی پایتون: Fibonacci Generator

اعداد فیبوناچی ممکن است مهم‌ترین اعداد در زندگی ما باشند، زیرا اغلب در طبیعت ظاهر می‌شوند.

این مورد از پروژه های برنامه نویسی پایتون، با استفاده از recursion اعداد فیبوناچی را تا یک طول مشخص ایجاد می‌کند. (بله، recursion بیشتر!) برای این که زمان‌های محاسباتی از کنترل خارج نشوند، هنگام محاسبه مقادیر cache ، memorization را پیاده‌سازی کرده‌ایم.

متوجه خواهید شد که برای این الگوریتم recursive (بازگشتی)، حالت پایه تنظیم شده است تا بررسی کند که آیا مقدار دنباله فیبوناچی داده شده از قبل در cache ذخیره شده است یا خیر. اگر چنین است، چیزی را که می‌بینید برمی‌گرداند (که یک عملیات پیچیدگی زمانی ثابت است)، که مقدار زیادی از زمان محاسبات را ذخیره می‌کند.

Source Code:

				
					'''
Fibonacci Sequence
-------------------------------------------------------------
'''

fib_cache = {}


def fib_memo(input_val):
   if input_val in fib_cache:
       return fib_cache[input_val]

   if input_val == 0:
       val = 0
   elif input_val < 2:
       val = 1
   else:
       val = fib_memo(input_val - 1) + fib_memo(input_val - 2)

   fib_cache[input_val] = val
   return val


if __name__ == '__main__':
   print('======== Fibonacci Series ========')
   for i in range(1, 11):
       print(f'Fibonacci ({i}) : {fib_memo(i)}')
				
			

پروژه های پایتون برای افراد حرفه‌ای

پروژه های برنامه نویسی پایتون: Chatbot

این پروژه پایتون از ماژول Chatbot (به دستورالعمل‌های نصب pip در زیر مراجعه کنید) برای آموزش یک چت بات خودکار برای پاسخ به هر سؤالی که شما بپرسید استفاده می‌کند! میدانم؛ ما الان داریم از هوش مصنوعی استفاده می‌کنیم!

خواهید دید که این برنامه یکی از پروژه های نسبتاً کوتاه برنامه نویسی پایتون در این لیست است، اما اگر می‌خواهید بیشتر بدانید یا ویژگی‌های کد را گسترش دهید، می‌توانید اسناد ChatterBot را همراه با حوزه گسترده‌تر چت‌بات‌های هوش مصنوعی بررسی کنید.

نکته مهم: ChatterBot دیگر به طور فعال نگهداری نمی‌شود. این بدین معناست که شما باید یک تغییر کوچک در فایل tagging.py واقع در دایرکتوری Lib/site-packages/chatterbot در فولدر نصب پایتون خود ایجاد کنید.

نگران نباشید، انجام دادن این کار ساده است و ما source code مورد نیاز برای آن را برایتان آماده کرده‌ایم.

Source Code:

				
					'''
Chat Bot
-------------------------------------------------------------
1) pip install ChatterBot chatterbot-corpus spacy
2) python3 -m spacy download en_core_web_sm
   Or... choose the language you prefer
3) Navigate to your Python3 directory
4) Modify Lib/site-packages/chatterbot/tagging.py
  to properly load 'en_core_web_sm'
'''


from chatterbot import ChatBot
from chatterbot.trainers import ChatterBotCorpusTrainer


def create_chat_bot():
   chatbot = ChatBot('Chattering Bot')
   trainer = ChatterBotCorpusTrainer(chatbot)
   trainer.train('chatterbot.corpus.english')

   while True:
       try:
           bot_input = chatbot.get_response(input())
           print(bot_input)

       except (KeyboardInterrupt, EOFError, SystemExit):
           break


if __name__ == '__main__':
   create_chat_bot()
				
			

تغییر tagging.py :

اولین code snippet را پیدا کنید که بخشی از متد __init__ برای کلاس PosLemmaTagger است. این را با عبارت if/else جایگزین کنید.

توجه: این مثال برای کتابخانه انگلیسی است، اما در صورت تمایل می‌توانید آن را به زبان دیگری تغییر دهید.

				
					# Replace this:
self.nlp = spacy.load(self.language.ISO_639_1.lower())

# With this:
if self.language.ISO_639_1.lower() == 'en':
   self.nlp = spacy.load('en_core_web_sm')
else:
   self.nlp = spacy.load(self.language.ISO_639_1.lower())
				
			

22. تبدیل متن به گفتار

این مورد از پروژه های برنامه نویسی پایتون از طیف وسیعی از کتابخانه‌های جدید برای تبدیل یک مقاله به یک فایل mp3 قابل پخش استفاده می‌کند. شما باید nltk (کیت ابزار زبان طبیعی)، newspaper3k و gtts را نصب کنید (به دستورالعمل‌های نصب pip مراجعه کنید).

خواهید دید که نوشتن این برنامه ساده است، زیرا ما به راحتی URL یک مقاله را برای convert شدن ارسال می‌کنیم، سپس به تابعی که تعریف کرده‌ایم اجازه می‌دهیم تبدیل متن به گفتار را با ماژول‌های تازه نصب شده ما انجام دهد.

بنابراین، دفعه بعدی که دوست دارید مقاله خود را به یک پادکست قابل پخش تبدیل کنید، این را امتحان کنید زیرا قطعاً یکی از کدهای جالب پایتون برای کپی کردن است!

Source Code:

				
					'''
Text To Speech
-------------------------------------------------------------
pip install nltk newspaper3k gtts
'''


import nltk
from newspaper import Article
from gtts import gTTS


def text_to_speech(url):
   article = Article(url)
   article.download()
   article.parse()
   nltk.download('punkt')
   article.nlp()
   article_text = article.text
   language = 'en'
   my_obj = gTTS(text=article_text, lang=language, slow=False)
   my_obj.save("read_article.mp3")


if __name__ == '__main__':
   text_to_speech(
       url='https://hackr.io/blog/top-tech-companies-hiring-python-developers'
   )
				
			

پروژه های برنامه نویسی پایتون: سیستم مدیریت کتابخانه

این برنامه به عنوان یکی از پروژه های پیشرفته برنامه نویسی پایتون، از برنامه نویسی شیءگرا برای شبیه‌سازی سیستم مدیریت کتابخانه استفاده می‌کند.

در این مثال، ما یک کلاس Library و یک کلاس Student ایجاد می‌کنیم که می‌توانیم از آن برای ایجاد سیستم کتابخانه خود و کاربران آن استفاده کنیم. سپس یک رابط کاربری ساده را پیاده‌سازی کردیم که از کاربر می‌خواهید از میان طیف وسیعی از اقدامات رایج در یک کتابخانه، مانند امانت گرفتن یا بازگرداندن کتاب، یکی را انتخاب کند.

این یک مثال ساده و در عین حال قدرتمند از این است که چگونه می‌توانید سیستم‌های دنیای واقعی را از طریق پایتون و برنامه نویسی شیءگرا بسازید. پس با خیال راحت، کلاس‌ها را گسترش دهید تا ویژگی‌های مفید دیگری مانند ID کتاب‌ها، نسخه‌های متعدد از یک کتاب، تاریخ بازگشت، جریمه‌های دیرکرد و هر ویژگی دیگری را که فکر می‌کنید یک کتابخانه باید داشته باشد، شامل شود.

Source Code:

				
					'''
Library
-------------------------------------------------------------
'''


class Library:

   def __init__(self, books):
       self.books = books

   def show_avail_books(self):
       print('Our Library Can Offer You The Following Books:')
       print('================================================')
       for book, borrower in self.books.items():
           if borrower == 'Free':
               print(book)

   def lend_book(self, requested_book, name):
       if self.books[requested_book] == 'Free':
           print(
               f'{requested_book} has been marked'
               f' as \'Borrowed\' by: {name}')
           self.books[requested_book] = name
           return True
       else:
           print(
               f'Sorry, the {requested_book} is currently'
               f' on loan to: {self.books[requested_book]}')
           return False

   def return_book(self, returned_book):
       self.books[returned_book] = 'Free'
       print(f'Thanks for returning {returned_book}')


class Student:
   def __init__(self, name, library):
       self.name = name
       self.books = []
       self.library = library

   def view_borrowed(self):
       if not self.books:
           print('You haven\'t borrowed any books')
       else:
           for book in self.books:
               print(book)

   def request_book(self):
       book = input(
           'Enter the name of the book you\'d like to borrow >> ')
       if self.library.lend_book(book, self.name):
           self.books.append(book)

   def return_book(self):
       book = input(
           'Enter the name of the book you\'d like to return >> ')
       if book in self.books:
           self.library.return_book(book)
       else:
           print('You haven\'t borrowed that book, try another...')


def create_lib():
   books = {
       'The Last Battle': 'Free',
       'The Hunger Games': 'Free',
       'Cracking the Coding Interview': 'Free'
   }
   library = Library(books)
   student_example = Student('Your Name', library)

   while True:
       print('''
           ==========LIBRARY MENU===========
           1. Display Available Books
           2. Borrow a Book
           3. Return a Book
           4. View Your Books
           5. Exit'''
             )

       choice = int(input('Enter Choice: '))
       if choice == 1:
           print()
           library.show_avail_books()
       elif choice == 2:
           print()
           student_example.request_book()
       elif choice == 3:
           print()
           student_example.return_book()
       elif choice == 4:
           print()
           student_example.view_borrowed()
       elif choice == 5:
           print('Goodbye')
           exit()


if __name__ == '__main__':
   create_lib()
				
			

پروژه های برنامه نویسی پایتون: Pong Arcade Game

این یک پروژه واقعاً سرگرم‌کننده و جالب است، زیرا ما از ماژول  turtle پایتون برای تقلید از بازی کلاسیک Pong استفاده کرده‌ایم!

ما از متدهای مختلفی از ماژول turtle (لاک‌پشت) برای ایجاد اجزای بازی خود و تشخیص برخورد توپ با پدال‌های بازیکن استفاده کرده‌ایم. ما همچنین مجموعه‌ای از کلیدهای اتصال را برای تنظیم کنترل‌های کاربر برای پدال‌های بازیکن چپ و راست تعریف کرده‌ایم. با خیال راحت تنظیمات بازی را آزمایش کنید تا درک بهتری از نحوه کار آن تنظیمات و تأثیر آن‌ها بر کلیت بازی به دست آورید.

خارج از این توابع گرافیکی turtle که به تازگی معرفی شده است، ما از string formatting برای خروجی جدول امتیازات فعلی و عملکردهای تعریف شده توسط کاربر برای مرتب نگه داشتن کد خود استفاده کرده‌ایم. این‌ها مفاهیمی هستند که در این مرحله باید با آن‌ها آشنا شوید.

Source Code:

				
					'''
Pong Arcade Game
-------------------------------------------------------------
'''


import turtle


def update_score(l_score, r_score, player, score_board):
   if player == 'l':
       l_score += 1
   else:
       r_score += 1

   score_board.clear()
   score_board.write('Left Player: {} -- Right Player: {}'.format(
       l_score, r_score), align='center',
       font=('Arial', 24, 'normal'))
   return l_score, r_score, score_board


def setup_game():
   screen = turtle.Screen()
   screen.title('Pong Arcade Game')
   screen.bgcolor('white')
   screen.setup(width=1000, height=600)

   l_paddle = turtle.Turtle()
   l_paddle.speed(0)
   l_paddle.shape('square')
   l_paddle.color('red')
   l_paddle.shapesize(stretch_wid=6, stretch_len=2)
   l_paddle.penup()
   l_paddle.goto(-400, 0)

   r_paddle = turtle.Turtle()
   r_paddle.speed(0)
   r_paddle.shape('square')
   r_paddle.color('black')
   r_paddle.shapesize(stretch_wid=6, stretch_len=2)
   r_paddle.penup()
   r_paddle.goto(400, 0)

   ball = turtle.Turtle()
   ball.speed(40)
   ball.shape('circle')
   ball.color('blue')
   ball.penup()
   ball.goto(0, 0)
   ball.dx = 5
   ball.dy = -5

   score_board = turtle.Turtle()
   score_board.speed(0)
   score_board.color('blue')
   score_board.penup()
   score_board.hideturtle()
   score_board.goto(0, 260)
   score_board.write('Left Player: 0 -- Right Player: 0',
                     align='center', font=('Arial', 24, 'normal'))

   return screen, ball, l_paddle, r_paddle, score_board


def pong_game():
   game_components = setup_game()
   screen = game_components[0]
   ball = game_components[1]
   l_paddle = game_components[2]
   r_paddle = game_components[3]
   score_board = game_components[4]
   l_score = 0
   r_score = 0

   def l_paddle_up():
       l_paddle.sety(l_paddle.ycor() + 20)

   def l_paddle_down():
       l_paddle.sety(l_paddle.ycor() - 20)

   def r_paddle_up():
       r_paddle.sety(r_paddle.ycor() + 20)

   def r_paddle_down():
       r_paddle.sety(r_paddle.ycor() - 20)

   screen.listen()
   screen.onkeypress(l_paddle_up, 'e')
   screen.onkeypress(l_paddle_down, 'x')
   screen.onkeypress(r_paddle_up, 'Up')
   screen.onkeypress(r_paddle_down, 'Down')

   while True:
       screen.update()
       ball.setx(ball.xcor()+ball.dx)
       ball.sety(ball.ycor()+ball.dy)

       if ball.ycor() > 280:
           ball.sety(280)
           ball.dy *= -1

       if ball.ycor() < -280:
           ball.sety(-280)
           ball.dy *= -1

       if ball.xcor() > 500:
           ball.goto(0, 0)
           ball.dy *= -1
           l_score, r_score, score_board = update_score(
               l_score, r_score, 'l', score_board)
           continue

       elif ball.xcor() < -500:
           ball.goto(0, 0)
           ball.dy *= -1
           l_score, r_score, score_board = update_score(
               l_score, r_score, 'r', score_board)
           continue

       if ((ball.xcor() > 360) and
           (ball.xcor() < 370) and
           (ball.ycor() < r_paddle.ycor()+40) and
               (ball.ycor() > r_paddle.ycor()-40)):
           ball.setx(360)
           ball.dx *= -1

       if ((ball.xcor() < -360) and
               (ball.xcor() > -370) and
               (ball.ycor() < l_paddle.ycor()+40) and
               (ball.ycor() > l_paddle.ycor()-40)):
           ball.setx(-360)
           ball.dx *= -1


if __name__ == '__main__':
   pong_game()
				
			

پروژه های برنامه نویسی پایتون: تست سرعت تایپ

این یکی از جالب ترین پروژه های برنامه نویسی پایتون است که سرعت تایپ یک جمله توسط شما را تست می‌کند.

این برنامه از ما می‌خواهد که از طریق ماژول tkinter ، یک رابط کاربری گرافیکی (GUI) ایجاد کنیم. اگر در کار با رابط کاربری گرافیکی تجربه کمی دارید، این مثال مقدمه خوبی است. زیرا ما از طیف وسیعی از لیبل‌ها، دکمه‌ها و فیلدهای ورودی ساده برای ایجاد یک پنجره استفاده می‌کنیم. ما همچنین از ماژول timeit پایتون  برای رسیدگی به جنبه زمان‌بندی تست تایپ خود و از ماژول random برای انتخاب تصادفی یک عبارت تستی استفاده کرده‌ایم.

ما فقط دو عبارت تستی را به این مثال اضافه کرده‌ایم، اما می‌توانید نمونه‌های بیشتری را در آن قرار دهید یا حتی یک دیکشنری شخص ثالث را برای داشتن مجموعه وسیعی از مثال‌ها، در آن ادغام نمایید.

Source Code:

				
					'''
Speed Typing Test
-------------------------------------------------------------
'''


import tkinter
from timeit import default_timer as timer
import random


def speed_test():
   speed_test_sentences = [
       'This is a random sentence to check speed.',
       'Speed, I am lightning mcqueen.'
   ]

   sentence = random.choice(speed_test_sentences)
   start = timer()
   main_window = tkinter.Tk()
   main_window.geometry('600x400')

   label_1 = tkinter.Label(main_window, text=sentence, font='times 20')
   label_1.place(x=150, y=10)

   label_2 = tkinter.Label(main_window, text='Start Typing', font='times 20')
   label_2.place(x=10, y=50)

   entry = tkinter.Entry(main_window)
   entry.place(x=280, y=55)

   def check_result():
       if entry.get() == sentence:
           end = timer()
           label_3.configure(text=f'Time: {round((end-start), 4)}s')
       else:
           label_3.configure(text='Wrong Input')

   button_1 = tkinter.Button(main_window, text='Done',
                             command=check_result, width=12, bg='grey')
   button_1.place(x=150, y=100)

   button_2 = tkinter.Button(main_window, text='Try Again',
                             command=speed_test, width=12, bg='grey')
   button_2.place(x=250, y=100)

   label_3 = tkinter.Label(main_window, text='', font='times 20')
   label_3.place(x=10, y=300)

   main_window.mainloop()


if __name__ == '__main__':
   speed_test()
				
			

پروژه های برنامه نویسی پایتون: Text Editor

این مورد از پروژه های برنامه نویسی پایتون، با تکیه بر آخرین نمونه tkinter ما، یک رابط کاربری گرافیکی برای شبیه‌سازی Text Editor (ویرایشگر متن) خودمان ایجاد می‌کند. این مثال همچنین از اجزای استاندارد رابط کاربری گرافیکی، از جمله لیبل‌ها، دکمه‌ها و فیلدهای ورودی استفاده می‌کند.

با این حال، ما توانایی باز کردن و ذخیره فایل‌ها را مانند یک ویرایشگر متن واقعی به آن اضافه کرده‌ایم. اگر در مدیریت فایل‌ها تازه کار هستید، این پروژه پایتون راهی عالی برای درک نحوه خواندن و ذخیره فایل‌ها است.

برای تقویت خود، کد زیر را آزمایش کنید، و ببینید آیا می‌توانید این کد را برای ایجاد ویژگی‌های دیگری که عادت دارید در یک ویرایشگر متن ببینید، (مانند عملکرد find word) گسترش دهید؟

Source Code:

				
					'''
Text Editor
-------------------------------------------------------------
'''


import tkinter as tk
from tkinter.filedialog import askopenfilename, asksaveasfilename


def text_editor():
   def open_file():
       filepath = askopenfilename(
           filetypes=[('Text Files', '*.txt'), ('All Files', '*.*')]
       )

       if not filepath:
           return

       txt_edit.delete(1.0, tk.END)
       with open(filepath, 'r') as input_file:
           text = input_file.read()
           txt_edit.insert(tk.END, text)
       window.title(f'TextEditor - {filepath}')

   def save_file():
       filepath = asksaveasfilename(
           defaultextension='txt',
           filetypes=[('Text Files', '*.txt'), ('All Files', '*.*')],
       )

       if not filepath:
           return

       with open(filepath, 'w') as output_file:
           text = txt_edit.get(1.0, tk.END)
           output_file.write(text)
       window.title(f'Text Editor - {filepath}')

   window = tk.Tk()
   window.title('Text Editor')
   window.rowconfigure(0, minsize=800, weight=1)
   window.columnconfigure(1, minsize=800, weight=1)

   txt_edit = tk.Text(window)
   fr_buttons = tk.Frame(window, relief=tk.RAISED, bd=2)
   btn_open = tk.Button(fr_buttons, text='Open', command=open_file)
   btn_save = tk.Button(fr_buttons, text='Save As...', command=save_file)

   btn_open.grid(row=0, column=0, sticky='ew', padx=5, pady=5)
   btn_save.grid(row=1, column=0, sticky='ew', padx=5)

   fr_buttons.grid(row=0, column=0, sticky='ns')
   txt_edit.grid(row=0, column=1, sticky='nsew')

   window.mainloop()


if __name__ == '__main__':
  text_editor()
				
			

پروژه های برنامه نویسی پایتون: حل‌کننده سودوکو

این مورد از پروژه های برنامه نویسی پایتون از کتابخانه pygame (به دستورالعمل‌های نصب pip مراجعه کنید) به منظور پیاده سازی یک رابط کاربری گرافیکی،برای حل خودکار سودوکو استفاده می‌کند. ما برای ایجاد رابط کاربری گرافیکی، از چندین تابع user-defined استفاده می‌کنیم، همان‌طور که در زیر نشان داده شده است.

برای حل یک سودوکو، این برنامه از الگوریتم عقبگرد (backtracking) استفاده می‌کند که به صورت تدریجی راه حل‌ها را بررسی می‌کند. همچنین اگر راه حل فعلی قابل اجرا نباشد، آن را رها می‌کند.

این مرحله از کنار گذاشتن راه حل، یک ویژگی تعیین‌کننده در رویکرد backtracking است، زیرا برنامه به عقب برمی‌گردد تا راه حل جدیدی پیدا کند. و این کار را آن‌قدر ادامه می‌دهد تا راه حل معتبری به دست بیاورد. این فرآیند به صورت تدریجی انجام می‌شود، تا زمانی که کل شبکه به درستی پر شود.

پس با خیال راحت سودوکوهای مختلف را تست کنید، و حتی سعی کنید از سودوکوهای سخت‌تر و با ابعاد بزرگتر استفاده کنید. (اگر این کار را انجام دهید، به یک تصویر پایه جدید نیاز خواهید داشت).

Source Code:

				
					'''
Sudoku Solver
-------------------------------------------------------------
pip install pygame
image link:
https://www.pngitem.com/pimgs/m/210-2106648_empty-sudoku-grid-grid-6x6-png-transparent-png.png
'''


import pygame


pygame.font.init()
screen = pygame.display.set_mode((600, 600))
pygame.display.set_caption('SUDOKU SOLVER USING BACKTRACKING')
img = pygame.image.load('icon.png')
pygame.display.set_icon(img)
font1 = pygame.font.SysFont('comicsans', 40)
font2 = pygame.font.SysFont('comicsans', 20)
x = 0
y = 0
dif = 500 / 9
val = 0

# Default Sudoku Board
grid = [
   [7, 8, 0, 4, 0, 0, 1, 2, 0],
   [6, 0, 0, 0, 7, 5, 0, 0, 9],
   [0, 0, 0, 6, 0, 1, 0, 7, 8],
   [0, 0, 7, 0, 4, 0, 2, 6, 0],
   [0, 0, 1, 0, 5, 0, 9, 3, 0],
   [9, 0, 4, 0, 6, 0, 0, 0, 5],
   [0, 7, 0, 3, 0, 0, 0, 1, 2],
   [1, 2, 0, 0, 0, 7, 4, 0, 0],
   [0, 4, 9, 2, 0, 6, 0, 0, 7]
]


def get_coord(pos):
   x = pos[0] // dif
   y = pos[1] // dif


def draw_box():
   for i in range(2):
       pygame.draw.line(screen, (255, 0, 0), (x * dif-3, (y + i)
                        * dif), (x * dif + dif + 3, (y + i)*dif), 7)
       pygame.draw.line(screen, (255, 0, 0), ((x + i) * dif,
                        y * dif), ((x + i) * dif, y * dif + dif), 7)


def draw():
   for i in range(9):
       for j in range(9):
           if grid[i][j] != 0:
               pygame.draw.rect(screen, (0, 153, 153),
                                (i * dif, j * dif, dif + 1, dif + 1))
               text1 = font1.render(str(grid[i][j]), 1, (0, 0, 0))
               screen.blit(text1, (i * dif + 15, j * dif + 15))

   for i in range(10):
       if i % 3 == 0:
           thick = 7
       else:
           thick = 1
       pygame.draw.line(screen, (0, 0, 0), (0, i * dif),
                        (500, i * dif), thick)
       pygame.draw.line(screen, (0, 0, 0), (i * dif, 0),
                        (i * dif, 500), thick)


def draw_val(val):
   text1 = font1.render(str(val), 1, (0, 0, 0))
   screen.blit(text1, (x * dif + 15, y * dif + 15))


def raise_error_1():
   text1 = font1.render('WRONG !!!', 1, (0, 0, 0))
   screen.blit(text1, (20, 570))


def raise_error_2():
   text1 = font1.render('Wrong !!! Not a valid Key', 1, (0, 0, 0))
   screen.blit(text1, (20, 570))


def valid(m, i, j, val):
   for it in range(9):
       if m[i][it] == val:
           return False
       if m[it][j] == val:
           return False

   it = i // 3
   jt = j // 3

   for i in range(it * 3, it * 3 + 3):
       for j in range(jt * 3, jt * 3 + 3):
           if m[i][j] == val:
               return False
   return True


def solve(grid, i, j):
   while grid[i][j] != 0:
       if i < 8:
           i += 1
       elif i == 8 and j < 8:
           i = 0
           j += 1
       elif i == 8 and j == 8:
           return True

   pygame.event.pump()
   for it in range(1, 10):
       if valid(grid, i, j, it) == True:
           grid[i][j] = it
           x = i
           y = j
           screen.fill((255, 255, 255))
           draw()
           draw_box()
           pygame.display.update()
           pygame.time.delay(20)

           if solve(grid, i, j) == 1:
               return True
           else:
               grid[i][j] = 0
           screen.fill((255, 255, 255))

           draw()
           draw_box()
           pygame.display.update()
           pygame.time.delay(50)
   return False


def instruction():
  text1 = font2.render(
      'PRESS D TO RESET TO DEFAULT / R TO EMPTY\n', 1, (0, 0, 0))
  text2 = font2.render(
      'ENTER VALUES AND PRESS ENTER TO VISUALIZE\n', 1, (0, 0, 0))
  screen.blit(text1, (20, 520))
  screen.blit(text2, (20, 540))


def result():
  text1 = font1.render('FINISHED PRESS R or D\n', 1, (0, 0, 0))
  screen.blit(text1, (20, 570))


run = True
flag_1 = 0
flag_2 = 0
rs = 0
error = 0
while run:
   screen.fill((255, 255, 255))
   for event in pygame.event.get():
       if event.type == pygame.QUIT:
           run = False
       if event.type == pygame.MOUSEBUTTONDOWN:
           flag_1 = 1
           pos = pygame.mouse.get_pos()
           get_coord(pos)
       if event.type == pygame.KEYDOWN:
           if event.key == pygame.K_LEFT:
               x -= 1
               flag_1 = 1
           if event.key == pygame.K_RIGHT:
               x += 1
               flag_1 = 1
           if event.key == pygame.K_UP:
               y -= 1
               flag_1 = 1
           if event.key == pygame.K_DOWN:
               y += 1
               flag_1 = 1
           if event.key == pygame.K_1:
               val = 1
           if event.key == pygame.K_2:
               val = 2
           if event.key == pygame.K_3:
               val = 3
           if event.key == pygame.K_4:
               val = 4
           if event.key == pygame.K_5:
               val = 5
           if event.key == pygame.K_6:
               val = 6
           if event.key == pygame.K_7:
               val = 7
           if event.key == pygame.K_8:
               val = 8
           if event.key == pygame.K_9:
               val = 9
           if event.key == pygame.K_RETURN:
               flag_2 = 1

           # If R pressed clear sudoku board
           if event.key == pygame.K_r:
               rs = 0
               error = 0
               flag_2 = 0
               grid = [
                   [0, 0, 0, 0, 0, 0, 0, 0, 0],
                   [0, 0, 0, 0, 0, 0, 0, 0, 0],
                   [0, 0, 0, 0, 0, 0, 0, 0, 0],
                   [0, 0, 0, 0, 0, 0, 0, 0, 0],
                   [0, 0, 0, 0, 0, 0, 0, 0, 0],
                   [0, 0, 0, 0, 0, 0, 0, 0, 0],
                   [0, 0, 0, 0, 0, 0, 0, 0, 0],
                   [0, 0, 0, 0, 0, 0, 0, 0, 0],
                   [0, 0, 0, 0, 0, 0, 0, 0, 0]
               ]

           # If D pressed reset board to default
           if event.key == pygame.K_d:
               rs = 0
               error = 0
               flag_2 = 0
               grid = [
                   [7, 8, 0, 4, 0, 0, 1, 2, 0],
                   [6, 0, 0, 0, 7, 5, 0, 0, 9],
                   [0, 0, 0, 6, 0, 1, 0, 7, 8],
                   [0, 0, 7, 0, 4, 0, 2, 6, 0],
                   [0, 0, 1, 0, 5, 0, 9, 3, 0],
                   [9, 0, 4, 0, 6, 0, 0, 0, 5],
                   [0, 7, 0, 3, 0, 0, 0, 1, 2],
                   [1, 2, 0, 0, 0, 7, 4, 0, 0],
                   [0, 4, 9, 2, 0, 6, 0, 0, 7]
               ]

   if flag_2 == 1:
       if solve(grid, 0, 0) == False:
           error = 1
       else:
           rs = 1
       flag_2 = 0

   if val != 0:
       draw_val(val)
       if valid(grid, int(x), int(y), val) == True:
           grid[int(x)][int(y)] = val
           flag_1 = 0
       else:
           grid[int(x)][int(y)] = 0
           raise_error_2()
       val = 0

   if error == 1:
       raise_error_1()
   if rs == 1:
       result()
   draw()
   if flag_1 == 1:
       draw_box()
   instruction()

   pygame.display.update()

				
			

پروژه های برنامه نویسی پایتون: Site Connectivity Checker

این مورد از پروژه های برنامه نویسی پایتون از ماژول‌های urllib و tkinter برای تست متصل بودن وب سایت استفاده می‌کند.

ما از ماژول tkinter برای ایجاد رابط کاربری گرافیکی استفاده کرده‌ایم. این ماژول به کاربران اجازه می‌دهد مانند نمونه‌های قبلی ما، آدرس وب را وارد کنند. این شامل لیبل‌ها، دکمه‌ها و فیلدهای ورودی است.

پس از دریافت آدرس وب کاربر، آن را به تابع تعریف شده توسط کاربر (user-defined) منتقل می‌کنیم تا از طریق تابع .getcode() ماژول urllib یک کد وضعیت HTTP را برای وب سایت فعلی برگردانیم.

برای این مثال، ما به راحتی تعیین می‌کنیم که آیا کد HTTP، 200 است یا خیر. اگر این‌طور باشد، می‌دانیم که سایت کار می‌کند. در غیر این صورت، به کاربر اطلاع می‌دهیم که در دسترس نیست.

می‌توانید این کد را گسترش دهید تا رویکردی جزئی‌تر برای مدیریت response code های HTTP در نظر بگیرید. بنابراین، در اضافه کردن به آن راحت باشید!

Source Code:

				
					'''
Site Connectivity Checker
-------------------------------------------------------------
Enter websites as http(s)://www.yourwebsite.com
'''


import urllib.request
import tkinter as tk


def test_connectivity():
  window = tk.Tk()
  window.geometry('600x400')
  head = tk.Label(window, text='Website Connectivity Checker',
                  font=('Calibri 15'))
  head.pack(pady=20)

  def check_url():
      web = (url.get())
      status_code = urllib.request.urlopen(web).getcode()
      website_is_up = status_code == 200

      if website_is_up:
          tk.Label(window, text='Website Available',
                   font=('Calibri 15')).place(x=260, y=200)
      else:
          tk.Label(window, text='Website Not Available',
                   font=('Calibri 15')).place(x=260, y=200)

  url = tk.StringVar()
  tk.Entry(window, textvariable=url).place(x=200, y=80, height=30, width=280)
  tk.Button(window, text='Check', command=check_url).place(x=285, y=150)
  window.mainloop()


if __name__ == '__main__':
  test_connectivity()
				
			

پروژه های برنامه نویسی پایتون: Language Detector

این نمونه از پروژه های برنامه نویسی پایتون از ماژول langdetect (به دستورالعمل‌های نصب pip مراجعه کنید) استفاده می‌کند تا به ما کمک کند زبان وارد شده را شناسایی کنیم. اگر مطمئن نیستید متنی که پیش روی شماست، به چه زبانی نوشته شده است، این مورد واقعاً مفید خواهد بود.

این مثال دیگری است که ما در آن از tkinter برای ایجاد یک رابط کاربری گرافیکی ساده شامل لیبل‌ها، دکمه‌ها و یک فیلد ورودی استفاده کرده‌ایم. سپس می‌توانیم متن را از فیلد ورودی دریافت و آن را با langdetect پردازش کنیم تا مشخص کند متن ورودی به چه زبانی است. در نهایت، این نتیجه را در رابط کاربری گرافیکی پرینت می‌کنیم تا کاربر از نتیجه مطلع شود.

توجه داشته باشید نتایجی که توسط langdetect برگردانده می‌شوند، کدهای زبان مختصر هستند. به عنوان مثال، اگر متن انگلیسی را وارد کنیم، en را به عنوان مقدار بازگشتی خواهیم دید.

Source Code:

				
					'''
Language Detector
-------------------------------------------------------------
pip install langdetect
'''


from langdetect import detect
import tkinter as tk


def detect_lang():
   window = tk.Tk()
   window.geometry('600x400')
   head = tk.Label(window, text='Language Detector', font=('Calibri 15'))
   head.pack(pady=20)

   def check_language():
       new_text = text.get()
       lang = detect(str(new_text))
       tk.Label(window, text=lang, font=('Calibri 15')).place(x=260, y=200)

   text = tk.StringVar()
   tk.Entry(window, textvariable=text).place(
       x=200, y=80, height=30, width=280)
   tk.Button(window, text='Check Language',
             command=check_language).place(x=285, y=150)
   window.mainloop()


if __name__ == '__main__':
   detect_lang()
				
			

پروژه های برنامه نویسی پایتون: سیستم توصیه فیلم Netflix

آخرین مورد از پروژه های برنامه نویسی پایتون در لیست ما، یک پروژه بسیار هیجان‌انگیز است که مخصوصاً آن را در آخر لیست قرار داده‌ایم! این یک سیستم توصیه فیلم Netflix است که برای مدیران ارشد داده و علاقه‌مندان به یادگیری ماشین، بسیار جذاب خواهد بود.

برای ایجاد این پروژه، باید طیف وسیعی از ماژول‌ها، از جمله tkinter ، re ، nltk ، pandas و numpy را وارد کنید. (به دستورالعمل‌های نصب pip برای ماژول‌های جدید مراجعه کنید). همچنین باید مجموعه داده‌ای (dataset) حاوی فیلم‌ها و سریال‌های Netflix را از اینجا دانلود نمایید.

ما از tkinter برای ایجاد رابط کاربری گرافیکی خود استفاده می‌کنیم که از لیبل‌ها، دکمه‌ها و فیلدهای ورودی استفاده می‌کند. سپس کاربر می‌تواند سریال یا فیلمی را که از آن لذت می‌برد وارد کند تا توصیه‌هایی بر اساس سلیقه خود دریافت نماید.

موتور توصیه از بازیگران، کارگردانان، رنکینگ فیلم، کشور سازنده و ژانرهای سینمایی به عنوان «ویژگی‌های» یادگیری ماشین استفاده می‌کند. سپس کد از رویکرد cosine similarity برای یافتن نتایج مشابه بر اساس ورودی کاربر بهره می‌برد. این برنامه به طور گسترده‌ای از pandas و numpy برای پاکسازی داده‌ها و آماده‌سازی آن‌ها برای پردازش استفاده می‌کند.

در این مثال، چیزهای زیادی وجود دارد که می‌تواند باز شود. بهترین رویکرد این است که به آرامی روی کد کار کنید و سپس تحقیقات بیشتری در مورد یادگیری ماشین (ML)، «ویژگی‌ها» و «cosine similarity» انجام دهید.

سپس می‌توانید نحوه استفاده از مجموعه داده برای استخراج توصیه بر اساس شباهت‌ها را درک کنید. اگر شما یک مدیر ارشد مشتاق داده هستید، این یک پروژه فوق‌العاده برای شما خواهد بود.

Source Code:

				
					'''
Netflix Recommendation Engine
-------------------------------------------------------------
pip install pandas numpy nltk
'''


from nltk.tokenize import word_tokenize
import numpy as np
import pandas as pd
import re
import nltk
import tkinter as tk
from nltk.corpus import stopwords
nltk.download('stopwords')

data = pd.read_csv('netflixData.csv')
data = data.dropna(subset=['Cast', 'Production Country', 'Rating'])
movies = data[data['Content Type'] == 'Movie'].reset_index()
movies = movies.drop(['index', 'Show Id', 'Content Type', 'Date Added',
                    'Release Date', 'Duration', 'Description'], axis=1)
movies.head()
tv = data[data['Content Type'] == 'TV Show'].reset_index()
tv = tv.drop(['index', 'Show Id', 'Content Type', 'Date Added',
            'Release Date', 'Duration', 'Description'], axis=1)
tv.head()
actors = []
for i in movies['Cast']:
   actor = re.split(r', \s*', i)
   actors.append(actor)
flat_list = []

for sublist in actors:
   for item in sublist:
       flat_list.append(item)

actors_list = sorted(set(flat_list))
binary_actors = [[0] * 0 for i in range(len(set(flat_list)))]
for i in movies['Cast']:
   k = 0
   for j in actors_list:
       if j in i:
           binary_actors[k].append(1.0)
       else:
           binary_actors[k].append(0.0)
       k += 1

binary_actors = pd.DataFrame(binary_actors).transpose()
directors = []
for i in movies['Director']:
   if pd.notna(i):
       director = re.split(r', \s*', i)
       directors.append(director)

flat_list_2 = []
for sublist in directors:
   for item in sublist:
       flat_list_2.append(item)

directors_list = sorted(set(flat_list_2))
binary_directors = [[0] * 0 for i in range(len(set(flat_list_2)))]
for i in movies['Director']:
   k = 0
   for j in directors_list:
       if pd.isna(i):
           binary_directors[k].append(0.0)
       elif j in i:
           binary_directors[k].append(1.0)
       else:
           binary_directors[k].append(0.0)
       k += 1

binary_directors = pd.DataFrame(binary_directors).transpose()
countries = []
for i in movies['Production Country']:
   country = re.split(r', \s*', i)
   countries.append(country)

flat_list_3 = []
for sublist in countries:
   for item in sublist:
       flat_list_3.append(item)

countries_list = sorted(set(flat_list_3))
binary_countries = [[0] * 0 for i in range(len(set(flat_list_3)))]
for i in movies['Production Country']:
   k = 0
   for j in countries_list:
       if j in i:
           binary_countries[k].append(1.0)
       else:
           binary_countries[k].append(0.0)
       k += 1

binary_countries = pd.DataFrame(binary_countries).transpose()
genres = []
for i in movies['Genres']:
   genre = re.split(r', \s*', i)
   genres.append(genre)

flat_list_4 = []
for sublist in genres:
   for item in sublist:
       flat_list_4.append(item)

genres_list = sorted(set(flat_list_4))
binary_genres = [[0] * 0 for i in range(len(set(flat_list_4)))]
for i in movies['Genres']:
   k = 0
   for j in genres_list:
       if j in i:
           binary_genres[k].append(1.0)
       else:
           binary_genres[k].append(0.0)
       k += 1

binary_genres = pd.DataFrame(binary_genres).transpose()
ratings = []
for i in movies['Rating']:
   ratings.append(i)

ratings_list = sorted(set(ratings))
binary_ratings = [[0] * 0 for i in range(len(set(ratings_list)))]
for i in movies['Rating']:
   k = 0
   for j in ratings_list:
       if j in i:
           binary_ratings[k].append(1.0)
       else:
           binary_ratings[k].append(0.0)
       k += 1

binary_ratings = pd.DataFrame(binary_ratings).transpose()
binary = pd.concat([binary_actors, binary_directors,
                  binary_countries, binary_genres], axis=1, ignore_index=True)
actors_2 = []
for i in tv['Cast']:
  actor2 = re.split(r', \s*', i)
  actors_2.append(actor2)

flat_list_5 = []
for sublist in actors_2:
   for item in sublist:
       flat_list_5.append(item)

actors_list_2 = sorted(set(flat_list_5))
binary_actors_2 = [[0] * 0 for i in range(len(set(flat_list_5)))]
for i in tv['Cast']:
   k = 0
   for j in actors_list_2:
       if j in i:
           binary_actors_2[k].append(1.0)
       else:
           binary_actors_2[k].append(0.0)
       k += 1

binary_actors_2 = pd.DataFrame(binary_actors_2).transpose()
countries_2 = []
for i in tv['Production Country']:
   country2 = re.split(r', \s*', i)
   countries_2.append(country2)

flat_list_6 = []
for sublist in countries_2:
   for item in sublist:
       flat_list_6.append(item)

countries_list_2 = sorted(set(flat_list_6))
binary_countries_2 = [[0] * 0 for i in range(len(set(flat_list_6)))]
for i in tv['Production Country']:
   k = 0
   for j in countries_list_2:
       if j in i:
           binary_countries_2[k].append(1.0)
       else:
           binary_countries_2[k].append(0.0)
       k += 1

binary_countries_2 = pd.DataFrame(binary_countries_2).transpose()
genres_2 = []
for i in tv['Genres']:
   genre2 = re.split(r', \s*', i)
   genres_2.append(genre2)

flat_list_7 = []
for sublist in genres_2:
   for item in sublist:
       flat_list_7.append(item)

genres_list_2 = sorted(set(flat_list_7))
binary_genres_2 = [[0] * 0 for i in range(len(set(flat_list_7)))]
for i in tv['Genres']:
   k = 0
   for j in genres_list_2:
       if j in i:
           binary_genres_2[k].append(1.0)
       else:
           binary_genres_2[k].append(0.0)
       k += 1

binary_genres_2 = pd.DataFrame(binary_genres_2).transpose()
ratings_2 = []
for i in tv['Rating']:
   ratings_2.append(i)

ratings_list_2 = sorted(set(ratings_2))
binary_ratings_2 = [[0] * 0 for i in range(len(set(ratings_list_2)))]
for i in tv['Rating']:
   k = 0
   for j in ratings_list_2:
       if j in i:
           binary_ratings_2[k].append(1.0)
       else:
           binary_ratings_2[k].append(0.0)
       k += 1

binary_ratings_2 = pd.DataFrame(binary_ratings_2).transpose()
binary_2 = pd.concat([binary_actors_2, binary_countries_2,
                    binary_genres_2], axis=1, ignore_index=True)

window = tk.Tk()
window.geometry('600x600')
head = tk.Label(window, text='Enter Movie / TV Show on Netflix For Recommendations', font=('Calibri 15'))
head.pack(pady=20)


def netflix_recommender(search):
   cs_list = []
   binary_list = []

   if search in movies['Title'].values:
       idx = movies[movies['Title'] == search].index.item()
       for i in binary.iloc[idx]:
           binary_list.append(i)

       point_1 = np.array(binary_list).reshape(1, -1)
       point_1 = [val for sublist in point_1 for val in sublist]
       for j in range(len(movies)):
           binary_list_2 = []
           for k in binary.iloc[j]:
               binary_list_2.append(k)
           point_2 = np.array(binary_list_2).reshape(1, -1)
           point_2 = [val for sublist in point_2 for val in sublist]
           dot_product = np.dot(point_1, point_2)
           norm_1 = np.linalg.norm(point_1)
           norm_2 = np.linalg.norm(point_2)
           cos_sim = dot_product / (norm_1 * norm_2)
           cs_list.append(cos_sim)

       movies_copy = movies.copy()
       movies_copy['cos_sim'] = cs_list
       results = movies_copy.sort_values('cos_sim', ascending=False)
       results = results[results['title'] != search]
       top_results = results.head(5)
       return (top_results)

   elif search in tv['Title'].values:
       idx = tv[tv['Title'] == search].index.item()
       for i in binary_2.iloc[idx]:
           binary_list.append(i)

       point_1 = np.array(binary_list).reshape(1, -1)
       point_1 = [val for sublist in point_1 for val in sublist]
       for j in range(len(tv)):
           binary_list_2 = []
           for k in binary_2.iloc[j]:
               binary_list_2.append(k)

           point_2 = np.array(binary_list_2).reshape(1, -1)
           point_2 = [val for sublist in point_2 for val in sublist]
           dot_product = np.dot(point_1, point_2)
           norm_1 = np.linalg.norm(point_1)
           norm_2 = np.linalg.norm(point_2)
           cos_sim = dot_product / (norm_1 * norm_2)
           cs_list.append(cos_sim)

       tv_copy = tv.copy()
       tv_copy['cos_sim'] = cs_list
       results = tv_copy.sort_values('cos_sim', ascending=False)
       results = results[results['Title'] != search]
       top_results = results.head(5)
       return (top_results)

   else:
       return ('Title not in dataset. Please check spelling.')


def call_recommender():
  subject = text.get()
  recommendation = netflix_recommender(subject)
  txt = ''
  for i in recommendation.iterrows():
      txt += 'Title: ' + str(i[1][0]) + '\n'
  tk.Label(window, text=txt, font=('Calibri 15')).place(x=195, y=150)


text = tk.StringVar()
tk.Entry(window, textvariable=text).place(x=200, y=80, height=30, width=280)
tk.Button(window, text='Find Recommendations',
         command=call_recommender).place(x=285, y=150)
window.mainloop()
				
			

پروژه های برنامه نویسی پایتون: گراف‌های سه بعدی با Matplotlib

ابتدایی ترین نمودار سه بعدی در این پروژه های برنامه نویسی پایتون، یک خط یا نمودار پراکنده است که از بردارهای سه‌گانه (x,y,z) ایجاد می‌شود. با استفاده از توابع ax.plot3D و ax.scatterd3D می‌توانیم نمودارهای دوبعدی و سه‌بعدی ایجاد کنیم. call signature این‌ها تقریباً مشابه نمودارهای دوبعدی است. در اینجا ما یک نمودار مارپیچی مثلثاتی را به همراه چند نقطه که به طور تصادفی در نزدیکی خط قرار گرفته‌اند، رسم خواهیم کرد:

				
					import numpy as np
import matplotlib.colors as col
from mpl_toolkits.mplot3d import Axes3D
import matplotlib.pyplot as plt
#Data for a three dimensional line
z = np.linspace(0, 15, 1000)
x = np.sin(z)
y = np.cos(z)
ax.plot3D(x, y, z, 'grey')
#Data for three dimensional scattered points
z = 15 * np.random.random(100)
x = np.sin(z) + 0.1 * np.random.randn(100)
y = np.cos(z) + 0.1 * np.random.randn(100)
ax.scatter3D(x, y, z, c=z, cmap='Greens')
plt.show()
				
			
پروژه های برنامه نویسی پایتون: گراف‌های سه بعدی با Matplotlib

نمودارهای کانتوری سه بعدی

نمودارهای ax.contour3D ، مانند نمودارهای دوبعدی ax.contour نیاز دارند که تمام داده‌های ورودی، به شکل شبکه‌های منظم دوبعدی باشند و داده‌های z در هر نقطه ارزیابی شوند. در این‌جا یک نمودار کانتوری سه‌بعدی از یک تابع سینوسی سه‌بعدی را نشان خواهیم داد:

				
					def f(x, y):
    return np.sin(np.sqrt(x ** 2 + y ** 2))
x = np.linspace(-6, 6, 30)
y = np.linspace(-6, 6, 30)
x, y = np.meshgrid(x, y)
z = f(x, y)
fig = plt.figure()
ax = plt.axes(projection='3d')
ax.contour3D(x,y,z,50, cmap='binary')
ax.set_xlabel('x')
ax.set_ylabel('y')
ax.set_zlabel('z')
plt.show()
				
			
نمودارهای کانتوری سه بعدی

Wireframe ‌ها و نمودارهای Surface Plot

دو نوع دیگر از نمودارهای سه‌بعدی در این پروژه های برنامه نویسی پایتون، که بر روی داده‌های شبکه‌ای کار می‌کنند، Wireframe ها و Surface Plot ها هستند. این نمودارها شبکه‌ای از مقادیر را می‌گیرند و آن را روی سطح سه‌بعدی مشخص‌شده می‌تابانند تا فرم‌های سه‌بعدی حاصل را به آسانی تصویرسازی کنند. در اینجا، یک مثال با استفاده از Wireframe آورده‌ایم:

				
					fig = plt.figure()
ax = plt.axes(projection='3d')
ax.plot_wireframe(x,y,z, color='black')
ax.set_title('wireframe')
plt.show()
				
			
پروژه های برنامه نویسی پایتون: Wireframe ‌ها و نمودارهای Surface Plot

Surface Plot هم مانند Wireframe است، اما هر وجه از Wireframe با یک چندضلعی پر شده است. افزودن یک colormap به چندضلعی‌های پر شده، می‌تواند به درک توپولوژی سطح تصویرسازی‌شده کمک کند:

				
					ax = plt.axes(projection='3d')
ax.plot_surface(x, y, z, rstride=1,
                cstride=1, cmap='viridis',
                edgecolor='none')
ax.set_title('surface')
plt.show()
				
			
پروژه های برنامه نویسی پایتون: Wireframe ‌ها و نمودارهای Surface Plot - رنگی

پروژه های برنامه نویسی پایتون: رابط کاربری گرافیکی تقویم

پایتون Tkinter را برای توسعه GUI اپلیکیشن‌ها فراهم کرده است. حالا این به مهارت‌ها و تخیل توسعه دهنده بستگی دارد که با این کتابخانه، چه چیزی را توسعه دهد. در این آموزش پروژه های برنامه نویسی پایتون، من با استفاده از کتابخانه Tkinter  پایتون یک GUI تقویم خواهم ساخت. در این برنامه، کاربر باید سال مورد نظر را پر کند تا تقویم مربوط به آن سال ظاهر شود.

GUI تقویم با پایتون

				
					#Importing tkinter module
from tkinter import *
#importing calendar module
import calendar

#function to show calendar of the given year
def showCalender():
    gui = Tk()
    gui.config(background='grey')
    gui.title("Calender for the year")
    gui.geometry("550x600")
    year = int(year_field.get())
    gui_content= calendar.calendar(year)
    calYear = Label
				
			
				
					#Driver code
if __name__=='__main__':
    new = Tk()
    new.config(background='grey')
    new.title("Calender")
    new.geometry("250x140")
    cal = Label(new, text="Calender",bg='grey',font=("times", 28, "bold"))
    year = Label(new, text="Enter year", bg='dark grey')
    year_field=Entry(new)
    button = Button(new, text='Show Calender',
fg='Black',bg='Blue',command=showCalender)

    #putting widgets in position
    cal.grid(row=1, column=1)
    year.grid(row=2, column=1)
    year_field.grid(row=3, column=1)
    button.grid(row=4, column=1)
    Exit.grid(row=6, column=1)
    new.mainloop()
				
			
پروژه های برنامه نویسی پایتون: رابط کاربری گرافیکی تقویم

 پایتون را از کجا شروع کنیم؟

امروزه، ما شاهد گسترش روزافزون هوش مصنوعی (AI)، یادگیری ماشین (ML) و علم داده (Data Science) در اکثر بخش‌های تجارت هستیم. یکی از اصلی‌ترین ویژگی‌های مشترک این فیلدها، استفاده از زبان برنامه نویسی پایتون است.

وقتی نوبت به یادگیری و انجام دادن پروژه های برنامه نویسی پایتون در سال 2023 می‌رسد، انتخاب‌های زیادی پیش روی شماست. می‌توانید بهترین کتاب‌های آموزش پایتون را مطالعه کنید، می‌توانید پکیج‌های ویدیویی پایتون را ببینید یا در یک دوره بوت‌کمپ شرکت کنید.

نتیجه‌گیری

ما در این مطلب دوقسمتی، 30 پروژه جالب، سرگرم‌کننده و هیجان‌انگیز پایتون را با Source Code هایشان به شما معرفی کردیم. از ساده تا پیشرفته. این پروژه های برنامه نویسی پایتون شامل بازی‌ها، پروژه‌های برنامه نویسی شیءگرا، رابط‌های کاربری گرافیکی، هوش مصنوعی (AI)، یادگیری ماشین (ML)، API ها، بات‌ها، ماژول‌های کتابخانه استاندارد و چندین کتابخانه شخص ثالث بود.

وجه اشتراک هر کدام از این ایده‌ها، این بود که از شما می‌خواهند آن‌چه را به طور نظری از پایتون یاد گرفته‌اید، به طور عملی پیاده‌سازی کنید. با این کار، می‌توانید خود را محک بزنید و مهارت‌های برنامه نویسی پایتون خود را بهبود ببخشید. زیرا مراحلی را برای تبدیل شدن به یک برنامه نویس حرفه‌ای طی کرده‌اید.

پرسش‌های رایج (FAQs)

1. آیا پایتون برای پروژه های برنامه نویسی بزرگ مناسب است؟

اگر این بحث وجود دارد که پایتون نسبت به سایر زبان‌های محبوب مانند C و ++C کندتر است، باید بدانید این زبان برنامه نویسی هنوز هم به طور گسترده‌ای توسط بسیاری از شرکت‌های برتر حوزه فناوری استفاده می‌شود. زیرا یک زبان همه‌کاره و به راحتی قابل نگهداری است و از تعداد زیادی کتابخانه پشتیبانی می‌کند. همچنین جامعه کاربری بزرگ و فعالی دارد.

2. کدام مورد از پروژه های برنامه نویسی پایتون را اول از همه انجام دهم؟

هر یک از پروژه‌های مبتدی پایتون که در قسمت اول این مطلب پوشش دادیم، از Mad Libs گرفته تا سنگ کاغذ قیچی و Tic-Tac-Toe ، برای شما مناسب است.

در این دو مطلب، با تعدادی از پروژه های مبتدی و حرفه‌ای پایتون آشنا شدید. اگر دستتان گرم شده و می‌خواهید پروژه های دیگری را هم امتحان کنید، این مطالب را از دست ندهید:

منبع: hackr و Medium
{{ reviewsTotal }}{{ options.labels.singularReviewCountLabel }}
{{ reviewsTotal }}{{ options.labels.pluralReviewCountLabel }}
{{ options.labels.newReviewButton }}
{{ userData.canReview.message }}
X