python3高级编程

news/2024/11/7 7:41:20/

文章目录

  • 1. Python网络编程
    • 1.1 服务器端代码(Server)
    • 1.2 客户端代码(Client)
  • 2. 多线程
    • 2.1 线程模块
    • 2.2 使用 threading 模块创建线程
    • 2.3 线程同步
    • 2.4 线程优先级队列( Queue)
  • 3. 日期和时间
  • 4. SMTP发送邮件
    • 4.1 使用Python发送HTML格式的邮件
    • 4.2 Python 发送带附件的邮件
    • 4.3 在 HTML 文本中添加图片
  • 5. pip
  • 6. random
  • 7. Python3 标准库
  • 8. explore more on your own
  • 参考文献

1. Python网络编程

Python网络编程是利用Python语言进行网络通信和网络应用开发的技术。它可以用于各种网络操作,包括创建和管理网络连接、发送和接收数据、处理网络协议、构建和维护网络应用等。

以下是一个使用Python网络编程的示例代码,实现了一个简单的网络服务器和客户端的通信:

1.1 服务器端代码(Server)

import socket# 创建TCP/IP socket
server_socket = socket.socket(socket.AF_INET, socket.SOCK_STREAM)# 绑定IP地址和端口
server_address = ('localhost', 12345)
server_socket.bind(server_address)# 监听连接请求
server_socket.listen(5)while True:# 等待客户端连接print('等待客户端连接...')client_socket, client_address = server_socket.accept()try:print('客户端已连接:', client_address)# 接收客户端发送的数据data = client_socket.recv(1024)print('接收到数据:', data.decode())# 发送响应数据给客户端response = 'Hello, client!'client_socket.sendall(response.encode())finally:# 关闭客户端连接client_socket.close()

1.2 客户端代码(Client)

import socket# 创建TCP/IP socket
client_socket = socket.socket(socket.AF_INET, socket.SOCK_STREAM)# 连接服务器
server_address = ('localhost', 12345)
client_socket.connect(server_address)try:# 发送数据给服务器message = 'Hello, server!'client_socket.sendall(message.encode())# 接收服务器的响应数据data = client_socket.recv(1024)print('接收到服务器的响应:', data.decode())finally:# 关闭连接client_socket.close()

这段代码演示了一个简单的基于Socket的TCP通信,服务器端监听指定的端口,接收客户端的连接请求,接收客户端发送的数据并发送响应数据,最后关闭连接。客户端通过提供服务器的IP地址和端口号,连接到服务器,发送数据给服务器并接收响应数据,最后关闭连接。

这只是Python网络编程的基础示例,真实的网络应用可能需要处理更复杂的逻辑和协议。

2. 多线程

多线程类似于同时执行多个不同程序,多线程运行有如下优点:

  • 使用线程可以把占据长时间的程序中的任务放到后台去处理。
  • 用户界面可以更加吸引人,比如用户点击了一个按钮去触发某些事件的处理,可以弹出一个进度条来显示处理的进度。
  • 程序的运行速度可能加快。
  • 在一些等待的任务实现上如用户输入、文件读写和网络收发数据等,线程就比较有用了。在这种情况下我们可以释放一些珍贵的资源如内存占用等等。

每个独立的线程有一个程序运行的入口顺序执行序列程序的出口。但是线程不能够独立执行,必须依存在应用程序中,由应用程序提供多个线程执行控制

每个线程都有他自己的一组CPU寄存器,称为线程的上下文,该上下文反映了线程上次运行该线程的CPU寄存器的状态。

指令指针堆栈指针寄存器是线程上下文中两个最重要的寄存器,线程总是在进程得到上下文中运行的,这些地址都用于标志拥有线程的进程地址空间中的内存。

  • 线程可以被抢占(中断)。
  • 在其他线程正在运行时,线程可以暂时搁置(也称为睡眠) – 这就是线程的退让。

线程可以分为:

内核线程:由操作系统内核创建和撤销。
用户线程:不需要内核支持而在用户程序中实现的线程。

Python3 线程中常用的两个模块为:

  • _thread
  • threading (推荐使用)

thread 模块已被废弃。用户可以使用 threading 模块代替。所以,在Python3 中不能再使用"thread" 模块。为了兼容性,Python3 将 thread 重命名为 “_thread”。

Python线程

#!/usr/bin/python3import _thread
import time# 为线程定义一个函数
def print_time( threadName, delay):count = 0while count < 5:time.sleep(delay)count += 1print ("%s: %s" % ( threadName, time.ctime(time.time()) ))# 创建两个线程
try:_thread.start_new_thread( print_time, ("Thread-1", 2, ) )_thread.start_new_thread( print_time, ("Thread-2", 4, ) )
except:print ("Error: 无法启动线程")while 1:pass
Thread-1: Wed Jan  5 17:38:08 2022
Thread-2: Wed Jan  5 17:38:10 2022
Thread-1: Wed Jan  5 17:38:10 2022
Thread-1: Wed Jan  5 17:38:12 2022
Thread-2: Wed Jan  5 17:38:14 2022
Thread-1: Wed Jan  5 17:38:14 2022
Thread-1: Wed Jan  5 17:38:16 2022
Thread-2: Wed Jan  5 17:38:18 2022
Thread-2: Wed Jan  5 17:38:22 2022
Thread-2: Wed Jan  5 17:38:26 2022

2.1 线程模块

2.2 使用 threading 模块创建线程

#!/usr/bin/python3import threading
import timeexitFlag = 0class myThread (threading.Thread):def __init__(self, threadID, name, delay):threading.Thread.__init__(self)self.threadID = threadIDself.name = nameself.delay = delaydef run(self):print ("开始线程:" + self.name)print_time(self.name, self.delay, 5)print ("退出线程:" + self.name)def print_time(threadName, delay, counter):while counter:if exitFlag:threadName.exit()time.sleep(delay)print ("%s: %s" % (threadName, time.ctime(time.time())))counter -= 1# 创建新线程
thread1 = myThread(1, "Thread-1", 1)
thread2 = myThread(2, "Thread-2", 2)# 开启新线程
thread1.start()
thread2.start()
thread1.join()
thread2.join()
print ("退出主线程")

2.3 线程同步

#!/usr/bin/python3import threading
import timeclass myThread (threading.Thread):def __init__(self, threadID, name, delay):threading.Thread.__init__(self)self.threadID = threadIDself.name = nameself.delay = delaydef run(self):print ("开启线程: " + self.name)# 获取锁,用于线程同步threadLock.acquire()print_time(self.name, self.delay, 3)# 释放锁,开启下一个线程threadLock.release()def print_time(threadName, delay, counter):while counter:time.sleep(delay)print ("%s: %s" % (threadName, time.ctime(time.time())))counter -= 1threadLock = threading.Lock()
threads = []# 创建新线程
thread1 = myThread(1, "Thread-1", 1)
thread2 = myThread(2, "Thread-2", 2)# 开启新线程
thread1.start()
thread2.start()# 添加线程到线程列表
threads.append(thread1)
threads.append(thread2)# 等待所有线程完成
for t in threads:t.join()
print ("退出主线程")
开启线程: Thread-1
开启线程: Thread-2
Thread-1: Wed Jan  5 17:36:50 2022
Thread-1: Wed Jan  5 17:36:51 2022
Thread-1: Wed Jan  5 17:36:52 2022
Thread-2: Wed Jan  5 17:36:54 2022
Thread-2: Wed Jan  5 17:36:56 2022
Thread-2: Wed Jan  5 17:36:58 2022
退出主线程

2.4 线程优先级队列( Queue)

#!/usr/bin/python3import queue
import threading
import timeexitFlag = 0class myThread (threading.Thread):def __init__(self, threadID, name, q):threading.Thread.__init__(self)self.threadID = threadIDself.name = nameself.q = qdef run(self):print ("开启线程:" + self.name)process_data(self.name, self.q)print ("退出线程:" + self.name)def process_data(threadName, q):while not exitFlag:queueLock.acquire()if not workQueue.empty():data = q.get()queueLock.release()print ("%s processing %s" % (threadName, data))else:queueLock.release()time.sleep(1)threadList = ["Thread-1", "Thread-2", "Thread-3"]
nameList = ["One", "Two", "Three", "Four", "Five"]
queueLock = threading.Lock()
workQueue = queue.Queue(10)
threads = []
threadID = 1# 创建新线程
for tName in threadList:thread = myThread(threadID, tName, workQueue)thread.start()threads.append(thread)threadID += 1# 填充队列
queueLock.acquire()
for word in nameList:workQueue.put(word)
queueLock.release()# 等待队列清空
while not workQueue.empty():pass# 通知线程是时候退出
exitFlag = 1# 等待所有线程完成
for t in threads:t.join()
print ("退出主线程")
开启线程:Thread-1
开启线程:Thread-2
开启线程:Thread-3
Thread-3 processing One
Thread-1 processing Two
Thread-2 processing Three
Thread-3 processing Four
Thread-1 processing Five
退出线程:Thread-3
退出线程:Thread-2
退出线程:Thread-1
退出主线程

3. 日期和时间

#!/usr/bin/python3import time  # 引入time模块ticks = time.time()
print ("当前时间戳为:", ticks)

4. SMTP发送邮件

SMTP(Simple Mail Transfer Protocol)即简单邮件传输协议,它是一组用于由源地址到目的地址传送邮件的规则,由它来控制信件的中转方式。

python的smtplib提供了一种很方便的途径发送电子邮件。它对smtp协议进行了简单的封装。

如果我们本机没有 sendmail 访问,也可以使用其他服务商的 SMTP 访问(QQ、网易、Google等)。

#!/usr/bin/python3import smtplib
from email.mime.text import MIMEText
from email.header import Header# 第三方 SMTP 服务
mail_host="smtp.XXX.com"  #设置服务器
mail_user="XXXX"    #用户名
mail_pass="XXXXXX"   #口令 sender = 'from@runoob.com'
receivers = ['429240967@qq.com']  # 接收邮件,可设置为你的QQ邮箱或者其他邮箱message = MIMEText('Python 邮件发送测试...', 'plain', 'utf-8')
message['From'] = Header("菜鸟教程", 'utf-8')
message['To'] =  Header("测试", 'utf-8')subject = 'Python SMTP 邮件测试'
message['Subject'] = Header(subject, 'utf-8')try:smtpObj = smtplib.SMTP() smtpObj.connect(mail_host, 25)    # 25 为 SMTP 端口号smtpObj.login(mail_user,mail_pass)smtpObj.sendmail(sender, receivers, message.as_string())print ("邮件发送成功")
except smtplib.SMTPException:print ("Error: 无法发送邮件")

4.1 使用Python发送HTML格式的邮件

#!/usr/bin/python3import smtplib
from email.mime.text import MIMEText
from email.header import Headersender = 'from@runoob.com'
receivers = ['429240967@qq.com']  # 接收邮件,可设置为你的QQ邮箱或者其他邮箱mail_msg = """
<p>Python 邮件发送测试...</p>
<p><a href="http://www.runoob.com">这是一个链接</a></p>
"""
message = MIMEText(mail_msg, 'html', 'utf-8')
message['From'] = Header("菜鸟教程", 'utf-8')
message['To'] =  Header("测试", 'utf-8')subject = 'Python SMTP 邮件测试'
message['Subject'] = Header(subject, 'utf-8')try:smtpObj = smtplib.SMTP('localhost')smtpObj.sendmail(sender, receivers, message.as_string())print ("邮件发送成功")
except smtplib.SMTPException:print ("Error: 无法发送邮件")

4.2 Python 发送带附件的邮件

发送带附件的邮件,首先要创建MIMEMultipart()实例,然后构造附件,如果有多个附件,可依次构造,最后利用smtplib.smtp发送。

#!/usr/bin/python3import smtplib
from email.mime.text import MIMEText
from email.mime.multipart import MIMEMultipart
from email.header import Headersender = 'from@runoob.com'
receivers = ['429240967@qq.com']  # 接收邮件,可设置为你的QQ邮箱或者其他邮箱#创建一个带附件的实例
message = MIMEMultipart()
message['From'] = Header("菜鸟教程", 'utf-8')
message['To'] =  Header("测试", 'utf-8')
subject = 'Python SMTP 邮件测试'
message['Subject'] = Header(subject, 'utf-8')#邮件正文内容
message.attach(MIMEText('这是菜鸟教程Python 邮件发送测试……', 'plain', 'utf-8'))# 构造附件1,传送当前目录下的 test.txt 文件
att1 = MIMEText(open('test.txt', 'rb').read(), 'base64', 'utf-8')
att1["Content-Type"] = 'application/octet-stream'
# 这里的filename可以任意写,写什么名字,邮件中显示什么名字
att1["Content-Disposition"] = 'attachment; filename="test.txt"'
message.attach(att1)# 构造附件2,传送当前目录下的 runoob.txt 文件
att2 = MIMEText(open('runoob.txt', 'rb').read(), 'base64', 'utf-8')
att2["Content-Type"] = 'application/octet-stream'
att2["Content-Disposition"] = 'attachment; filename="runoob.txt"'
message.attach(att2)try:smtpObj = smtplib.SMTP('localhost')smtpObj.sendmail(sender, receivers, message.as_string())print ("邮件发送成功")
except smtplib.SMTPException:print ("Error: 无法发送邮件")

4.3 在 HTML 文本中添加图片

略(见参考文献)

5. pip

pip 是 Python 包管理工具,该工具提供了对 Python 包的查找、下载、安装、卸载的功能。

软件包也可以在 https://pypi.org/ 中找到。

目前最新的 Python 版本已经预装了 pip。
在这里插入图片描述

6. random

Python random 模块主要用于生成随机数。

random 模块实现了各种分布的伪随机数生成器。

# 导入 random 包
import random# 生成随机数
print(random.random())
#!/usr/bin/python3
import randomrandom.seed()
print ("使用默认种子生成随机数:", random.random())
print ("使用默认种子生成随机数:", random.random())random.seed(10)
print ("使用整数 10 种子生成随机数:", random.random())
random.seed(10)
print ("使用整数 10 种子生成随机数:", random.random())random.seed("hello",2)
print ("使用字符串种子生成随机数:", random.random())

在这里插入图片描述

7. Python3 标准库

os 模块:os 模块提供了许多与操作系统交互的函数,例如创建、移动和删除文件和目录,以及访问环境变量等。

sys 模块:sys 模块提供了与 Python 解释器和系统相关的功能,例如解释器的版本和路径,以及与 stdin、stdout 和 stderr 相关的信息。

time 模块:time 模块提供了处理时间的函数,例如获取当前时间、格式化日期和时间、计时等。

datetime 模块:datetime 模块提供了更高级的日期和时间处理函数,例如处理时区、计算时间差、计算日期差等。

random 模块:random 模块提供了生成随机数的函数,例如生成随机整数、浮点数、序列等。

math 模块:math 模块提供了数学函数,例如三角函数、对数函数、指数函数、常数等。

re 模块:re 模块提供了正则表达式处理函数,可以用于文本搜索、替换、分割等。

json 模块:json 模块提供了 JSON 编码和解码函数,可以将 Python 对象转换为 JSON 格式,并从 JSON 格式中解析出 Python 对象。

urllib 模块:urllib 模块提供了访问网页和处理 URL 的功能,包括下载文件、发送 POST 请求、处理 cookies 等。

8. explore more on your own

参考文献

https://www.runoob.com/python3/python3-multithreading.html

https://github.com/TheAlgorithms/Python


http://www.ppmy.cn/news/1059962.html

相关文章

JAVA笔试基础知识-final/static+abstract/interface+wait/sleep+tcp/udp

1、final关键字和static关键字的区别 /*** final修饰类&#xff1a;* 使用final修饰类的目的简单明确&#xff0c;表明这个类不能被继承。* 当程序中有永远不会被继承的类时&#xff0c;可以使用final关键字修饰。* 被final修饰的类所有成员方法都将被隐式修饰为final方法。**…

db-gpt安装指南(docker版本)

1 下载源码 下载v0.3.5的源码&#xff0c;截止今天&#xff08;20230823&#xff09;建议安装这个“稳定”版本。 2 构建镜像 依照自己硬件环境&#xff0c;看看是否要调整一下启动参数。 bash docker/build_all_images.sh \ --base-image nvidia/cuda:11.7.1-devel-ubuntu…

FastJson在Java后端方面解析使用(二)

​ JSON现在常用来做前后端数据交互&#xff0c;两个蝴蝶飞只是简单的对JSON做一下讲解和简单使用。关于JSON,我还了解的远远不够。由于本人经验有限&#xff0c;嘴皮子不溜&#xff0c;所以学术性&#xff0c;概念性&#xff0c;底层性的知识点暂时不做介绍。文章中有错误之处…

GOLANG面向对象:封装 继承 多态

面向过程转换到面向对象&#xff0c;那么必然会涉及到几个特性&#xff1a;封装&#xff0c;继承&#xff0c;多态&#xff0c;那么Golang中的面向过程会有什么特性&#xff1f;那我们来仔细说一说&#xff1a; 封装&#xff1a; 首先要一个类的概念&#xff0c;类就像一下工厂…

一文读懂Redis配置,史上真香配置

文章目录 基本配置项AOF持久化配置项RDB持久化配置项淘汰策略配置项主从复制配置项鸣谢 让那些总为redis连接异常的小白指引明灯&#xff0c;少走弯路。为那些不知道如何进行高级配置的大佬整一杯小酒。 基本配置项 bind&#xff1a;用于设置Redis绑定的IP地址。默认情况下&…

无涯教程-Python - Numbers(数字)

数字数据类型存储数值&#xff0c;它们是不可变的数据类型&#xff0c;这意味着更改数字数据类型的值将导致新分配的对象。 数字对象是在您为其分配值时创建的。例如- var11 var210 您也可以使用 del 语句删除对数字对象的引用。 del语句的语法是- del var1[,var2[,var3[..…

Allegro平台如何利用测评打造爆款产品,优化listing提升曝光度!

Allegro是波兰本土最大的电商平台&#xff0c;1999年由波兰人自己创造成立&#xff0c;75%的波兰人都知道该网站&#xff0c;Allegro的品牌认知度在波兰高达98%。也是东欧“最大”拍卖网站。 波兰的消费者非常熟悉Allegro平台&#xff0c;大部分波兰人如果想要购买商品&#x…

数据库的增量备份与差异备份

在当今数字时代&#xff0c;数据已经成为公司的主要资产。为了维护这些珍贵的数据&#xff0c;公司通常会采取各种数据保护措施&#xff0c;其中增量备份是一种很有效的方法。本文将详细介绍什么是数据库的增量备份&#xff0c;以及如何帮助企业更有效地维护数据。  我们需要…