1 python项目练习一:即时标记
这是《python基础教程》后面的实践,照着写写,一方面是来熟悉python的代码方式,另一方面是练习使用python中的基本的以及非基本的语法,做到熟能生巧。
这个项目一开始比较简单,不过重构之后就有些复杂了,但是更灵活了。
按照书上所说,重构之后的程序,分为四个模块:处理程序模块,过滤器模块,规则(其实应该是处理规则),语法分析器。
先来说处理程序模块,这个模块的作用有两个,一个是提供那些固定的html标记的输出(每一个标记都有start和end),另一个是对这个标记输出的开始和结束提供了一个友好的访问接口。来看下程序handlers.py:
这个程序堪称是整个“项目”的基石所在:提供了标签的输出,以及字符串的替换。理解起来也比较简单。
再来看第二个模块“过滤器”,这个模块更为简单,其实就是一个正则表达式的字符串。相关代码如下:
这就是三个过滤器了,分别是:强调牌过滤器(用×号标出的),url牌过滤器,email牌过滤器。熟悉正则表达式的同学理解起来是没有压力的。
再来看第三个模块“规则”,这个模块,抛开那祖父类不说,其他类应该有的两个方法是condition和action,前者是用来判断读进来的字符串是不是符合自家规则,后者是用来执行操作的,所谓的执行操作就是指调用“处理程序模块”,输出前标签、内容、后标签。来看下这个模块的代码,其实这个里面几个类的关系,画到类图里面看会比较清晰。rules.py:
这个模块里面的处理思路是,遍历客户端(也就是程序执行的入口)给插进去的所有的规则和过滤器,来处理读进来的文本。
有一个细节的地方也要说一下,其实是和前面写的呼应一下,就是在遍历规则的时候通过调用condition这个东西来判断是否符合当前规则。
我觉得这个程序很像是命令行模式,有空可以复习一下该模式,以保持记忆网节点的牢固性。
最后说一下我以为的这个程序的用途:
1、用来做代码高亮分析,如果改写成js版的话,可以做一个在线代码编辑器。
2、可以用来学习,供我写博文用。
还有其他的思路,可以留下您的真知灼见。
补充一个类图,很简陋,但是应该能说明之间的关系。另外我还是建议如果看代码捋不清关系最好自己画图,自己画图才能熟悉整个结构。
2 猜字游戏
在这个游戏中,你必须一个字母一个字母的猜出秘密单词。如果你猜错了一个字母,你将丢掉一条命。正如游戏名那样,你需要仔细选择字母,因为你的生命数量非常有限
import randomdef guess_word_game(): words = ["apple", "banana", "cherry", "grape", "orange"] target_word = random.choice(words) guessed_letters = [] attempts = 6 print("欢迎来到猜字游戏!") print("提示:这个单词是一种水果。") print("_ " * len(target_word)) while attempts > 0: guess = input("请输入一个字母: ").lower() if len(guess)!= 1 or not guess.isalpha(): print("请输入一个有效的字母。") continue if guess in guessed_letters: print("你已经猜过这个字母了。") continue guessed_letters.append(guess) if guess in target_word: print("正确!") display_word = "" for letter in target_word: if letter in guessed_letters: display_word += letter + " " else: display_word += "_ " print(display_word) if "_" not in display_word: print(f"恭喜你猜对了!答案是{target_word}。") break else: attempts -= 1 print(f"错误!你还有{attempts}次机会。") if attempts == 0: print(f"游戏结束。答案是{target_word}。")
你可以这样调用这个游戏:
if __name__ == "__main__": guess_word_game()
这个猜字游戏从给定的水果单词列表中随机选择一个单词,让玩家通过猜测单个字母来猜出这个单词。玩家有 6 次错误猜测的机会。每次猜测后,游戏会显示已猜对的字母在单词中的位置,以及还剩下多少次机会。如果玩家猜对了所有字母,游戏会显示祝贺消息并结束;如果玩家用完了所有机会,游戏会显示答案并结束。3 骰子模拟器
可以通过选择1到6之间的随机整数,来完成骰子模拟。
import random设置最大值和最小值min_val =1max val = 6# 是否继续roll again = "yes"# 循环while roll _again == "yes" or roll _again == "y":print(“开始掷骰子”)print("般子数值是:)# 第一轮print(random.randint(min val, max val))# 第二轮print(random,randint(min_val, max_val))# 是否继续roll again = input("是否继续掷骰子?(是的话,输入yes或者y)")
④ 二维码
二维码是用于将数据编码和解码为机器可读的方法。包含一个白色背景上的黑色方块网格,可以被任何成像设备(如手机)读取
import pyqrcode设置二维码信息s= "https://www.baidu.com"# 生成二维码url = pyqrcode.create(s)# 保存二维码url,svg("baidu.svg",scale=8)
⑤ 语言检测
当你需要处理包含不同语言数据,且数据非常大的时候,语言检测就派上用场了。使用Python中的langdetect包,可以在几行代码内检测超过55种不同的语言。
from langdetect import detectext = input(“输入信息:")
⑥ 加密和解密
密码术意味着更改消息的文本,以便不知道你秘密的人永远不会理解你的消息。下面就来创建一个GUI应用程序,使用Python进行加密和解密在这里,我们需要编写使用无限循环的代码,代码将不断询问用户是否要加密或解
def encrypt(text, shift): encrypted_text = "" for char in text: if char.isalpha(): if char.islower(): encrypted_char = chr((ord(char) - ord('a') + shift) % 26 + ord('a')) else: encrypted_char = chr((ord(char) - ord('A') + shift) % 26 + ord('A')) encrypted_text += encrypted_char else: encrypted_text += char return encrypted_textdef decrypt(text, shift): return encrypt(text, 26 - shift)示例用法original_text = "Hello, World!"shift_value = 3encrypted = encrypt(original_text, shift_value)print(f"加密后的文本:{encrypted}")decrypted = decrypt(encrypted, shift_value)print(f"解密后的文本:{decrypted}")
在这个例子中,encrypt函数接受一个文本和一个偏移量作为参数,对文本中的字母进行加密。如果字符是小写字母,将其转换为对应的加密后的小写字母;如果是大写字母,进行类似的处理。非字母字符保持不变。decrypt函数通过反向偏移量来解密文本,实际上就是再次调用加密函数,但使用反向的偏移量。⑦ URL缩短
短网址由于易于记忆和输入,因此在数字营销领域非常受欢迎。这里给大家介绍一下,如何使用Python创建URL缩短器。
from flask import Flask, render_template, requestimport pyshortenersapp = Flask(__name__)@app.route('/', methods=['GET', 'POST'])def index(): short_url = None if request.method == 'POST': long_url = request.form['long_url'] s = pyshorteners.Shortener() short_url = s.tinyurl.short(long_url) return render_template('index.html', short_url=short_url)if __name__ == '__main__': app.run(debug=True)
同时,你需要一个名为index.html的模板文件,内容如下:
<!DOCTYPE html><htmllang="en"><head> <metacharset="UTF-8"> <title>URL Shortener</title></head><body> <h1>URL Shortener</h1> <formmethod="post"> <labelfor="long_url">输入长 URL:</label> <inputtype="text"id="long_url"name="long_url"> <inputtype="submit"value="缩短"> </form> {% if short_url %} <p>缩短后的 URL:{{ short_url }}</p> {% endif %}</body></html>
这个程序创建了一个简单的 Web 应用,用户在表单中输入一个长 URL,点击 “缩短” 按钮后,程序使用pyshorteners库将长 URL 缩短,并在页面上显示缩短后的 URL。
⑧ 音乐播放器
音乐播放器,可让你快速轻松地管理和收听所有音乐文件。应该不少小伙伴都使用过,网易云音乐、QQ音乐、酷狗音乐等,这里小F将使用Pygame和Tkinter,来创建一个音乐播放器
import tkinter as tkimport pygameclass MusicPlayer: def __init__(self): self.root = tk.Tk() self.root.title("音乐播放器") self.song_list = [] self.current_song_index = 0 self.load_button = tk.Button(self.root, text="加载音乐", command=self.load_songs) self.load_button.pack() self.play_button = tk.Button(self.root, text="播放", command=self.play_song) self.play_button.pack() self.pause_button = tk.Button(self.root, text="暂停", command=self.pause_song) self.pause_button.pack() self.next_button = tk.Button(self.root, text="下一首", command=self.next_song) self.next_button.pack() self.prev_button = tk.Button(self.root, text="上一首", command=self.prev_song) self.prev_button.pack() pygame.mixer.init() def load_songs(self): file_paths = tk.filedialog.askopenfilenames(filetypes=[("音频文件", "*.mp3;*.wav")]) self.song_list = list(file_paths) def play_song(self): if self.song_list: pygame.mixer.music.load(self.song_list[self.current_song_index]) pygame.mixer.music.play() def pause_song(self): pygame.mixer.music.pause() def next_song(self): if self.song_list: self.current_song_index = (self.current_song_index + 1) % len(self.song_list) self.play_song() def prev_song(self): if self.song_list: self.current_song_index = (self.current_song_index - 1) % len(self.song_list) self.play_song() def run(self): self.root.mainloop()if __name__ == "__main__": player = MusicPlayer() player.run()
这个音乐播放器可以加载多个音频文件,并提供播放、暂停、上一首和下一首的功能。它使用tkinter创建了用户界面,使用pygame库来播放音乐。请注意,在运行代码之前,请确保已经安装了pygame库。可以使用pip install pygame来安装。选择音乐文件所在的文件夹,点击播放,即可听见音乐。⑨ 生命游戏
生命游戏由英国数学家约翰·H·康威设计的,是一种类似于生物社会的兴衰和交替的游戏。游戏使用无限大小的矩形网格,其中每个网格都是空的或被有机体占据。被占用的细胞是活的,而空的细胞是死的。游戏在特定时期内进行,每一轮都会根据当前配置中生物体的排列创建一个新的世下一代网格的状态,是通过将以下四个基本规则应用于当前配置的每个网格来确定的:如果一个细胞还活着并且有两个或三个活着的邻居,那么该细胞在下一代中仍然活着;一个没有活邻居或只有一个活邻居的活细胞会在下一代死于孤立,有四个或更多活邻居的活细胞会因下一代人口过剩而死亡board = [[1, 0, 0], [1, 0, 0], [1, 0, 0]]邻居数组为给定的单元格找到8个相邻的单元格neighbors = [(1, 0), (1, -1), (0, -1), (-1, -1), (-1, 0), (-1, 1), (0, 1), (1, 1)]rows = len(board)cols = len(board[0])# 创建一个原始板的副本copy_board = [[board[row][col] for col inrange(cols)] for row inrange(rows)]# 逐个单元地迭代for row inrange(rows):for col inrange(cols):# 对于每个单元计算邻居的数量 live_neighbors = 0for neighbor in neighbors: r = (row + neighbor[0]) c = (col + neighbor[1])# 检查相邻细胞的有效性,以及它是否原来是一个活细胞# 评估是针对副本进行的,因为它永远不会更新。if (r < rows and r >= 0) and (c < cols and c >= 0) and (copy_board[r][c] == 1): live_neighbors += 1# 规则1或规则3if copy_board[row][col] == 1and (live_neighbors < 2or live_neighbors > 3): board[row][col] = 0# 规则4if copy_board[row][col] == 0and live_neighbors == 3: board[row][col] = 1print(board)
结果如下:
#输入board = [[1, 0, 0], [1, 0, 0], [1, 0, 0]]输出board = [[0, 0, 0], [1, 1, 0], [0, 0, 0]]
⑩5Turtle模块提供了在二维平面上移动的环境。
Turtle可以实现位置、航向和各种可能的状态和动作。
import turtle as turoo = tu.Turtle()
创建对象wn = tu.Screen() # 屏幕对象wn.bgcolor("black") # 屏幕背景wn.title("分形树")roo.left(90) # 移动roo.speed(20) # 速度defdraw(l): # 以长度'l'作为参数的递归函数if l < 10:returnelse: roo.pensize(2) # 设置画笔大小 roo.pencolor("yellow") # 画笔颜色 roo.forward(l) # 朝向 roo.left(30) # 移动 draw(3 * l / 4) # 绘制 roo.right(60) # 移动 draw(3 * l / 4) # 绘制 roo.left(30) # 移动 roo.pensize(2) roo.backward(l) # 返回初始位置draw(20) # 绘制20次roo.right(90)roo.speed(2000)# recursiondefdraw(l):if (l < 10):returnelse: roo.pensize(2) roo.pencolor("magenta") # magenta roo.forward(l) roo.left(30) draw(3 * l / 4) roo.right(60) draw(3 * l / 4) roo.left(30) roo.pensize(2) roo.backward(l)draw(20)roo.left(270)roo.speed(2000)# recursiondefdraw(l):if (l < 10):returnelse: roo.pensize(2) roo.pencolor("red") # red roo.forward(l) roo.left(30) draw(3 * l / 4) roo.right(60) draw(3 * l / 4) roo.left(30) roo.pensize(2) roo.backward(l)draw(20)roo.right(90)roo.speed(2000)# recursiondefdraw(l):if (l < 10):returnelse: roo.pensize(2) roo.pencolor('#FFF8DC') # white roo.forward(l) roo.left(30) draw(3 * l / 4) roo.right(60) draw(3 * l / 4) roo.left(30) roo.pensize(2) roo.backward(l)draw(20)########################################################defdraw(l):if (l < 10):returnelse: roo.pensize(3) roo.pencolor("lightgreen") # lightgreen roo.forward(l) roo.left(30) draw(4 * l / 5) roo.right(60) draw(4 * l / 5) roo.left(30) roo.pensize(3) roo.backward(l)draw(40)roo.right(90)roo.speed(2000)# recursiondefdraw(l):if (l < 10):returnelse: roo.pensize(3) roo.pencolor("red") # red roo.forward(l) roo.left(30) draw(4 * l / 5) roo.right(60) draw(4 * l / 5) roo.left(30) roo.pensize(3) roo.backward(l)draw(40)roo.left(270)roo.speed(2000)# recursiondefdraw(l):if (l < 10):returnelse: roo.pensize(3) roo.pencolor("yellow") # yellow roo.forward(l) roo.left(30) draw(4 * l / 5) roo.right(60) draw(4 * l / 5) roo.left(30) roo.pensize(3) roo.backward(l)draw(40)roo.right(90)roo.speed(2000)# recursiondefdraw(l):if (l < 10):returnelse: roo.pensize(3) roo.pencolor('#FFF8DC') # white roo.forward(l) roo.left(30) draw(4 * l / 5) roo.right(60) draw(4 * l / 5) roo.left(30) roo.pensize(3) roo.backward(l)draw(40)########################################################defdraw(l):if (l < 10):returnelse: roo.pensize(2) roo.pencolor("cyan") # cyan roo.forward(l) roo.left(30) draw(6 * l / 7) roo.right(60) draw(6 * l / 7) roo.left(30) roo.pensize(2) roo.backward(l)draw(60)roo.right(90)roo.speed(2000)# recursiondefdraw(l):if (l < 10):returnelse: roo.pensize(2) roo.pencolor("yellow") # yellow roo.forward(l) roo.left(30) draw(6 * l / 7) roo.right(60) draw(6 * l / 7) roo.left(30) roo.pensize(2) roo.backward(l)draw(60)roo.left(270)roo.speed(2000)# recursiondefdraw(l):if (l < 10):returnelse: roo.pensize(2) roo.pencolor("magenta") # magenta roo.forward(l) roo.left(30) draw(6 * l / 7) roo.right(60) draw(6 * l / 7) roo.left(30) roo.pensize(2) roo.backward(ldraw(60)roo.right(90)roo.speed(2000)# recursiondefdraw(l):if (l < 10):returnelse: roo.pensize(2) roo.pencolor('#FFF8DC') # white roo.forward(l) roo.left(30) draw(6 * l / 7) roo.right(60) draw(6 * l / 7) roo.left(30) roo.pensize(2) roo.backward(l)draw(60)wn.exitonclick()
绘制时间较长,结果如下,挺好看的。
⑪ 计算器
Kivy是一个免费的开源Python库,可以快速轻松地开发高度交互的跨平台应用程序
import tkinter as tkclass Calculator: def __init__(self): self.root = tk.Tk() self.root.title("简单计算器") self.expression = "" self.display_var = tk.StringVar() self.display = tk.Entry(self.root, textvariable=self.display_var, font=('Helvetica', 20)) self.display.grid(row=0, column=0, columnspan=4) buttons = [ '7', '8', '9', '/', '4', '5', '6', '*', '1', '2', '3', '-', '0', '.', '=', '+', 'C' ] row_val = 1 col_val = 0 for button in buttons:tk.Button(self.root, text=button, padx=20, pady=20, command=lambda b=button: self.button_click(b)).grid(row=row_val, column=col_val) col_val += 1 if col_val > 3: col_val = 0 row_val += 1def button_click(self, button): if button == '=': try: result = str(eval(self.expression)) self.display_var.set(result) self.expression = result except: self.display_var.set("错误") self.expression = "" elif button == 'C': self.display_var.set("") self.expression = "" else: self.expression += button self.display_var.set(self.expression) def run(self): self.root.mainloop()if __name__ == "__main__": calculator = Calculator() calculator.run()
这个计算器可以进行基本的加、减、乘、除运算,并且有清除(C)和等于(=)按钮。
它使用 Tkinter 创建了一个简单的图形用户界面,包含一个显示区域和多个按钮。
当用户点击按钮时,相应的操作会被执行,结果会显示在显示区域中。
运行代码,出现一个计算器,非常好用!
⑫ 猜数游戏
猜数字游戏目的是猜测出程序想出的数字,基本逻辑:程序随机选择1到100之间的一个数字或任何其他数字组合,然后它会要求玩家输入它的建议。然后它会检查这个数字是否与计算机随机生成的数字相同;如果是,则玩家获胜
import random创建随机数n=random.randrange(1,100)# 获取输入guess =int(input("输入任意数值:"))while n!= guess:# 判断是否正确# 小于if guess < n:print("太小了")guess =int(input("再次输入数值:“))# 大于elif guess > n:print("太大了!")guess=int(input("再次输入数值:“))else:break
运行代码,结果展示:
⑬ 图像转换器
我们知道有大量的图像文件格式可用于存储图形数据,最流行的便是JPG和PNG。使用Python中的Tkinter库和PIL库,创建一个将PNG图像转换为JPG的应用程序。
from PIL import Imageimport osdef convert_image(input_path, output_path, output_format): try: img = Image.open(input_path) img.save(output_path, format=output_format) print(f"成功将 {input_path} 转换为 {output_path}") except Exception as e: print(f"转换失败:{e}")示例用法input_image_path = "input.jpg"output_image_path = "output.png"output_format = "PNG"convert_image(input_image_path, output_image_path, output_format)
在这个示例中,convert_image函数接受输入图像路径、输出图像路径和目标格式作为参数。它使用Pillow库打开输入图像,然后将其保存为指定的格式。你可以根据实际情况修改输入和输出路径以及目标格式。请注意,确保已经安装了Pillow库,可以使用pip install Pillow进行安装。运行代码,选择图片,点击转换按钮,即可完成图像格式变换。⑭ 重量转换器
重量换算是指单位值乘以标准换算值,使用Python中的Tkinter库创建一个重量转换器应用程序
def convert_weight(value, from_unit, to_unit): units = { "gram": 1, "kilogram": 1000, "pound": 453.592, "ounce": 28.3495 } if from_unit not in units or to_unit not in units: return "Invalid units" return value * units[from_unit] / units[to_unit]示例用法weight = 100print(f"{weight} grams is {convert_weight(weight, 'gram', 'kilogram')} kilograms.")print(f"{weight} grams is {convert_weight(weight, 'gram', 'pound')} pounds.")print(f"{weight} grams is {convert_weight(weight, 'gram', 'ounce')} ounces.")
这个重量转换器函数接受三个参数:
要转换的数值、原始单位和目标单位。
它使用一个字典来存储不同单位之间的换算比例,然后根据给定的数值和单位进行换算。
你可以根据实际需求进行扩展和改进,比如添加用户输入功能,以便在运行时获取数值和单位。
运行代码,出现界面,输入数值,点击转换。
⑮ 年龄和性别检测
使用Python编程语言带你完成使用机器学习进行年龄和性别检测的任务首先需要编写用于检测人脸的代码,因为如果没有人脸检测,我们将无法进一步完成年龄和性别预测的任务。下一步是预测图像中人的性别。在这里,我将性别网络加载到内存中,并将检测的人脸通过网络传输,用于性别检测任务下一个任务是预测图像中人类的年龄。这里我将加载网络并使用前向传递来获取输出。由于网络架构与性别网络相似,我们可以充分利用所有输出来获得任务的预期以下是一个使用 Python 进行年龄和性别检测的示例代码,这里使用了第三方库face_recognition和opencv-python,请确保在运行代码前安装好这些库。import face_recognitionimport cv2import numpy as npimport datetimedef detect_age_gender(frame): face_locations = face_recognition.face_locations(frame) for top, right, bottom, left in face_locations: face_image = frame[top:bottom, left:right]使用深度学习模型进行性别和年龄预测 # 这里使用示例值,实际应用中需使用专业模型进行预测 gender = np.random.choice(['Male', 'Female']) age = np.random.randint(18, 60) cv2.rectangle(frame, (left, top), (right, bottom), (0, 255, 0), 2) cv2.putText(frame, f'{gender}, {age} years old', (left, top - 10), cv2.FONT_HERSHEY_SIMPLEX, 0.5, (0, 255, 0), 2) return framecap = cv2.VideoCapture(0)while True: ret, frame = cap.read() if ret: result_frame = detect_age_gender(frame) cv2.imshow('Age and Gender Detection', result_frame) if cv2.waitKey(1) & 0xFF == ord('q'): breakcap.release()cv2.destroyAllWindows()
⑯ 人脸检测
构建一个检测人脸的程序是开始机器学习计算机视觉任务的好方法,使用Python的OpenCV库进行人脸检测的任务。
import cv2face cascade =cv2.CascadeClassifier("face detector.xml')img = cv2.imread('imagejpg’)faces =face cascade.detectMultiscale(img, 1.1,10)for (x, y, w, h) in faces:cv2.rectangle(img, (x, y). (x+w, y+h). (255, 0, 0). 2)cv2.imwrite("face detected.png", img)print('Successfully saved')
⑰ 铅笔素描
使用不到20行的Python代码将图像转换为铅笔素描
import cv2image = cv2.imread("dogjpg")cv2.imshow("Dog", image)cv2.waitKey(0)gray_image = cv2.cvtColor(image, cV2.COLOR BGR2GRAY)cv2.imshow("New Dog", gray _image)cv2.waitKey(0)inverted image =255 -gray _imagecv2.imshow("Inverted",inverted image)cv2.waitKey()blurred = cv2.GaussianBlur(inverted image, (21, 21), 0)inverted blurred= 255 -blurredpencil sketch =cv2.divide(gray image, inverted blurred, scale=256.0)cv2.imshow("Sketch",pencil sketch)cv2.waitKey(0)cv2.imshow("original image", image)cv2.imshow("pencil sketch", pencil sketch)
结果如下:
⑱ 文本编辑器
使用Python创建一个文本编辑器 GU,它可以创建、打开、编辑和保存文本文件。所有小部件的排列方式应使按钮小部件位于窗口布局的左侧,而文本框小部件位于
import tkinter as tkfrom tkinter import filedialogclass TextEditor: def __init__(self, root): self.root = root self.root.title("简单文本编辑器") self.text_area = tk.Text(root) self.text_area.pack(fill=tk.BOTH, expand=True) self.menu_bar = tk.Menu(root) self.file_menu = tk.Menu(self.menu_bar, tearoff=0) self.file_menu.add_command(label="打开", command=self.open_file) self.file_menu.add_command(label="保存", command=self.save_file) self.menu_bar.add_cascade(label="文件", menu=self.file_menu) root.config(menu=self.menu_bar) def open_file(self): file_path = filedialog.askopenfilename() if file_path: with open(file_path, 'r') as file: content = file.read() self.text_area.delete(1.0, tk.END) self.text_area.insert(tk.END, content) def save_file(self): file_path = filedialog.asksaveasfilename(defaultextension=".txt") if file_path: content = self.text_area.get(1.0, tk.END) with open(file_path, 'w') as file: file.write(content)if __name__ == "__main__": root = tk.Tk() editor = TextEditor(root) root.mainloop()
这个文本编辑器具有打开和保存文件的功能。它使用 Tkinter 的菜单和文本区域来实现基本的文本编辑操作。
结果如下
总结
最后希望你编程学习上不急不躁,按照计划有条不紊推进,把任何一件事做到极致,都是不容易的,加油,努力!相信自己!
文末福利
最后这里免费分享给大家一份Python全套学习资料,希望能帮到那些不满现状,想提升自己却又没有方向的朋友,也可以和我一起来学习交流呀。