Python -- 服务器与邮件的补充说明

关键词:版本控制、正则表达式、多线程与多进程、创建服务器与客户端、第三方发送邮件与短信、考试

一、版本控制
通过使用版本控制,我们可以无忧无虑的改进项目,不用担心项目因为我们犯错而遭到破坏,对于大型项目来说,这显得尤为重要,但是对于小项目来说,哪怕只包含一个文件的程序,也大有裨益。
Git 既可以进行本地版本控制,还可以与中央服务器连接进行版本控制,而且在Pycharm中也可以通过Git实现版本控制,在进行版本控制后可以找回之前的版本不必担心误删或者当前版本崩溃时可以通过版本控制回到上一版本
例一、版本控制相关命令:
# ENTAC
# 验证用户名
# 版本控制:
# 1.Subversion  必须有中央服务器
# 2.Git         可以先在本地同步d
# git --version                            确认是否安装Git
# git init                                 加入版本控制
# git add.                                 添加
# git status                               查看
# git commit -m '项目的初始版本'             提交并写原因
# git log                                  查看日志
# git reset HEAD^                          回到上一版本
# git reset 版本号                          回到对应版本号的版本
# git remote add origin 网址                给远端仓库建立联系
# git pull 网址                             与服务器上代码同步
# git push origin master                   往服务器上传代码
# git clone 网址                            下载项目
# git rm 文件名                              删除文件
# git check out 文件名                       重新拿出文件
# git branch                                查看分支
# git branch 名称                            建立分支
# git checkout 名称                          切换至该名称的分支
# git merge 分支名称                          合并分支到主线
二、正则表达式
什么是正则表达式?
在编写处理字符串的程序或网页时,经常会有查找符合某些复杂规则的字符串的需要。正则表达式就是用于描述这些规则的工具。换句话说,正则表达式就是记录文本规则的代码。
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 str(val ** 2)
    return '*'


def main():
    a = 'sadad123sada23fdaasd235aaef'
    num = findall(r'\d+',a)
    # total = 0
    # for val in num:
    #     total += int(val)
    # print(total)
    my_list = list(map(int, num))    # 映射函数,对列表,集合,元组做映射变换
    print(sum(my_list)/len(my_list))

    # print(sub(r'\d+',foo,a)) # 替换,第二个参数可以为函数。这是高阶函数的用法
    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()
    # 可以用命令行参数 传入IP - sys.argv
    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') # 此处为163邮箱对应的smtp地址
    sender.login('此处为邮箱账户','此处为smtp密码')
    content = """
    你好!
    此处为邮箱内容
    今晚请你吃麻辣烫!
    """
    message = MIMEText(content, 'plain', 'utf-8')
    message['Subject'] = '你好,测试,此处为邮箱主题'
    sender.sendmail('此处为发送方邮件账户',['此处为接收方地址,可填多人'], message.as_string())
    print('发送完成!')


if __name__ == '__main__':
    main()
  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值