Các dự án Python từ cơ bản đến nâng cao (Kèm Source Code)

Ngày đăng: 04/10/2021   -    Cập nhật: 30/12/2021
Lời mở đầu

Trong một thế giới mà AI, ML, và Khoa học dữ liệu là các công nghệ chủ đạo, tất cả đều phụ thuộc vào ngôn ngữ lập trình Python. Vì vậy, thành thạo được Python mở ra rất nhiều cơ hội cho sự nghiệp của bạn ở khắp nơi trên thế giới này.

Nếu bạn là một người mới tìm hiểu về Python hay đang rèn luyện để trở thành một chuyên gia, hay có lẽ bạn muốn thử sức mình với những bài toán khó trong Python, bài viết này sẽ phù hợp với bạn đấy. Dù bạn tự đánh giá được kỹ năng Python của mình ở mức nào, thử sức với những dự án Python chắc chắn sẽ giúp bạn nâng cao kỹ năng và xây dựng hành trang để đối mặt với môi trường cạnh tranh khắc nghiệt ngoài kia. Mặc dù các cuốn sách và các bài hướng dẫn về Python khá hữu ích và cung cấp cho bạn những kiến thức khá chi tiết thì bài kiểm tra cuối cùng dành cho bạn vẫn đến từ việc bạn có thể tự code và tạo ra một cái gì đó của riêng mình.

Trước khi đi vào khám phá các ý tưởng cho các dự án Python, chúng ta hãy cùng tìm hiểu xem các dự án Python có thể giúp bạn như thế nào trong quá trình bạn trở thành lập trình viên và bạn nên cân nhắc sử dụng nền tảng nào khi mới bắt đầu bất kỳ dự án Python nào.

 

Các dự án Python có thể giúp bạn như thế nào ?


Thử thách kiến thức và kỹ năng của bạn với các dự án Python có thể giúp bạn:

Nâng cao sự tự tin

Tự mình làm việc sử dụng các công cụ và công nghệ theo cách riêng chắc chắn sẽ nâng cao sự tự tin cho bạn.

Khám phá và thử nghiệm

Xây dựng các dự án sẽ giúp bạn quen dần với các công cụ và công nghệ đang thịnh hành và cần thiết cho các dự án của bạn. Bạn còn có thể học được thêm các kỹ năng về máy chủ, cơ sở dữ liệu, các concept về UI, và hơn thế nữa.

Luyện thành thạo kỹ năng code

Dự án chỉ là một tên gọi khác của rèn luyện và chúng ta đều biết rèn luyện là kim chỉ nam để làm chủ bất cứ kỹ năng nào. Một khi bạn đã thành thạo code Python và các phần phụ thuộc khác mà dự án yêu cầu thì bạn sẽ để ý thấy năng lực của bản thân được nâng lên rõ rệt khi chinh phục các dự án.

Học về Vòng đời phát triển phần mềm

Đây là bước quan trọng để bạn biết mình đã sẵn sàng bước vào môi trường của ngành công nghiệp lập trình và đủ khả năng để làm việc với các dự án thật sự hay chưa. Bạn cần phải học làm thế nào để phát triển dự án theo cách tối ưu và quy củ như mô hình Vòng đời phát triển phần mềm.



> Nếu muốn học lập trình Python chuyên sâu, nhanh hơn, thực tế hơn thì đừng bỏ qua KHÓA HỌC PYTHON FULLSTACK này bạn nhé.

Bạn nên sử dụng nền tảng nào ?

Sau khi đã có động lực và sẵn sàng, bạn phải cân nhắc xem mình nên làm cái gì và trên nền tảng nào. Bạn phải làm những gì mà bạn thấy có hứng thú bất kể nó có đang thịnh hành hay cần trình độ code cao hay không. Sẽ rất khó để duy trì một dự án hay thậm chí là hoàn thành nếu bạn không có hứng với nó.

Chúng ta hay cùng khái quát về 3 nền tảng lớn để bạn có thể khởi đầu dự án:

 

1. Web


Các ứng dụng web chạy trên nền web và có thể chạy trên bất kì thiết bị nào mà không cần phải tải về; yêu cầu duy nhất là bạn phải có khả năng truy cập được vào internet. Ứng dụng web có 2 phần là frontend và backend. Frontend chịu trách nghiệm về UI của website. Backend là phần áp dụng các logic nghiệp vụ, thao tác với và kho lưu trữ dữ liệu.

Lập trình viên Python chủ yếu sẽ tập trung vào backend. Dù vậy, front end cũng rất cần thiết, cho nên một lập trình viên Python cũng phải có kiến thức về HTML, CSS, và Javascript để tạo ra các AI. Với một thư viện library, lập trình viên có thể sử dụng Python cho cả backend và front end của dự án. Django và Flask là các web framework phổ biến để xây dựng các ứng dụng bằng Python.

 

2. UI của desktop


Xây dựng các ứng dụng desktop bằng Python là một ý tưởng dự án hay ho đối với những người mới bắt đầu học và những ai đang học ở trình độ trung cấp. Tin vui đối với các lập trình viên Python là không cần thiết phải học các công nghệ Frontend để có thể phát triển một dự án ứng dụng desktop bằng Python.

Chúng ta có sẵn một vài framework để xây dựng các ứng dụng desktop. PySimple GUI là một framework Python thân thiện với người dùng. PyQt5 là một GUI framework nâng cao có nền tảng python. Một desktop được phát triển hoàn thiện có thể tương thích được với các OS lớn (Linux, Windows, hay macOS).

 

3. Dòng lệnh


Trong các Ứng dụng dòng lệnh, tương tác của người dùng hoàn toàn phụ thuộc vào terminal & shell. Các ứng dụng dòng lệnh hoạt động trong một bảng điều khiển và không có bất cứ một dạng đồ họa hay hay giao diện thị giác nào mà người dùng có thể thấy. Lập trình viên sẽ phải nhập các dòng lệnh cụ thể, trong khi người dùng cung cấp input cho ứng dụng sử dụng các ký tự ASCI, ứng dụng sẽ cung cấp output thông qua ASCII.

Các ứng dụng dòng lệnh khá là hữu ích và mạnh mẽ, tuy nhiên chúng lại không thân thiện với người dùng cho lắm. Docopt, Plac, Cliff, là một số framework dòng lệnh dành cho Python.


> Nếu bạn đã cài đặt thành công phần mềm lập trình Python thì bắt đầu TỰ HỌC PYTHON ngay. Hoặc tham gia KHÓA HỌC PYTHON tại NIIT - ICT Hà Nội để được hướng dẫn với lộ trình bài bản hơn.
 

Các dự án Python ở trình độ cơ bản 


Sau đây là ý tưởng cho các dự án Python ở trình độ cơ bản:
 

1. Mad Libs Generator 


Đây là một khởi đầu tốt với các nhà phát triển phần mềm sơ cấp bởi nó có các concept như string, biến, và nối chuỗi. Mad Libs Generator dạy cách thao tác với dữ liệu do người dùng nhập vào. Mad Libs là một dãy các input mà một người dùng nhập vào. Input từ một người dùng có thể là bất kỳ cái gì từ một danh từ, một đại từ, hay kể cả một động từ. Sau khi tất cả các input đã được nhập vào, ứng dụng sẽ lấy tất cả dữ liệu và sắp xếp nó để xây dựng một câu chuyện mẫu. 

Source Code: 

 
""" Mad Libs Generator
----------------------------------------
"""
//Loop back to this point once code finishes
loop = 1
while (loop < 10):
// All the questions that the program asks the user
    noun = input("Choose a noun: ")
    p_noun = input("Choose a plural noun: ")
    noun2 = input("Choose a noun: ")
    place = input("Name a place: ")
    adjective = input("Choose an adjective (Describing word): ")
    noun3 = input("Choose a noun: ")
// Displays the story based on the users input
    print ("------------------------------------------")
    print ("Be kind to your",noun,"- footed"p_noun)
    print ("For a duck may be somebody's"noun2,",")
    print ("Be kind to your",p_noun,"in",place)
    print ("Where the weather is always",adjective,".")
    print ()
    print ("You may think that is this the",noun3,",")
    print ("Well it is.")
    print ("------------------------------------------")
// Loop back to "loop = 1"
    loop = loop + 1

2. Đoán số


Dự án này là một trò chơi khá thú vị. Hệ thống sẽ tạo 1 con số ngẫu nhiên trong khoảng từ 1 đến 10, 1 đến 100 hay bất cứ một khoảng cụ thể nào mà người chơi phải đoán con số đó dựa trên gợi ý của máy tính. Mỗi lần người chơi đoán sai thì họ sẽ được đưa ra nhiều gợi ý hơn để dễ dàng đoán ra hơn, đổi lại người chơi sẽ bị trừ điểm. Gợi ý bao gồm các phép toán nhân, chia, lớn hơn hoặc nhỏ hơn, hoặc là tổng hợp tất cả các phép toán. 
Chương trình cũng yêu cầu phải có các hàm để kiểm tra xem người dùng có thực sự nhập số vào hay không, để so sánh số được nhập vào với số phải đoản, và tìm sự khác biệt giữa 2 số. 

Code mẫu:

 
""" Number Guessing Game
----------------------------------------
"""
import random
attempts_list = []
def show_score():
    if len(attempts_list) <= 0:
        print("There is currently no high score, it's yours for the taking!")
    else:
        print("The current high score is {} attempts".format(min(attempts_list)))
def start_game():
    random_number = int(random.randint(110))
    print("Hello traveler! Welcome to the game of guesses!")
    player_name = input("What is your name? ")
    wanna_play = input("Hi, {}, would you like to play the guessing game? (Enter Yes/No) ".format(player_name))
    // Where the show_score function USED to be
    attempts = 0
    show_score()
    while wanna_play.lower() == "yes":
        try:
            guess = input("Pick a number between 1 and 10 ")
            if int(guess) < 1 or int(guess) > 10:
                raise ValueError("Please guess a number within the given range")
            if int(guess) == random_number:
                print("Nice! You got it!")
                attempts += 1
                attempts_list.append(attempts)
                print("It took you {} attempts".format(attempts))
                play_again = input("Would you like to play again? (Enter Yes/No) ")
                attempts = 0
                show_score()
                random_number = int(random.randint(110))
                if play_again.lower() == "no":
                    print("That's cool, have a good one!")
                    break
            elif int(guess) > random_number:
                print("It's lower")
                attempts += 1
            elif int(guess) < random_number:
                print("It's higher")
                attempts += 1
        except ValueError as err:
            print("Oh no!, that is not a valid value. Try again...")
            print("({})".format(err))
    else:
        print("That's cool, have a good one!")
if __name__ == '__main__':
    start_game()

3. Oẳn tù tì


Chương trình hay mini-game này được thiết kế khi bạn không có ai để chơi cùng hay đang trong thời gian giãn cách xã hội. Chúng ta hãy cùng khái quát qua các hàm cần có của chương trình này:
  • Một hàm ngẫu nhiên:  tạo ngẫu nhiên các giá trị đá, giấy, hoặc kéo. 
  • Hàm valid:  kiểm tra tính hợp lệ của nước đi.
  • Hàm result:  để thông báo người thắng cuộc.
  • Hàm scorekeeper:  theo dõi điểm số.
Chương trình yêu cầu người dùng phải đi trước. Khi nước đi được tính là hợp lệ thì nó sẽ được đánh giá, input nhập vào có thể là một string hoặc chữ cái. Sau khi đánh giá input string thì người chiến thắng sẽ được quyết định bằng kết quả của hàm và điểm số sẽ được cập nhật bằng hàm scorekeeper. 

Code:

 
""" Rock Paper Scissors
----------------------------------------
"""
import random
import os
import re
os.system('cls' if os.name=='nt' else 'clear')
while (1 < 2):
    print "\n"
    print "Rock, Paper, Scissors - Shoot!"
    userChoice = raw_input("Choose your weapon [R]ock], [P]aper, or [S]cissors: ")
    if not re.match("[SsRrPp]"userChoice):
        print "Please choose a letter:"
        print "[R]ock, [S]cissors or [P]aper."
        continue
    // Echo the user's choice
    print "You chose: " + userChoice
    choices = ['R''P''S']
    opponenetChoice = random.choice(choices)
    print "I chose: " + opponenetChoice
    if opponenetChoice == str.upper(userChoice):
        print "Tie! "
    #if opponenetChoice == str("R") and str.upper(userChoice) == "P"
    elif opponenetChoice == 'R' and userChoice.upper() == 'S':      
        print "Scissors beats rock, I win! "
        continue
    elif opponenetChoice == 'S' and userChoice.upper() == 'P':      
        print "Scissors beats paper! I win! "
        continue
    elif opponenetChoice == 'P' and userChoice.upper() == 'R':      
        print "Paper beat rock, I win! "
        continue
    else:       
        print "You win!"

4.Công cụ chặn Website


Chúng ta đều biết rằng khi lướt web sẽ có rất nhiều quảng cáo pop-up không mong muốn khiến chúng ta mất tập trung. Dự án này có thể giúp chặn một số website cụ thể. Ứng dụng sẽ giúp những người dễ bị xao nhãng khi họ làm việc trên các trang mạng xã hội. 

Code mẫu:

 
""" Website Blocker
----------------------------------------
"""
import time
from datetime import datetime as dt
hosts_path = r"/etc/hosts"   // r is for raw string
hosts_temp = "hosts"
redirect = "127.0.0.1"
web_sites_list = ["www.facebook.com""facebook.com"]    // users can modify the list of the websites they want to block
while True:
   if dt(dt.now().yeardt.now().monthdt.now().day9) < dt.now() < dt(dt.now().yeardt.now().monthdt.now().day,22):
       print("Working hours")
       with open(hosts_path"r+"as file:
           content = file.read()
           for website in web_sites_list:
               if website in content:
                   pass
               else:
                   file.write(redirect+" "+website+"\n")
   else:
       print("Fun time")
       with open(hosts_path"r+"as file:
           content = file.readlines()
           file.seek(0)  // reset the pointer to the top of the text file
           for line in content:
               // here comes the tricky line, basically we overwrite the whole file
               if not any(website in line for website in web_sites_list):
                   file.write(line)
               // do nothing otherwise
           file.truncate() // this line is used to delete the trailing lines (that contain DNS)
    time.sleep(5)

5.Thuật toán tìm kiếm nhị phân 


Chỉ cần cái tên thôi là cũng đủ để khái quát về dự án. Chương trình yêu cầu bạn tạo ra một danh sách các số  đã được sắp xếp trong khoảng từ 0 đến bất kì số nào mà bạn muốn.. 

Khi người dùng nhập vào một số ngẫu nhiên thì chương trình bắt đầu chạy tìm kiếm bằng cách chia dãy số ra làm 2 nửa. Chương trình sẽ tìm kiếm số được yêu cầu trong nửa đầu, nếu tìm thấy thì nửa sau sẽ bị loại và ngược lại. Lượt tìm kiếm sẽ kết thúc cho đến khi số đó được tìm thất hoặc khi kích cỡ của subarray size bằng 0. Dự án này giúp bạn có thể tìm kiếm một phần tử trong danh sách. 

Code mẫu:

 
""" Binary Search Algorithm
----------------------------------------
"""
// iterative implementation of binary search in Python
def binary_search(a_listitem):
    """Performs iterative binary search to find the position of an integer in a given, sorted, list.
    a_list -- sorted list of integers
    item -- integer you are searching for the position of
    """
    first = 0
    last = len(a_list) - 1
    while first <= last:
        i = (first + last) / 2
        if a_list[i] == item:
            return ' found at position '.format(item=itemi=i)
        elif a_list[i] > item:
            last = i - 1
        elif a_list[i] < item:
            first = i + 1
        else:
            return ' not found in the list'.format(item=item)
// recursive implementation of binary search in Python
def binary_search_recursive(a_listitem):
    """Performs recursive binary search of an integer in a given, sorted, list.
    a_list -- sorted list of integers
    item -- integer you are searching for the position of
    """
    first = 0
    last = len(a_list) - 1
    if len(a_list) == 0:
        return ' was not found in the list'.format(item=item)
    else:
        i = (first + last) // 2
        if item == a_list[i]:
            return ' found'.format(item=item)
        else:
            if a_list[i] < item:
                return binary_search_recursive(a_list[i+1:], item)
            else:
                return binary_search_recursive(a_list[:i], item)

Các dự án Python trình độ trung cấp

1. Máy tính 

Xây dựng dự án này giúp bạn học cách thiết kế một UI mang tính đồ họa và giúp bạn làm quen với thư viện như Tkinter. Thư viện này cho phép bạn tạo các nút đển thực hiện các phép toán khác nhau và hiển thị kết quả trên màn hình. 

Code mẫu:

 
""" Calculator
----------------------------------------
"""
def addition ():
    print("Addition")
    n = float(input("Enter the number: "))
    t = 0 //Total number enter
    ans = 0
    while n != 0:
        ans = ans + n
        t+=1
        n = float(input("Enter another number (0 to calculate): "))
    return [ans,t]
def subtraction ():
    print("Subtraction");
    n = float(input("Enter the number: "))
    t = 0 //Total number enter
    sum = 0
    while n != 0:
        ans = ans - n
        t+=1
        n = float(input("Enter another number (0 to calculate): "))
    return [ans,t]
def multiplication ():
    print("Multiplication")
    n = float(input("Enter the number: "))
    t = 0 //Total number enter
    ans = 1
    while n != 0:
        ans = ans * n
        t+=1
        n = float(input("Enter another number (0 to calculate): "))
    return [ans,t]
def average():
    an = []
    an = addition()
    t = an[1]
    a = an[0]
    ans = a / t
    return [ans,t]
// main...
while True:
    list = []
    print(" My first python program!")
    print(" Simple Calculator in python by Malik Umer Farooq")
    print(" Enter 'a' for addition")
    print(" Enter 's' for substraction")
    print(" Enter 'm' for multiplication")
    print(" Enter 'v' for average")
    print(" Enter 'q' for quit")
    c = input(" ")
    if c != 'q':
        if c == 'a':
            list = addition()
            print("Ans = "list[0], " total inputs ",list[1])
        elif c == 's':
            list = subtraction()
            print("Ans = "list[0], " total inputs ",list[1])
        elif c == 'm':
            list = multiplication()
            print("Ans = "list[0], " total inputs ",list[1])
        elif c == 'v':
            list = average()
            print("Ans = "list[0], " total inputs ",list[1])
        else:
            print ("Sorry, invilid character")
    else:
        break

2. Đồng hồ báo thức 

Đây là một ứng dụng Giao diện dòng lệnh (Command Line Interface - CLI) bằng Python dành cho các lập trình viên ở trình độ trung cấp. Mọi người trên khắp thế giới sử dụng tính năng báo thức trên các thiết bị của họ nhưng dự án này có thể được tùy chỉnh khác đi 1 chút. Chúng ta có thể thêm một vài link YouTube cụ thể vòa một file text file và dự án sẽ được lập trình để khi người dùng đặt báo thức thì code sẽ chọn một link ngẫu nhiên từ file và chạy link YouTube đó.

Code  mẫu:

 
""" Alarm Clock
----------------------------------------
"""
import datetime
import os
import time
import random
import webbrowser
// If video URL file does not exist, create one
if not os.path.isfile("youtube_alarm_videos.txt"):
    print('Creating "youtube_alarm_videos.txt"...')
    with open("youtube_alarm_videos.txt""w"as alarm_file:
        alarm_file.write("https://www.youtube.com/watch?v=anM6uIZvx74")
def check_alarm_input(alarm_time):
    """Checks to see if the user has entered in a valid alarm time"""
    if len(alarm_time) == 1: // [Hour] Format
        if alarm_time[0] < 24 and alarm_time[0] >= 0:
            return True
    if len(alarm_time) == 2: // [Hour:Minute] Format
        if alarm_time[0] < 24 and alarm_time[0] >= 0 and \
           alarm_time[1] < 60 and alarm_time[1] >= 0:
            return True
    elif len(alarm_time) == 3: // [Hour:Minute:Second] Format
        if alarm_time[0] < 24 and alarm_time[0] >= 0 and \
           alarm_time[1] < 60 and alarm_time[1] >= 0 and \
           alarm_time[2] < 60 and alarm_time[2] >= 0:
            return True
    return False
// Get user input for the alarm time
print("Set a time for the alarm (Ex. 06:30 or 18:30:00)")
while True:
    alarm_input = input(">> ")
    try:
        alarm_time = [int(n) for n in alarm_input.split(":")]
        if check_alarm_input(alarm_time):
            break
        else:
            raise ValueError
    except ValueError:
        print("ERROR: Enter time in HH:MM or HH:MM:SS format")
// Convert the alarm time from [H:M] or [H:M:S] to seconds
seconds_hms = [3600601] // Number of seconds in an Hour, Minute, and Second
alarm_seconds = sum([a*b for a,b in zip(seconds_hms[:len(alarm_time)], alarm_time)])
// Get the current time of day in seconds
now = datetime.datetime.now()
current_time_seconds = sum([a*b for a,b in zip(seconds_hms, [now.hour, now.minute, now.second])])
// Calculate the number of seconds until alarm goes off
time_diff_seconds = alarm_seconds - current_time_seconds
// If time difference is negative, set alarm for next day
if time_diff_seconds < 0:
    time_diff_seconds += 86400 // number of seconds in a day
// Display the amount of time until the alarm goes off
print("Alarm set to go off in %s" % datetime.timedelta(seconds=time_diff_seconds))
// Sleep until the alarm goes off
time.sleep(time_diff_seconds)
// Time for the alarm to go off
print("Wake Up!")
// Load list of possible video URLs
with open("youtube_alarm_videos.txt""r"as alarm_file:
    videos = alarm_file.readlines()
// Open a random video from the list
webbrowser.open(random.choice(videos))

3. Cờ Ca-rô 

Đây là một trò chơi khá phổ biến và cũng rất thú vị để code. Hẳn là ai cũng biết rõ luật chơi rồi nhưng chúng ta vẫn sẽ khái quát qua nhé. 
Đây là một trò chơi bao gồm 2 người chơi với 1 lưới 3x3 gồm 9 ô vuông. Mỗi người chơi chọn nước đi của mình với O hoặc X và đánh dấu ô mình chọn ở mỗi lượt đi. Người chơi sẽ thắng khi dấu của họ tạo thành đường chéo, ngang, hoặc thẳng. Thách thức cho người chơi còn lại đó là chặn nước đi của đối phương và tạo chuỗi của riêng mình. 

Bạn có thể xây dựng dự án này bằng Pygame, Một thư viện Python đã có sẵn các giao diện và âm thanh. 

Code mẫu: 
""" Tic Tac Toe
----------------------------------------
"""
import random
import sys
board=[i for i in range(0,9)]
playercomputer = '',''
// Corners, Center and Others, respectively
moves=((1,7,3,9),(5,),(2,4,6,8))
// Winner combinations
winners=((0,1,2),(3,4,5),(6,7,8),(0,3,6),(1,4,7),(2,5,8),(0,4,8),(2,4,6))
// Table
tab=range(1,10)
def print_board():
    x=1
    for i in board:
        end = ' | '
        if x%3 == 0:
            end = \n'
            if i != 1end+='---------\n';
        char=' '
        if i in ('X','O'): char=i;
        x+=1
        print(char,end=end)
def select_char():
    chars=('X','O')
    if random.randint(0,1) == 0:
        return chars[::-1]
    return chars
def can_move(brdplayermove):
    if move in tab and brd[move-1] == move-1:
        return True
    return False
def can_win(brdplayermove):
    places=[]
    x=0
    for i in brd:
        if i == playerplaces.append(x);
        x+=1
    win=True
    for tup in winners:
        win=True
        for ix in tup:
            if brd[ix] != player:
                win=False
                break
        if win == True:
            break
    return win
def make_move(brdplayermoveundo=False):
    if can_move(brdplayermove):
        brd[move-1] = player
        win=can_win(brdplayermove)
        if undo:
            brd[move-1] = move-1
        return (Truewin)
    return (FalseFalse)
// AI goes here
def computer_move():
    move=-1
    // If I can win, others do not matter.
    for i in range(1,10):
        if make_move(boardcomputeriTrue)[1]:
            move=i
            break
    if move == -1:
       // If player can win, block him.
        for i in range(1,10):
            if make_move(boardplayeriTrue)[1]:
                move=i
                break
    if move == -1:
        // Otherwise, try to take one of desired places.
        for tup in moves:
            for mv in tup:
                if move == -1 and can_move(boardcomputermv):
                    move=mv
                    break
    return make_move(boardcomputermove)
def space_exist():
    return board.count('X') + board.count('O') != 9
player, computer = select_char()
print('Player is [%s] and computer is [%s]' % (player, computer))
result='%%% Deuce ! %%%'
while space_exist():
    print_board()
    print('#Make your move ! [1-9] : 'end='')
    move = int(input())
    moved, won = make_move(board, player, move)
    if not moved:
        print(' >> Invalid number ! Try again !')
        continue
    //
    if won:
        result='*** Congratulations ! You won ! ***'
        break
    elif computer_move()[1]:
        result='=== You lose ! =='
        break;
print_board()
print(result)

4. Directory Tree Generator

Dự án này hữu ích cho việc trực quan hóa mối quan hệ giữa các file và thư mục để có thể sắp xếp chúng một cách dễ dàng và dễ hiểu. Có thể sử dụng thư viện Python OS để liệt kê các file  và thư mục bên trong một thư mục cụ thể. Các framework phù hợp với dự án này là Docopt và Argparse. 

Code mẫu:

""" Directory Tree Generator
----------------------------------------
"""
import argparse
import os
from walkdir import filtered_walk
parser = argparse.ArgumentParser(description='Print the directory-tree code for the LaTeX dirtree package.')
parser.add_argument(dest='path'type=strhelp="Root directory of the tree")
parser.add_argument('-d''--maxDepth'dest='maxDepth'type=inthelp="Max depth for tree expansion")
parser.add_argument('-H''--includeHidden'dest='includeHidden'action='store_true'help='Include hidden files')
parser.add_argument('-S''--includeSystem'dest='includeSystem'action='store_true'help='Include system files')
system_file_names = [".DS_Store"]
// Delete trailing / in rootDir which can lead to errors
def delete_trailing_slash(path_name):
    while path_name.endswith('/'):
        path_name = path_name[:-1]
    return path_name
// Count how many levels deep is the directory with respect to dirRoot
def get_relative_depth(dir_pathlevel_offset):
    return dir_path.count(os.path.sep) - level_offset
// Escape illegal symbols for LaTeX
def escape_illegal(name):
    illegal_char_array = ['\\''&''%''$''#''_''{''}''~''^']
    for char in illegal_char_array:
        name = name.replace(char"\\" + char)
    return name
rootDir = delete_trailing_slash(parser.parse_args().path)
includeHidden = parser.parse_args().includeHidden
includeSystem = parser.parse_args().includeSystem
maxDepth = parser.parse_args().maxDepth
// if the directory exists
if os.path.isdir(rootDirand os.path.exists(rootDir):
    indentChar = " "
    // Depth of the root (i.e. number of "/")
    levelOffset = rootDir.count(os.path.sep) - 1
    // Create filter
    excluded_filter = []
    if not includeHidden:
        excluded_filter.append(".*")
    if not includeSystem:
        excluded_filter += system_file_names
    print ("\dirtree{%")
    for dirNamesubdirListfileList in sorted(filtered_walk(rootDirdepth=maxDepthexcluded_dirs=excluded_filter,
                                                       excluded_files=excluded_filter)):
        level = get_relative_depth(dirNamelevelOffset)
        baseName = os.path.basename(dirName)
        if level == 1:  // for the first level only print the whole path
            print(indentChar + "." + str(level) + " {" + escape_illegal(dirName) + "} .")
        else:
            print(indentChar * level + "." + str(level) + " {" + escape_illegal((os.path.basename(dirName))) + "} .")
        level += 1
        for fileName in sorted(fileList):
            print(indentChar * level + "." + str(level) + " {" + escape_illegal(fileName) + "} .")
    print ("}")
else:
    print ("Error: root directory not found")

5. Công cụ chuyển đổi tiền tệ

Đây là một dự án khá dễ hiểu với giao diện đơn giản. Cái tên nói lên tất cả, dự án này sử dụng để chuyển đổi tiền tệ từ đơn vị này sang một đơn vị khác. Ví dụ như, Chuyển đổi đồng rupee Ấn Độ sang USD hay euro. Tkinter, giao diện tiêu chuẩn của Python được sử dụng để thiết kế và phát triển ứng dụng này.. 

Code mẫu:

""" Currency Converter
----------------------------------------
"""
import urllib.request
import json
def currency_converter(currency_fromcurrency_tocurrency_input):
    yql_base_url = "https://query.yahooapis.com/v1/public/yql"
    yql_query = 'select%20*%20from%20yahoo.finance.xchange%20where%20pair' \
                '%20in%20("'+currency_from+currency_to+'")'
    yql_query_url = yql_base_url + "?q=" + yql_query + "&format=json&env=store%3A%2F%2Fdatatables.org%2Falltableswithkeys"
    try:
        yql_response = urllib.request.urlopen(yql_query_url)
        try:
            json_string = str(yql_response.read())
            json_string = json_string[2:
            json_string = json_string[:-1]
            print(json_string)
            yql_json = json.loads(json_string)
            last_rate = yql_json['query']['results']['rate']['Rate']
            currency_output = currency_input * float(last_rate)
            return currency_output
        except (ValueErrorKeyErrorTypeError):
            print(yql_query_url)
            return "JSON format error"
    except IOError as e:
        print(str(e))
currency_input = 1
// currency codes : http://en.wikipedia.org/wiki/ISO_4217
currency_from = "USD"
currency_to = "TRY"
rate = currency_converter(currency_from, currency_to, currency_input)
print(rate)
 
Bạn cũng có thể tham khảo link sau
 

Các dự án Python trình độ nâng cao

1. Trình tổng hợp nội dung 

Lướt qua các website và bài viết khác nhau để tìm kiếm các nội dung hay và chuẩn xác là một công việc khá tốn thời gian. Dự án này sẽ giúp bạn tiết kiệm thời gian tìm kiếm. Trình tổng hợp nội dung sẽ tìm kiếm thông tin liên quan trên các website phổ biến, sau đó biên tập lại và cung cấp cho người dùng nội dung chuẩn.

Code mẫu: 

""" Content Aggregator
----------------------------------------
"""
 import urllibosrequestsdatetimesubprocess
// reddit imports
import praw, pprint
// pip install feedparser
import feedparser
// stockexchange
from nsetools import Nse
// Place your CLIENT_ID & CLIENT_SECRET below
reddit = praw.Reddit(client_id='XXXXXXX',
                     client_secret='XXXXXXXXXXX',
                     grant_type_access='client_credentials',
                     user_agent='script/1.0')
// class Reddit:
//    def TopNews(self):
//          Add your favorite NEWS subreddits in the argument as many as you'd like.
//         for submission in reddit.subreddit('News+WorldNews+UpliftingNews+').top(limit=10):
//             top_news = reddit.domain(submission).top('month')
//             print(top_news)
"""
Each class contains functions which further calls
APIs from the neccesary packages and the rest is
self explanatory I suppose
"""
class News:
    def Indian_News(self):
        newsfeed = feedparser.parse(
            "http://feeds.feedburner.com/ndtvnews-india-news"
        )
        print("Today's News: ")
        for i in range(020):
            entry = newsfeed.entries[i]
            print(entry.title)
            print(entry.summary)
            print("------News Link--------")
            print(entry.link)
            print("###########################################")
        print('-------------------------------------------------------------------------------------------------------')
class Medium:
    // https://github.com/thepracticaldev/dev.to/issues/28#issuecomment-325544385
    def medium_programming(self):
        feed = feedparser.parse(
            "https://medium.com/feed/tag/programming"
        )
        print("Programming Today: ")
        for i in range(10):
            entry = feed.entries[i]
            print(entry.title)
            print("URL: " + entry.link)
            print("###########################################")
        print('-------------------------------------------------------------------------------------------------------')
    def medium_python(self):
        feed_python = feedparser.parse(
            "https://medium.com/feed/tag/python"
        )
        print("Python Today: ")
        for i in range(10):
            entry = feed_python.entries[i]
            print(entry.title)
            print("URL: " + entry.link)
            print("###########################################")
        print('-------------------------------------------------------------------------------------------------------')
    def medium_developer(self):
        feed_developer = feedparser.parse(
            "https://medium.com/feed/tag/developer"
        )
        print("Developer News Today: ")
        for i in range(5):
            entry = feed_developer.entries[i]
            print(entry.title)
            print("URL: " + entry.link)
            print("###########################################")
        print('-------------------------------------------------------------------------------------------------------')
class StockExchange:
    def nse_stock(self):
        nse = Nse()
        print("TOP GAINERS OF YESTERDAY")
        pprint.pprint(nse.get_top_gainers())
        print("###########################################")
        print("TOP LOSERS OF YESTERDAY")
        pprint.pprint(nse.get_top_losers())
        print("###########################################")
        print('-------------------------------------------------------------------------------------------------------')
// objects inititalization
// reddit_object = Reddit()
News_object = News()
Medium_object = Medium()
StockExchange_object = StockExchange()
if __name__ == "__main__":
    // Functions call of each class
    // reddit_object.TopNews()
    News_object.Indian_News()
    Medium_object.medium_python()
    Medium_object.medium_programming()
    Medium_object.medium_developer()
    StockExchange_object.nse_stock()
 

2. Công cụ kiểm tra đạo văn 

Khi việc sáng tạo nội dung và viết blog là 2 lĩnh vực khá màu mỡ trên  thị trường, rất nhiều người muốn tham gia nhưng một số lại không có đủ ngân sách để kiểm tra đạo văn cho bài viết của họ bởi phần lớn các công vụ đều phải trả phí. Chúng ta có thể xây dựng công cụ kiểm tra đạo văn bằng Python sử dụng thư viện xử lý ngôn ngữ tự nhiên cùng với các search API để tìm kiếm trên một vài trang đầu tiên của Google và kiểm tra đạo văn nếu có. 

Sample Code:

""" Plagiarism Checker
----------------------------------------
"""
import click
from .matcher import Text, ExtendedMatch, Matcher
import os
import glob
import csv
import logging
import itertools
logger = logging.getLogger()
logger.setLevel(logging.INFO)
def getFiles(path):
    """ 
    Determines whether a path is a file or directory. 
    If it's a directory, it gets a list of all the text files 
    in that directory, recursively. If not, it gets the file. 
    """
    if os.path.isfile(path): 
        return [path]
    elif os.path.isdir(path): 
        // Get list of all files in dir, recursively.
        return glob.glob(path + "/**/*.txt"recursive=True)
    else
        raise click.ClickException("The path %s doesn't appear to be a file or directory" % path
def checkLog(logfiletextpair):
    """ 
    Checks the log file to make sure we haven't already done a particular analysis. 
    Returns True if the pair is in the log already. 
    """
    pairs = []
    logging.debug('Looking in the log for textpair:' % textpair)
    if not os.path.isfile(logfile): 
        logging.debug('No log file found.')
        return None
    with open(logfilenewline=''as f:
        reader = csv.reader(f)
        for row in reader:
            pairs.append([row[0], row[1]])
    // logging.debug('Pairs already in log: %s' % pairs)
    return textpair in pairs
def createLog(logfilecolumnLabels):
    """ 
    Creates a log file and sets up headers so that it can be easily read 
    as a CSV later. 
    """
    header = ','.join(columnLabels) + '\n'
    with open(logfile'w'as f
        f.write(header
        f.close
@click.command()
@click.argument('text1')
@click.argument('text2')
@click.option('-t''--threshold'type=intdefault=3, \
        help='The shortest length of match to include in the list of initial matches.')
@click.option('-c''--cutoff'type=intdefault=5, \
        help='The shortest length of match to include in the final list of extended matches.')
@click.option('-n''--ngrams'type=intdefault=3, \
        help='The ngram n-value to match against.')
@click.option('-l''--logfile'default='log.txt'help='The name of the log file to write to.'
@click.option('--stops'is_flag=Truehelp='Include stopwords in matching.'default=False)
@click.option('--verbose'is_flag=Truehelp='Enable verbose mode, giving more information.')
def cli(text1, text2, threshold, cutoff, ngrams, logfile, verbose, stops):
    """ This program finds similar text in two text files. """
    //Determine whether the given path is a file or directory.
    texts1 = getFiles(text1)
    texts2 = getFiles(text2) 
    if verbose: 
        logging.basicConfig(level=logging.DEBUG)
    if stops: 
        logging.debug('Including stopwords in tokenizing.'
    logging.debug('Comparing this/these text(s): %s' % str(texts1))
    logging.debug('with this/these text(s): %s' % str(texts2))
    pairs = list(itertools.product(texts1, texts2))
    numPairs = len(pairs) 
    logging.debug('Comparing %s pairs.' % numPairs)
    // logging.debug('List of pairs to compare: %s' % pairs)
    logging.debug('Loading files into memory.')
    texts = {}
    prevTextObjs = {}
    for filename in texts1+texts2: 
        with open(filename, errors="ignore"as f: 
            text = f.read() 
        if filename not in texts: 
            texts[filename] = text
    logging.debug('Loading complete.')
    for index, pair in enumerate(pairs): 
        timeStart = os.times().elapsed
        logging.debug('Now comparing pair %s of %s.' % (index+1, numPairs))
        logging.debug('Comparing %s with %s.' % (pair[0], pair[1]))
        // Make sure we haven't already done this pair.
        inLog = checkLog(logfile, [pair[0], pair[1]])
        if inLog is None
            // This means that there isn't a log file. Let'set one up.
            // Set up columns and their labels.
            columnLabels = ['Text A''Text B''Threshold''Cutoff''N-Grams''Num Matches''Text A Length''Text B Length''Locations in A''Locations in B']
            logging.debug('No log file found. Setting one up.')
            createLog(logfile, columnLabels)
        if inLog: 
            logging.debug('This pair is already in the log. Skipping.')
            continue
        logging.debug('Processing texts.')
        filenameA, filenameB = pair[0], pair[1]
        textA, textB = texts[filenameA], texts[filenameB]
        // Put this in a dictionary so we don't have to process a file twice.
        for filename in [filenameA, filenameB]: 
            if filename not in prevTextObjs: 
                logging.debug('Processing text: %s' % filename)
                prevTextObjs[filename] = Text(texts[filename], filename)
        // Just more convenient naming.
        textObjA = prevTextObjs[filenameA]
        textObjB = prevTextObjs[filenameB]
        // Reset the table of previous text objects, so we don't overload memory.
        // This means we'll only remember the previous two texts.
        prevTextObjs =
        // Do the matching.
        myMatch = Matcher(textObjA, textObjB, threshold=threshold, cutoff=cutoff, ngramSize=ngrams, removeStopwords=stops)
        myMatch.match()
        timeEnd = os.times().elapsed
        timeElapsed = timeEnd-timeStart
        logging.debug('Matching completed in %s seconds.' % timeElapsed)
        // Write to the log, but only if a match is found.
        if myMatch.numMatches > 0
            logItems = [pair[0], pair[1], threshold, cutoff, ngrams, myMatch.numMatches, myMatch.textA.length, myMatch.textB.length, str(myMatch.locationsA), str(myMatch.locationsB)]
            logging.debug('Logging items: %s' % str(logItems))
            line = ','.join(['"%s"' % item for item in logItems]) + '\n'
            f = open(logfile, 'a')
            f.write(line)
            f.close()
if __name__ == '__main__':
    cli()
 

3. Công cụ cào web 

Dự án công cụ cào web là một script  tự động được thiết kế để lướt internet và lưu dữ liệu của các trang cụ thể. Công cụ cào web đặc biệt hữu ích để tìm các thông tim mới nhất sử dụng các concept đa luồng trong chương trình.  Một con bot cào web sử dụng request module của Python hoặc Scrapy, một framework mã nguồn mở của Python được thiết kế chuyên cho công việc cào web và trích xuất dữ liệu sử dụng các API. Bạn có thể tham khảo source code dưới đây.

Source Code:

 
""" Web Crawler
----------------------------------------
"""
import re
import sys
import time
import math
import urllib2
import urlparse
import optparse
import hashli
from cgi import escape
from traceback import format_exc
from Queue import Queue, Empty as QueueEmpty
from bs4 import BeautifulSoup
class Link (object):
    def __init__(selfsrcdstlink_type):
        self.src = src
        self.dst = dst
        self.link_type = link_type
    def __hash__(self):
        return hash((self.srcself.dstself.link_type))
    def __eq__(selfother):
        return (self.src == other.src and
                self.dst == other.dst and
                self.link_type == other.link_type)
    def __str__(self):
        return self.src + " -> " + self.dst
class Crawler(object):
    def __init__(selfrootdepth_limitconfine=Noneexclude=[], locked=Truefilter_seen=True):
        self.root = root
        self.host = urlparse.urlparse(root)[1]
        ## Data for filters:
        self.depth_limit = depth_limit # Max depth (number of hops from root)
        self.locked = locked           # Limit search to a single host?
        self.confine_prefix=confine    # Limit search to this prefix
        self.exclude_prefixes=exclude# URL prefixes NOT to visit
        self.urls_seen = set()          # Used to avoid putting duplicates in queue
        self.urls_remembered = set()    # For reporting to user
        self.visited_linksset()       # Used to avoid re-processing a page
        self.links_remembered = set()   # For reporting to user
        self.num_links = 0              # Links found (and not excluded by filters)
        self.num_followed = 0           # Links followed.  
        # Pre-visit filters:  Only visit a URL if it passes these tests
        self.pre_visit_filters=[self._prefix_ok,
                                self._exclude_ok,
                                self._not_visited,
                                self._same_host]
        // Out-url filters: When examining a visited page, only process
        // links where the target matches these filters.       
        if filter_seen:
            self.out_url_filters=[self._prefix_ok,
                                     self._same_host]
        else:
            self.out_url_filters=[]
    def _pre_visit_url_condense(selfurl):
        """ Reduce (condense) URLs into some canonical form before
        visiting.  All occurrences of equivalent URLs are treated as
        identical.
        All this does is strip the \"fragment\" component from URLs,
        so that http://foo.com/blah.html\#baz becomes
        http://foo.com/blah.html """
        basefrag = urlparse.urldefrag(url)
        return base
    // URL Filtering functions.  These all use information from the
    // state of the Crawler to evaluate whether a given URL should be
    // used in some context.  Return value of True indicates that the
    // URL should be used.
    def _prefix_ok(selfurl):
        """Pass if the URL has the correct prefix, or none is specified"""
        return (self.confine_prefix is None  or
                url.startswith(self.confine_prefix))
    def _exclude_ok(selfurl):
        """Pass if the URL does not match any exclude patterns"""
        prefixes_ok = [ not url.startswith(pfor p in self.exclude_prefixes]
        return all(prefixes_ok)
    def _not_visited(selfurl):
        """Pass if the URL has not already been visited"""
        return (url not in self.visited_links)
    def _same_host(selfurl):
        """Pass if the URL is on the same host as the root URL"""
        try:
            host = urlparse.urlparse(url)[1]
            return re.match(".*%s" % self.hosthost
        except Exception, e:
            print >> sys.stderr"ERROR: Can't process url '%s' (%s)" % (url, e)
            return False
    def crawl(self):
        """ Main function in the crawling process.  Core algorithm is:
        q <- starting page
        while q not empty:
           url <- q.get()
           if url is new and suitable:
              page <- fetch(url)   
              q.put(urls found in page)
           else:
              nothing
        new and suitable means that we don't re-visit URLs we've seen
        already fetched, and user-supplied criteria like maximum
        search depth are checked. """
        q = Queue()
        q.put((self.root0))
        while not q.empty():
            this_urldepth = q.get()
            #Non-URL-specific filter: Discard anything over depth limit
            if depth > self.depth_limit:
                continue
            //Apply URL-based filters.
            do_not_follow = [f for f in self.pre_visit_filters if not f(this_url)]
            #Special-case depth 0 (starting URL)
            if depth == 0 and [] != do_not_follow:
                print >> sys.stderr"Whoops! Starting URL %s rejected by the following filters:"do_not_follow
           //If no filters failed (that isall passed), process URL
            if [] == do_not_follow:
                try:
                    self.visited_links.add(this_url)
                    self.num_followed += 1
                    page = Fetcher(this_url)
                    page.fetch()
                    for link_url in [self._pre_visit_url_condense(lfor l in page.out_links()]:
                        if link_url not in self.urls_seen:
                            q.put((link_urldepth+1))
                            self.urls_seen.add(link_url)
                        do_not_remember = [f for f in self.out_url_filters if not f(link_url)]
                        if [] == do_not_remember:
                                self.num_links += 1
                                self.urls_remembered.add(link_url)
                                link = Link(this_urllink_url"href")
                                if link not in self.links_remembered:
                                    self.links_remembered.add(link)
                except Exception, e:
                    print >>sys.stderr"ERROR: Can't process url '%s' (%s)" % (this_url, e)
                    #print format_exc()
class OpaqueDataException (Exception):
    def __init__(selfmessagemimetypeurl):
        Exception.__init__(selfmessage)
        self.mimetype=mimetype
        self.url=url
class Fetcher(object):
    """The name Fetcher is a slight misnomer: This class retrieves and interprets web pages."""
    def __init__(selfurl):
        self.url = url
        self.out_urls = []
    def __getitem__(selfx):
        return self.out_urls[x]
    def out_links(self):
        return self.out_urls
    //def _addHeaders(selfrequest):
    //    request.add_header("User-Agent", AGENT)
    def _open(self):
        url = self.url
        try:
            request = urllib2.Request(url)
            handle = urllib2.build_opener()
        except IOError:
            return None
        return (requesthandle)
    def fetch(self):
        requesthandle = self._open()
        #self._addHeaders(request)
        if handle:
            try:
                data=handle.open(request)
                mime_type=data.info().gettype()
                url=data.geturl();
                if mime_type != "text/html":
                    raise OpaqueDataException("Not interested in files of type %s" % mime_type,
                                              mime_typeurl)
                content = unicode(data.read(), "utf-8",
                        errors="replace")
                soup = BeautifulSoup(content)
                tags = soup('a')
            except urllib2.HTTPError, error:
                if error.code == 404:
                    print >> sys.stderr"ERROR: %s -> %s" % (error, error.url)
                else:
                    print >> sys.stderr"ERROR: %s" % error
                tags = []
            except urllib2.URLError, error:
                print >> sys.stderr"ERROR: %s" % error
                tags = []
            except OpaqueDataException, error:
                print >>sys.stderr"Skipping %s, has type %s" % (error.url, error.mimetype)
                tags = []
            for tag in tags:
                href = tag.get("href")
                if href is not None:
                    url = urlparse.urljoin(self.url, escape(href))
                    if url not in self:
                        self.out_urls.append(url)
def getLinks(url):
    page = Fetcher(url)
    page.fetch()
    """for i, url in enumerate(page):
        print "%d. %s" % (i, url) """
    j = 1
    for iurl in enumerate(page):
        if url.find("http")>=0:
            print "%d%s" % (jurl)
            j = j + 1
def parse_options():
    """parse_options() -> opts, args
    Parse any command-line options given returning both
    the parsed options and arguments.
    """
    parser = optparse.OptionParser()
    parser.add_option("-q""--quiet",
            action="store_true"default=Falsedest="quiet",
            help="Enable quiet mode")
    parser.add_option("-l""--links",
            action="store_true"default=Falsedest="links",
            help="Get links for specified url only")    
    parser.add_option("-d""--depth",
            action="store"type="int"default=30dest="depth_limit",
            help="Maximum depth to traverse")
    parser.add_option("-c""--confine",
            action="store"type="string"dest="confine",
            help="Confine crawl to specified prefix")
    parser.add_option("-x""--exclude"action="append"type="string",
                      dest="exclude"default=[], help="Exclude URLs by prefix")
    parser.add_option("-L""--show-links"action="store_true"default=False,
                      dest="out_links"help="Output links found")
    parser.add_option("-u""--show-urls"action="store_true"default=False,
                      dest="out_urls"help="Output URLs found")
    parser.add_option("-D""--dot"action="store_true"default=False,
                      dest="out_dot"help="Output Graphviz dot file")
    optsargs = parser.parse_args()
    if len(args) < 1:
        parser.print_help(sys.stderr)
        raise SystemExit1
    if opts.out_links and opts.out_urls:
        parser.print_help(sys.stderr)
        parser.error("options -L and -u are mutually exclusive")
    return optsargs
class DotWriter:
    """ Formats a collection of Link objects as a Graphviz (Dot)
    graph.  Mostly, this means creating a node for each URL with a
    name which Graphviz will accept, and declaring links between those
    nodes."""
    def __init__ (self):
        self.node_alias = {}
    def _safe_alias(selfurlsilent=False):
        """Translate URLs into unique strings guaranteed to be safe as
        node names in the Graphviz language.  Currently, that's based
        on the md5 digest, in hexadecimal."""
        if url in self.node_alias:
            return self.node_alias[url]
        else:
            m = hashlib.md5()
            m.update(url)
            name = "N"+m.hexdigest()
            self.node_alias[url]=name
            if not silent:
                print "\t%s [label=\"%s\"];" % (nameurl)                
            return name
    def asDot(selflinks):
        """ Render a collection of Link objects as a Dot graph"""
        print "digraph Crawl {"
        print "\t edge [K=0.2, len=0.1];"
        for l in links:            
            print "\t" + self._safe_alias(l.src) + " -> " + self._safe_alias(l.dst) + ";"
        print  "}"
def main():   
    optsargs = parse_options()
    url = args[0]
    if opts.links:
        getLinks(url)
        raise SystemExit0
    depth_limit = opts.depth_limit
    confine_prefix=opts.confine
    exclude=opts.exclude
    sTime = time.time()
    print >> sys.stderr,  "Crawling %s (Max Depth: %d)" % (urldepth_limit)
    crawler = Crawler(urldepth_limitconfine_prefixexclude)
    crawler.crawl()
    if opts.out_urls:
        print "\n".join(crawler.urls_seen)
    if opts.out_links:
        print "\n".join([str(lfor l in crawler.links_remembered])
    if opts.out_dot:
        d = DotWriter()
        d.asDot(crawler.links_remembered)
    eTime = time.time()
    tTime = eTime - sTime
    print >> sys.stderr"Found:    %d" % crawler.num_links
    print >> sys.stderr"Followed: %d" % crawler.num_followed
    print >> sys.stderr"Stats:    (%d/s after %0.2fs)" % (
            int(math.ceil(float(crawler.num_links) / tTime)), tTime)
if __name__ == "__main__":
    main()

4. Trình phát nhạc 

Tự tạo ra trình phát nhạc của riêng mình ? Nghe có vẻ hay đấy. Tạo và xây dựng một trình phát không chỉ phát nhạc mà còn là một ứng dụng có thể tìm kiếm các files và khám phá các thư mục của bạn để tìm âm nhạc. Xây dựng cả một giao diện tương tác để những người khác có thể cùng sử dụng. 
Bạn có thể cân nhắc thêm các tính năng như xem danh sách bài hát, điều chỉnh âm lượng, hiển thị tên bài hát/nghệ sĩ/ album/phim, quản lý cơ sở dữ liệu, xây dựng thuật toán, và xử lý dữ liệu để phát triển một ứng dụng tương tác với đầy đủ chức năng.  

Sample Code: 

""" Music Player
----------------------------------------
"""
import os
import threading
import time
import tkinter.messagebox
from tkinter import *
from tkinter import filedialog
from tkinter import ttk
from ttkthemes import themed_tk as tk
from mutagen.mp3 import MP3
from pygame import mixer
root = tk.ThemedTk()
root.get_themes()                 // Returns a list of all themes that can be set
root.set_theme("radiance")        // Sets an available theme
// Fonts - Arial (corresponds to Helvetica), Courier New (Courier), Comic Sans MS, Fixedsys,
// MS Sans Serif, MS Serif, Symbol, System, Times New Roman (Times), and Verdana
//
// Styles - normal, bold, roman, italic, underline, and overstrike.
statusbar = ttk.Label(roottext="Welcome to Melody"relief=SUNKENanchor=Wfont='Times 10 italic')
statusbar.pack(side=BOTTOMfill=X)
// Create the menubar
menubar = Menu(root)
root.config(menu=menubar)
// Create the submenu
subMenu = Menu(menubartearoff=0)
playlist = []
// playlist - contains the full path + filename
// playlistbox - contains just the filename
// Fullpath + filename is required to play the music inside play_music load function
def browse_file():
    global filename_path
    filename_path = filedialog.askopenfilename()
    add_to_playlist(filename_path)
    mixer.music.queue(filename_path)
def add_to_playlist(filename):
    filename = os.path.basename(filename)
    index = 0
    playlistbox.insert(indexfilename)
    playlist.insert(indexfilename_path)
    index += 1
menubar.add_cascade(label="File"menu=subMenu)
subMenu.add_command(label="Open"command=browse_file)
subMenu.add_command(label="Exit"command=root.destroy)
def about_us():
    tkinter.messagebox.showinfo('About Melody''This is a music player build using Python Tkinter by @attreyabhatt')
subMenu = Menu(menubartearoff=0)
menubar.add_cascade(label="Help"menu=subMenu)
subMenu.add_command(label="About Us"command=about_us)
mixer.init()  // initializing the mixer
root.title("Melody")
root.iconbitmap(r'images/melody.ico')
// Root Window - StatusBar, LeftFrame, RightFrame
// LeftFrame - The listbox (playlist)
// RightFrame - TopFrame,MiddleFrame and the BottomFrame
leftframe = Frame(root)
leftframe.pack(side=LEFTpadx=30pady=30)
playlistbox = Listbox(leftframe)
playlistbox.pack()
addBtn = ttk.Button(leftframetext="+ Add"command=browse_file)
addBtn.pack(side=LEFT)
def del_song():
    selected_song = playlistbox.curselection()
    selected_song = int(selected_song[0])
    playlistbox.delete(selected_song)
    playlist.pop(selected_song)
delBtn = ttk.Button(leftframetext="- Del"command=del_song)
delBtn.pack(side=LEFT)
rightframe = Frame(root)
rightframe.pack(pady=30)
topframe = Frame(rightframe)
topframe.pack()
lengthlabel = ttk.Label(topframetext='Total Length : --:--')
lengthlabel.pack(pady=5)
currenttimelabel = ttk.Label(topframetext='Current Time : --:--'relief=GROOVE)
currenttimelabel.pack()
def show_details(play_song):
    file_data = os.path.splitext(play_song)
    if file_data[1] == '.mp3':
        audio = MP3(play_song)
        total_length = audio.info.length
    else:
        a = mixer.Sound(play_song)
        total_length = a.get_length()
    // div - total_length/60, mod - total_length % 60
    minssecs = divmod(total_length60)
    mins = round(mins)
    secs = round(secs)
    timeformat = '{:02d}:{:02d}'.format(minssecs)
    lengthlabel['text'] = "Total Length" + ' - ' + timeformat
    t1 = threading.Thread(target=start_countargs=(total_length,))
    t1.start()
def start_count(t):
    global paused
    // mixer.music.get_busy(): - Returns FALSE when we press the stop button (music stop playing)
    // Continue - Ignores all of the statements below it. We check if music is paused or not.
    current_time = 0
    while current_time <= t and mixer.music.get_busy():
        if paused:
            continue
        else:
            minssecs = divmod(current_time60)
            mins = round(mins)
            secs = round(secs)
            timeformat = '{:02d}:{:02d}'.format(minssecs)
            currenttimelabel['text'] = "Current Time" + ' - ' + timeformat
            time.sleep(1)
            current_time += 1
def play_music():
    global paused
    if paused:
        mixer.music.unpause()
        statusbar['text'] = "Music Resumed"
        paused = FALSE
    else:
        try:
            stop_music()
            time.sleep(1)
            selected_song = playlistbox.curselection()
            selected_song = int(selected_song[0])
            play_it = playlist[selected_song]
            mixer.music.load(play_it)
            mixer.music.play()
            statusbar['text'] = "Playing music" + ' - ' + os.path.basename(play_it)
            show_details(play_it)
        except:
            tkinter.messagebox.showerror('File not found''Melody could not find the file. Please check again.')
def stop_music():
    mixer.music.stop()
    statusbar['text'] = "Music Stopped"
paused = FALSE
def pause_music():
    global paused
    paused = TRUE
    mixer.music.pause()
    statusbar['text'] = "Music Paused"
def rewind_music():
    play_music()
    statusbar['text'] = "Music Rewinded"
def set_vol(val):
    volume = float(val) / 100
    mixer.music.set_volume(volume)
    // set_volume of mixer takes value only from 0 to 1. Example - 00.1,0.55,0.54.0.99,1
muted = FALSE
def mute_music():
    global muted
    if muted:  // Unmute the music
        mixer.music.set_volume(0.7)
        volumeBtn.configure(image=volumePhoto)
        scale.set(70)
        muted = FALSE
    else:  // mute the music
        mixer.music.set_volume(0)
        volumeBtn.configure(image=mutePhoto)
        scale.set(0)
        muted = TRUE
middleframe = Frame(rightframe)
middleframe.pack(pady=30padx=30)
playPhoto = PhotoImage(file='images/play.png')
playBtn = ttk.Button(middleframe, image=playPhotocommand=play_music)
playBtn.grid(row=0column=0padx=10)
stopPhoto = PhotoImage(file='images/stop.png')
stopBtn = ttk.Button(middleframe, image=stopPhotocommand=stop_music)
stopBtn.grid(row=0column=1padx=10)
pausePhoto = PhotoImage(file='images/pause.png')
pauseBtn = ttk.Button(middleframe, image=pausePhotocommand=pause_music)
pauseBtn.grid(row=0column=2padx=10)
// Bottom Frame for volume, rewind, mute etc.
bottomframe = Frame(rightframe)
bottomframe.pack()
rewindPhoto = PhotoImage(file='images/rewind.png')
rewindBtn = ttk.Button(bottomframeimage=rewindPhotocommand=rewind_music)
rewindBtn.grid(row=0column=0)
mutePhoto = PhotoImage(file='images/mute.png')
volumePhoto = PhotoImage(file='images/volume.png')
volumeBtn = ttk.Button(bottomframeimage=volumePhotocommand=mute_music)
volumeBtn.grid(row=0column=1)
scale = ttk.Scale(bottomframefrom_=0to=100orient=HORIZONTALcommand=set_vol)
scale.set(70)  # implement the default value of scale when music player starts
mixer.music.set_volume(0.7)
scale.grid(row=0column=2pady=15padx=30)
def on_closing():
    stop_music()
    root.destroy()
root.protocol("WM_DELETE_WINDOW"on_closing)
root.mainloop()

5.Trình tải ảnh từ Instagram 

Ứng dụng này khá hữu dụng khi bạn muốn xóa tài khoản Instagram nhưng muốn giữ lại bộ sưu tập ảnh của mình. Ứng dụng này sử dụng thông tin đăng nhập của người dùng để truy cập vào tài khoản, tìm ID của bạn bè và tải hình ảnh của họ về.

Code mẫu:

""" Instagram Photo Downloader
----------------------------------------
"""
from sys import argv
import urllib
from bs4 import BeautifulSoup
import datetime
def ShowHelp():
    print 'Insta Image Downloader'
    print ''
    print 'Usage:'
    print 'insta.py [OPTION] [URL]'
    print ''
    print 'Options:'
    print '-u [Instagram URL]\tDownload single photo from Instagram URL'
    print '-f [File path]\t\tDownload Instagram photo(s) using file list'
    print '-h, --help\t\tShow this help message'
    print ''
    print 'Example:'
    print 'python insta.py -u https://instagram.com/p/xxxxx'
    print 'python insta.py -f /home/username/filelist.txt'
    print ''
    exit()
def DownloadSingleFile(fileURL):
    print 'Downloading image...'
    f = urllib.urlopen(fileURL)
    htmlSource = f.read()
    soup = BeautifulSoup(htmlSource,'html.parser')
    metaTag = soup.find_all('meta', {'property':'og:image'})
    imgURL = metaTag[0]['content']
    fileName = datetime.datetime.now().strftime("%Y-%m-%d_%H:%M:%S") + '.jpg'
    urllib.urlretrieve(imgURLfileName)
    print 'Done. Image saved to disk as ' + fileName
if __name__ == '__main__':
    if len(argv) == 1:
        ShowHelp()
    if argv[1in ('-h''--help'):
        ShowHelp()
    elif argv[1] == '-u':
        instagramURL = argv[2]
        DownloadSingleFile(instagramURL)
    elif argv[1] == '-f':
        filePath = argv[2]
        f = open(filePath)
        line = f.readline()
        while line:
            instagramURL = line.rstrip('\n')
            DownloadSingleFile(instagramURL)
            line = f.readline()
        f.close()
 
Kết luận 

Và trên đây là những dự án thú vị mà bạn có thể làm với Python. Hãy dùng tất cả những kiến thức và lý thuyết mà bạn học được để áp dụng vào thực tế và nâng cao kỹ năng code Python của bạn.


CHÚ Ý: Nếu muốn học lập trình Python chuyên sâu, nhanh hơn, thực tế hơn cùng LEADER Doanh nghiệp thì hãy đăng ký KHÓA HỌC PYTHON FULLSTACK ngay nhé

 ---
HỌC VIỆN ĐÀO TẠO CNTT NIIT - ICT HÀ NỘI
Học Lập trình chất lượng cao (Since 2002). Học thực tế + Tuyển dụng ngay!
Đc: Tầng 3, 25T2, N05, Nguyễn Thị Thập, Cầu Giấy, Hà Nội
SĐT: 02435574074 - 0383.180086
Email: hello@niithanoi.edu.vn
Fanpage: https://facebook.com/NIIT.ICT/
 
#niit #icthanoi #niithanoi #niiticthanoi #hoclaptrinh #khoahoclaptrinh #hoclaptrinhjava #hoclaptrinhphp #python #java #php
 

Bình luận Facebook
Mục lục
Đăng ký tư vấn
Nhân viên gọi điện tư vấn miễn phí sau khi đăng ký
Được cập nhật các ưu đãi sớm nhất
Hotline: 0383180086
Tên không được để trống
Số điện thoại không được để trống
Email không được để trống
Hãy đăng ký để nhận những thông tin mới nhất về học bổng mới nhất tại NIIT - ICT Hà Nội
top
Đóng lại Đăng ký học tại NIIT - ICT Hà Nội
6260+ học viên đã theo học tại NIIT - ICT Hà Nội và có việc làm tốt trong ngành lập trình. Nắm lấy cơ hội ngay hôm nay!
Chọn khóa học
  • KHÓA HỌC LẬP TRÌNH FRONT END VỚI REACT.JS
  • KHÓA HỌC LẬP TRÌNH PHP WEB
  • Khóa học PHP Full stack [2023] cho người mới bắt đầu
  • Khóa học BIG DATA với Hadoop và Spark
  • Khóa học Lập trình Android tại Hà Nội
  • [Tuyển sinh 2023] Lập trình viên Quốc tế DigiNxt
  • Khóa học Tiền lương & Phúc lợi (C&B Excel) tại Hà Nội
  • LẬP TRÌNH GAME
    • Khóa học Lập trình Game Unity
  • LẬP TRÌNH WEB FRONT END
    • KHÓA HỌC PYTHON HƯỚNG ĐỐI TƯỢNG
    • KHÓA HỌC ANGULAR & TYPESCRIPT (FRONT END)
  • LẬP TRÌNH WEB BACK END
    • LẬP TRÌNH JAVA WEB VỚI FRAME WORK
    • Lập trình Web với Django
    • Lập trình PHP với Laravel Framework
  • CHƯƠNG TRÌNH ĐÀO TẠO ỨNG DỤNG CÔNG NGHỆ
    • Khóa học Tiền lương & Phúc lợi (C&B Excel) tại TP HCM
  • LẬP TRÌNH WEB FULL STACK
    • Khóa học Java Full stack (IJFD)
  • LẬP TRÌNH MOBILE
    • FRONT-END VỚI REACTJS VÀ REACT NATIVE
    • Lập trình Android Nâng cao
  • ĐÀO TẠO CHO DOANH NGHIỆP
    • KHÓA HỌC BUSINESS ANALYSIC TỪ CƠ BẢN ĐẾN NÂNG CAO 2023
    • Khóa học Magento: Làm chủ CMS TMĐT lớn nhất
    • Khóa học IOT: Xây dựng Sản phẩm IOT với Raspberry Pi
    • Khóa học Automation Testing Chuyên nghiệp
  • KHÓA HỌC DỰ ÁN
    • Học sử dụng bộ Office: Word, Excel, Power Point, Mail chuyên nghiệp
  • KHÓA HỌC KHÁC
    • VBA Excel Toàn Tập (Cơ Bản - Nâng Cao)
    • VBA Excel Nâng cao
    • Khóa học JMeter: Performance Testing
    • Khóa học Tester đạt chuẩn Quốc tế ISTQB Foundation Level
    • Khoá Học Tester đạt chuẩn quốc tế ISTQB Advanced Level
Bạn chưa chọn khóa học cần đăng ký
Tên không được để trống
Số điện thoại không được để trống
Email không được để trống
Đăng ký học thành công!
Cảm ơn bạn đã đăng ký học tại NIIT - ICT HÀ NỘI!