关键词:版本控制、正则表达式、多线程与多进程、创建服务器与客户端、第三方发送邮件与短信、考试
一、版本控制
通过使用版本控制,我们可以无忧无虑的改进项目,不用担心项目因为我们犯错而遭到破坏,对于大型项目来说,这显得尤为重要,但是对于小项目来说,哪怕只包含一个文件的程序,也大有裨益。
Git 既可以进行本地版本控制,还可以与中央服务器连接进行版本控制,而且在Pycharm中也可以通过Git实现版本控制,在进行版本控制后可以找回之前的版本不必担心误删或者当前版本崩溃时可以通过版本控制回到上一版本
例一、版本控制相关命令:
二、正则表达式
什么是正则表达式?
在编写处理字符串的程序或网页时,经常会有查找符合某些复杂规则的字符串的需要。正则表达式就是用于描述这些规则的工具。换句话说,正则表达式就是记录文本规则的代码。
re 模块使 Python 语言拥有全部的正则表达式功能。
re.match只匹配字符串的开始,如果字符串开始不符合正则表达式,则匹配失败,函数返回None;而re.search匹配整个字符串,直到找到一个匹配。
例二、findall()返回一个列表,sub()替换,?P给组取名字叫‘num’,group() # 提取找到的内容
from re import findall, sub
def foo(mo):
val = int(mo.group('num'))
print(str(val ** 2))
print(mo.group('num'))
print(mo.group('shit'))
return '*'
def main():
a = 'sadad123sada23fdaasd235aaef'
num = findall(r'\d+',a)
my_list = list(map(int, num))
print(sum(my_list)/len(my_list))
print(sub(r'(?P<num>\d+)(?P<shit>[sa])', foo, a))
if __name__ == '__main__':
main()
三、多线程与多进程
进程 操作系统分配内存的基本单位,进程之间的内存是相互隔离的,进程之间通信是通过IPCG制(如管道等)
进程可以划分为多个线程,线程是进程的执行单元,也是操作系统分配CPU的基本单元
多线程类似于同时执行多个不同程序,多线程运行有如下优点:
使用线程可以把占据长时间的程序中的任务放到后台去处理。
用户界面可以更加吸引人,这样比如用户点击了一个按钮去触发某些事件的处理,可以弹出一个进度条来显示处理的进度
程序的运行速度可能加快
在一些等待的任务实现上如用户输入、文件读写和网络收发数据等,线程就比较有用了。在这种情况下我们可以释放一些珍贵的资源如内存占用等等。
例三、创建一个Pygame,用方块代表赛车,线程控制赛车从起点跑到终点
from random import randint
import pygame
import time
from threading import Thread
class Color(object):
BLACK = [0, 0, 0]
WHITE = [255, 255, 255]
GRAY = [242, 22, 242]
@staticmethod
def random_color():
r = randint(0, 255)
g = randint(0, 255)
b = randint(0, 255)
return r, g, b
class Car(object):
def __init__(self, x, y, color):
self._x = x
self._y = y
self._color = color
def move(self):
if self._x + 80 < 950:
self._x += randint(10, 40)
def draw(self, screen):
pygame.draw.rect(screen, self._color, (self._x, self._y, 80, 40), 0)
def main():
class BgTask(Thread):
def run(self):
while True:
screen.fill(Color.WHITE)
pygame.draw.line(screen, Color.BLACK, (130, 0), (130, 600), 4)
pygame.draw.line(screen, Color.BLACK, (950, 0), (950, 600), 4)
for car in cars:
car.draw(screen)
car.move()
pygame.display.flip()
time.sleep(0.05)
cars = []
for i in range(5):
c = Car(50, 50 + i * 120, Color.random_color())
cars.append(c)
pygame.init()
screen = pygame.display.set_mode((1000, 600))
pygame.display.set_caption('赛车')
BgTask(daemon=True).start()
running = True
while running:
for event in pygame.event.get():
if event.type == pygame.QUIT:
running = False
pygame.quit()
if __name__ == '__main__':
main()
四、 创建服务器与客户端
Socket又称”套接字”,应用程序通常通过”套接字”向网络发出请求或者应答网络请求,使主机间或者一台计算机上的进程间可以通讯。
使用 socket 模块的 socket 函数来创建一个 socket 对象。socket 对象可以通过调用其他函数来设置一个 socket 服务。
可以通过调用 bind(hostname, port) 函数来指定服务的 port(端口)。接着,我们调用 socket 对象的 accept 方法。该方法等待客户端的连接,并返回 connection 对象,表示已连接到客户端。
from socket import socket
from threading import Thread
def main():
class ClientHandler(Thread):
def __init__(self, client):
super(ClientHandler, self).__init__()
self._client = client
def run(self):
try:
while True:
try:
data = self._client.recv(1024)
if data.decode('utf-8') == 'byebye':
clients.remove(self._client)
self._client.close()
break
else:
for client in clients:
client.send(data)
except Exception as e:
print(e)
clients.remove(self._client)
break
except Exception as e:
print(e)
server = socket()
server.bind(('IP地址', 6789))
server.listen(512)
clients = []
while True:
now_client, address = server.accept()
print(address[0], '连接到服务器')
clients.append(now_client)
ClientHandler(now_client).start()
if __name__ == '__main__':
main()
五、 第三方发送邮件与短信
MTP(Simple Mail Transfer Protocol)即简单邮件传输协议,它是一组用于由源地址到目的地址传送邮件的规则,由它来控制信件的中转方式。
而python的smtplib提供了一种很方便的途径发送电子邮件。它对smtp协议进行了简单的封装。
import smtplib
for email.mime.text import MIMEText
def main():
sender = smtplib.SMTP('smtp.163.com')
sender.login('此处为邮箱账户','此处为smtp密码')
content = """
你好!
此处为邮箱内容
今晚请你吃麻辣烫!
"""
message = MIMEText(content, 'plain', 'utf-8')
message['Subject'] = '你好,测试,此处为邮箱主题'
sender.sendmail('此处为发送方邮件账户',['此处为接收方地址,可填多人'], message.as_string())
print('发送完成!')
if __name__ == '__main__':
main()