接着上一篇
cprint 模块
Python内置的 print 函数可以输出任何类型的数据,但有时候输出的内容不够简洁、美观,难以直观地了解程序运行状态。cprint 库就是为了解决这个问题而生的,它可以让Python输出更简洁、更美观。
cprint 库是一个基于装饰器实现的工具,它可以让Python输出更简洁、更美观。cprint库实际上是一个只有一个函数的库,这个函数叫做 cprint,它可以接受多个参数,其中第一个参数是要输出的内容,其他参数是用于设置输出样式的。cprint函数会将第一个参数输出到控制台,并根据其他参数设置输出样式。
如下演示中,可以看到使用非常的简单
pyfiglet 模块
pyfiglet 是一个Python库,用于将普通文本转换为具有艺术感的ASCII字符艺术。它允许你将文本转换为各种独特的字体样式,创建令人惊叹的文本艺术。这个库的名字来源于 "figlet",这是一个用于生成ASCII艺术的程序。
使用方法
1导入库: 首先,你需要导入 pyfiglet 库。
import pyfiglet
2选择字体样式:pyfiglet 支持许多不同的字体样式。你可以从 这里 查看一些可用的字体样式示例。选择一个你喜欢的样式,将其名称作为参数传递给 figlet_format() 函数。
样式链接:http://www.figlet.org/examples.html
3生成ASCII艺术: 使用 figlet_format() 函数将普通文本转换为ASCII艺术。
text = "Hello, ASCII Art!"
font = "slant" # 选择一个字体样式
ascii_art = pyfiglet.figlet_format(text, font=font)
4输出ASCII艺术: 使用 print() 函数将生成的ASCII艺术文本输出到终端。
print(ascii_art)
import pyfiglet
text = "Beret-SEC"
font = "slant"
ascii_art = pyfiglet.figlet_format(text, font)
print(ascii_art)
在线生成连接:
http://patorjk.com/software/taag/#p=display&f=Graffiti&t=Type%20Something%20
增加颜色输出
pyfiglet 生成的 ASCII 艺术文本本身并不支持直接设置颜色。然而,你可以在生成的 ASCII 艺术文本的周围使用 ANSI 转义序列来设置颜色,从而实现在终端中的彩色输出。
text = "Color Test"
for color_code in range(256):
colored_ascii_art = f"\033[38;5;{color_code}m{text}\033[0m"
print("颜色编码%d: %s" % (color_code, colored_ascii_art))
text = "Beret-SEC"
font = "slant"
color = "10" # ANSI颜色代码,10代表绿色
ascii_art = pyfiglet.figlet_format(text, font)
ascii_art = f"\033[38;5;{color}m{ascii_art}\033[0m"
print(ascii_art)
在 Windows 的命令提示符 (cmd) 终端下,ANSI 转义序列默认是被禁用的,因此无法直接在 cmd 中实现彩色输出。
要在 Windows 的 cmd 终端中实现彩色输出,你可以考虑使用 colorama 库。colorama 库允许你在 Windows 终端中使用 ANSI 转义序列来实现颜色和样式的输出。以下是一个使用 colorama 实现彩色输出的示例:
首先,你需要安装 colorama 库:
pip install colorama
然后,在 Python 脚本中使用以下代码:
import pyfiglet
from colorama import init, Fore, Back, Style
# 初始化 colorama 库
init()
text = "BERET-SEC"
font = "big"
ascii_art = pyfiglet.figlet_format(text, font=font)
# 使用 colorama 设置文本颜色为红色,背景颜色为黄色
colored_ascii_art = f"{Fore.RED}{Back.BLACK}{ascii_art}{Style.RESET_ALL}"
print(colored_ascii_art)
colorama 模块
colorama 是一个 Python 库,用于在 Windows 终端下使用 ANSI 转义序列来实现彩色文本和样式输出。以下是使用 colorama 库的基本方法:
1安装 colorama 库: 在使用 colorama 之前,你需要先安装它。你可以使用以下命令来安装:
bashCopy code
pip install colorama
导入并初始化 colorama 库: 在你的代码中导入 colorama 并进行初始化,以便启用 ANSI 转义序列的使用:
from colorama import init
init()
3使用 Fore、Back 和 Style 类来设置颜色和样式: colorama 提供了三个类,分别用于设置文本颜色、背景颜色和文本样式。以下是它们的基本用法:
○Fore:用于设置文本颜色
○Back:用于设置背景颜色
○Style:用于设置文本样式
4例如,Fore.RED 表示设置文本颜色为红色,Back.YELLOW 表示设置背景颜色为黄色,Style.RESET_ALL 表示重置样式设置。
pythonCopy code
from colorama import Fore, Back, Style
print(f"{Fore.RED}Red Text{Style.RESET_ALL}")
print(f"{Back.BLUE}Blue Background{Style.RESET_ALL}")
print(f"{Style.BRIGHT}Bright Text{Style.RESET_ALL}")
5重置颜色和样式: 使用 Style.RESET_ALL 可以重置颜色和样式设置,确保后续输出不受之前的设置影响。
pythonCopy code
from colorama import Fore, Back, Style
print(f"{Fore.RED}Red Text{Style.RESET_ALL} Normal Text")
print(f"{Back.BLUE}Blue Background{Style.RESET_ALL} Normal Background")
通过结合 colorama 和 pyfiglet,你可以在 Windows 终端中实现彩色的 pyfiglet ASCII 艺术输出,就像前面的示例代码所展示的一样。
from colorama import Fore
def main():
print(Fore.RED + "这是红色的文本" + Fore.RESET)
print(Fore.GREEN + "这是绿色的文本" + Fore.RESET)
print(Fore.BLUE + "这是蓝色的文本" + Fore.RESET)
print(Fore.YELLOW + "这是黄色的文本" + Fore.RESET)
print(Fore.MAGENTA + "这是洋红色的文本" + Fore.RESET)
print(Fore.CYAN + "这是青色的文本" + Fore.RESET)
if __name__ == "__main__":
main()
threading 模块
参考链接:https://www.cnblogs.com/BaiJilang/p/15654849.html
threading库是python的线程模型,利用threading库我们可以轻松实现多线程任务。
关于线程
线程是操作系统能够进行运算调度的最小单位。它被包含在进程之中,是进程中的实际运作单位。同一个进程内的多个线程可以并发执行,分享进程的资源。
在Python中,我们可以使用threading模块创建和管理线程。以下是一个创建线程的例子:
import threading
def print_numbers():
for i in range(10):
print(i)
def print_letters():
for letter in 'abcdefghij':
print(letter)
thread1 = threading.Thread(target=print_numbers)
thread2 = threading.Thread(target=print_letters)
thread1.start()
thread2.start()
thread1.join()
thread2.join()
在这个例子中,我们创建了两个线程:thread1和thread2。thread1的任务是打印数字0到9,thread2的任务是打印字母'a'到'j'。 我们使用threading.Thread类创建了两个线程对象,并指定了每个线程的目标函数。然后,我们调用了start方法来启动线程。 join方法用于等待线程结束。这是阻塞调用,也就是说,调用join方法的线程(在这个例子中是主线程)会被阻塞,直到被调用join方法的线程(在这个例子中是thread1和thread2)结束。
线程同步
在多线程环境中,多个线程可能需要共享一些资源。例如,多个线程可能需要写入同一个文件或修改同一个内存位置。这可能会引发所谓的竞态条件,其中一个线程的操作可能会影响其他线程的结果。 为了避免竞态条件,我们需要进行线程同步。Python的threading模块提供了多种线程同步的工具,包括锁(Lock)、条件(Condition)、事件(Event)、信号量(Semaphore)等。以下是一个使用锁进行线程同步的例子:
import threading
lock = threading.Lock()
counter = 0
def increase_counter():
global counter
with lock:
counter += 1
print(counter)
threads = []
for _ in range(10):
thread = threading.Thread(target=increase_counter)
threads.append(thread)
thread.start()
for thread in threads:
thread.join()
在这个例子中,我们创建了10个线程,每个线程都会增加共享变量counter的值。为了避免竞态条件,我们使用了一个锁来保护对counter的修改。只有获得了锁的线程才能修改counter,其他试图修改counter的线程将被阻塞,直到锁被释放。 with lock:语句用于自动获取和释放锁。当进入with语句时,锁被自动获取;当退出with语句时,锁被自动释放。这确保了即使在发生异常的情况下,锁也能被正确释放。
Pool 模块
multiprocessing.dummy 模块是 multiprocessing 模块的子模块之一,它提供了一个简化版的多线程 API,允许你使用多线程而不是多进程来执行任务。from multiprocessing.dummy import Pool 语句允许你从 multiprocessing.dummy 模块中导入 Pool 类,以便创建一个线程池。
以下是一个示例,展示如何使用 from multiprocessing.dummy import Pool 来创建一个线程池并执行多线程任务:
pythonCopy code
from multiprocessing.dummy import Pool
import time
def task(n):
# 模拟一个耗时任务
time.sleep(1)
return n * n
def main():
# 创建一个包含2个线程的线程池
pool = Pool(2)
# 创建一个任务列表
tasks = [1, 2, 3, 4, 5]
# 使用线程池并行执行任务
results = pool.map(task, tasks)
# 关闭线程池
pool.close()
pool.join()
print("任务结果:", results)
if __name__ == "__main__":
main()
在这个示例中,我们首先从 multiprocessing.dummy 模块中导入 Pool 类。然后,我们创建了一个包含2个线程的线程池。
接着,我们定义了一个 task 函数,它模拟一个耗时任务,接受一个参数并返回该参数的平方。
然后,我们创建了一个任务列表 tasks,包含了要执行的任务。
使用线程池的 map 方法,我们并行执行了任务,并等待所有任务完成。
最后,我们关闭了线程池,并打印了任务的结果。
请注意,multiprocessing.dummy 的用法与 multiprocessing 模块的用法非常相似,但在多线程环境中运行,适用于不需要多进程的多任务处理。
ThreadPoolExecutor 模块
ThreadPoolExecutor 是 Python 标准库 concurrent.futures 模块中的一个类,用于创建线程池以进行并发执行任务。它提供了一种方便的方式来管理线程,使您能够轻松地并行执行多个任务,而无需手动创建和管理线程。
以下是 ThreadPoolExecutor 的主要特点和用法:
1创建线程池:
from concurrent.futures import ThreadPoolExecutor
# 创建一个具有默认线程数的线程池
with ThreadPoolExecutor() as executor:
# 在这里执行任务
默认情况下,线程池会使用与系统 CPU 核心数相当的线程。
2执行任务:使用 executor.submit() 或 executor.map() 方法来提交任务给线程池。
○executor.submit(fn, *args, **kwargs):将函数 fn 以及其参数 args 和关键字参数 kwargs 提交给线程池,并返回一个 Future 对象,用于获取任务的结果。
○executor.map(fn, *iterables, timeout=None, chunksize=1):将函数 fn 应用于可迭代对象 iterables 中的每个元素,返回一个生成器,可用于获取结果。
3获取任务结果:使用 Future 对象的 result() 方法来获取任务的结果。可以等待任务完成,然后获取结果。
future = executor.submit(some_function, arg1, arg2)
result = future.result() # 阻塞直到任务完成并返回结果
4异常处理:使用 Future 对象的 exception() 方法来处理任务执行期间可能引发的异常。
future = executor.submit(some_function, arg1, arg2)
try:
result = future.result()
except Exception as e:
print(f"An exception occurred: {e}")
5关闭线程池:使用 with 语句可以确保在线程池使用完成后自动关闭,释放资源。
with ThreadPoolExecutor() as executor:
# 执行任务
# 在此处线程池已关闭
ThreadPoolExecutor 是在并发编程中非常有用的工具,它简化了多线程应用程序的开发和管理,可以提高程序的性能和效率。但要小心,过多的线程可能会导致资源竞争和性能下降,因此需要根据具体情况合理选择线程数量。