Python3.6学习笔记(五)

网络编程

网络程序出现的比互联网要早很多,实现方式主要依靠网络上不同主机间进程的通信,通信协议最重要的是TCP/IP协议。在这两个协议基础上还有很多更高级的协议,包括HTTP、SMTP等。要进行两个主机间的网络通信,必须四个元素:源地址、源端口号、目的地址、目的端口号。

TCP编程

Socket是网络编程一个抽象概念,通常我们用一个Socket表示“打开了一个网络链接”,而打开一个Socket需要知道目标计算机的IP地址和端口号,再指定协议类型即可。示例代码实现了一个服务端和客户端,服务端将客户端发送的内容回显给客户端,一切都是在命令行下执行。图形界面原理一样。


import socket
import threading
import time#服务端代码
s = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
s.bind(('127.0.0.1', 9999))#开始监听端口,参数表示最大连接数
s.listen(5)     
print("Waiting for connection...")def tcplink(sock, addr):print('Accept new connection from %s:%s...' % addr)sock.send(b'Welcome!')while True:data = sock.recv(1024)time.sleep(1)if not data or data.decode('utf-8') == 'exit':breaksock.send(('Hello, %s!' % data.decode('utf-8')).encode('utf-8'))sock.close()print('Connection from %s:%s closed.' % addr)while True:sock, addr = s.accept()t = threading.Thread(target=tcplink, args=(sock, addr))t.start()

客户端代码


import sockets = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
# 建立连接:
s.connect(('127.0.0.1', 9999))
# 接收欢迎消息:
print(s.recv(1024).decode('utf-8'))
for data in [b'Michael', b'Tracy', b'Sarah']:# 发送数据:s.send(data)print(s.recv(1024).decode('utf-8'))
s.send(b'exit')
s.close()

UDP编程

TCP建立了双方之间的可靠连接,通信双方都可以用流的方式发送数据。UDP则是面相无连接的协议,使用UDP协议时,不需要建立连接,只需要知道对方的IP和端口号,就可以直接发送数据包。但是对方是否能够收到就不知道了。它的优点是速度快。

服务端代码


import socket
import threading
import times = socket.socket(socket.AF_INET, socket.SOCK_DGRAM)
# 绑定端口:
s.bind(('127.0.0.1', 9999))print('Bind UDP on 9999...')
while True:# 接收数据:data, addr = s.recvfrom(1024)print('Received from %s:%s.' % addr)s.sendto(b'Hello, %s!' % data, addr)

客户端代码


import socket
import threading
import times = socket.socket(socket.AF_INET, socket.SOCK_DGRAM)
for data in [b'Michael', b'Tracy', b'Sarah']:# 发送数据:s.sendto(data, ('127.0.0.1', 9999))# 接收数据:print(s.recv(1024).decode('utf-8'))
s.close()

做了一个简单的对比,可见UDP的传输方式比TCP快了很多。

Web开发

随着互联网流行起来的B/S模式是Web开发的主要内容,包括客户端展现(HTML、CSS、JAVASCRIPT)以及服务端处理(静态内容、CGI、动态语言)。Python提供了很多Web开发框架,能够为我们提供Web开发的快速支持。

开始WEB开发的话我觉得最好从HTML入手,然后了解HTTP协议,这些熟悉之后逐步熟悉CSS、Javascript,然后了结合后台编程语言,完成自己编写网站的小目标。

笔者是从PHP学习开始Web开发的,接触Python的Web开发还沿用PHP的思路会产生一些迷惑。PHP从产生之初就是作为Web开发语言而设计的,PHP是作为Apache的模块来进行请求处理和响应的,与HTTP相关的很多基础处理都是由Apache完成的,mod_php模块与其对接生成类似$_POST,$_GET的对象供PHP脚本使用。

Python有所不同,Python是作为一种通用脚本处理语言产生的,所以它能够完成的工作更多,也可以作为Web开发语言,只是方式不同。如果Python作为服务端脚本语言,可以分几个层次:如果Python负责处理所有的事务,包括TCP链接、逻辑处理、内容响应,Python也是可以胜任的,但是这样开发要做的工作就非常多;如果Python只是负责生成HTML文档,前端使用Apache等,Pyhon只需要负责文档解析。实现这个层次,是因为Python提供了WSGI接口(Web Server Gateway Interface),这时Python的焦点放在接口处理和Web逻辑处理上。第三个层次就是使用Python的Web框架,现在有很多成熟的框架,包括Django、Flask等。这样,Python就主要关注Web处理,包括URL以及对应的函数处理。

先看一下使用WSGI接口编写简单的Web程序,返回一个简单的文字。


# server.py
# 从wsgiref模块导入:
from wsgiref.simple_server import make_server
# 导入我们自己编写的application函数:
from hello import application# 创建一个服务器,IP地址为空,端口是8000,处理函数是application:
httpd = make_server('', 8000, application)
print('Serving HTTP on port 8000...')
# 开始监听HTTP请求:
httpd.serve_forever()

# hello.pydef application(environ, start_response):start_response('200 OK', [('Content-Type', 'text/html')])body = '<h1>Hello, %s!</h1>' % (environ['PATH_INFO'][1:] or 'web')return [body.encode('utf-8')]

使用WSGI的方式来进行Web开发,需要花很多精力来处理请求和响应的对应关系,这个时候可以引入框架。这里以Web.py框架为例。


import weburls = ('/(.*)', 'hello'
)
app = web.application(urls, globals())class hello:        def GET(self, name):if not name:name = 'World'return 'Hello, ' + name + '!'if __name__ == "__main__":app.run()

由此可见,使用框架后,我们可以将精力放在URL和对应的处理函数上。

正则表达式

正则表达式说起来是一个可以讲很久的话题,这里简单说一下 Python 中的使用。

re模块

Python提供re模块,包含所有正则表达式的功能。建议所有处理正则的部分都使用```r```开头,这样就不需要考虑转义的问题。


>>> import re
>>> re.match(r'^\d{3}\-\d{3,8}$', '010-12345')
<_sre.SRE_Match object; span=(0, 9), match='010-12345'>
>>> re.match(r'^\d{3}\-\d{3,8}$', '010 12345')
>>> 

如果匹配则返回一个Match对象,没找到则返回None。

切分字符串

可以使用正则的切分字符串


>>> re.split(r'\s+', 'a b   c')
['a', 'b', ‘c']

分组

正则表达式中提供了()进行匹配结果的分组,如果正则表达式中定义了组,就可以使用Match对象的group()方法提取子串。group(0)表示的是原始字符串。


>>> t = '19:05:30'
>>> m = re.match(r'^(0[0-9]|1[0-9]|2[0-3]|[0-9])\:(0[0-9]|1[0-9]|2[0-9]|3[0-9]|4[0-9]|5[0-9]|[0-9])\:(0[0-9]|1[0-9]|2[0-9]|3[0-9]|4[0-9]|5[0-9]|[0-9])$', t)
>>> m.groups()
('19', '05', '30')

常用内置模块

datetime

datetime是Python处理日期和时间的标准库。日期操作中,常用的包括获取当前日志、创建一个日期、计算两个日期的差值、判断日期的类型、日期与时间戳的相互转换、字符串与日期类型的相互转换,这些基本上看看例子就可以掌握。

在计算机中,时间实际上是用数字表示的。我们把1970年1月1日 00:00:00 UTC+00:00时区的时刻称为epoch time,记为0(1970年以前的时间timestamp为负数),当前时间就是相对于epoch time的秒数,称为timestamp。timestamp 与时区没有关系,datetime与时区有关系。

字符串'%Y-%m-%d %H:%M:%S'规定了日期和时间部分的格式。详细的说明请参考Python文档。字符串转换为日期类型后,默认是没有带时区信息的。


from datetime import datetime, timedelta, timezone# 获取当前时间
now = datetime.now()
print(now)# 创建一个指定的日期
wt = datetime(2017,4,12,14,5,15)
print(wt)# 将日期类型转换为时间戳
print( wt.timestamp() )# 将时间戳转换为日期,加了一个小时
print( datetime.fromtimestamp(wt.timestamp() + 60*60 ) )# 字符串转换为日期类型
cday = datetime.strptime('2017-4-12 18:19:59', '%Y-%m-%d %H:%M:%S')
print(cday)# 将日期类型格式化为字符串显示
print(now.strftime('%A, %B, %d, %H:%m'))# 日期类型也可以直接使用 + - 进行运算,引入timedelta可以计算差值
print(now - timedelta(days=1))
print(now + timedelta(days=1, hours=2))

collections

collections 是 Python 内建的一个集合模块,提供了许多有用的集合类。包括 namedtuple、deque

tuple 可以表示不变集合,但是不方便从名称上看出用途。通过使用namedtuple函数,可以创建一个自定义的tuple对象,规定了tuple的个数,并且可以通过属性来访问元素。

使用 list 存储数据时,,按索引访问元素很快,但是插入和删除元素就很慢了,因为list是线性存储,数据量大的时候,插入和删除效率很低。deque是为了高效实现插入和删除操作的双向列表,适合用于队列和栈。deque除了实现list的append()pop()外,还支持appendleft()popleft(),这样就可以非常高效地往头部添加或删除元素。

参考资料:
1、Python Web Server Gateway Interface v1.0
2、Webpy 框架

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/285907.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

ArcGIS实验教程——实验三十三:ArcScan自动矢量化完整案例教程

ArcGIS实验视频教程合集:《ArcGIS实验教程从入门到精通》(附配套实验数据)》 文章目录 1 ArcScan 简介2. ArcScan使用前提及注意事项3. ArcGIS自动矢量化案例1 ArcScan 简介 ArcScan是ArcGIS Desktop的打展模块,是栅格数据矢量化的套工具集, 用这些工具,可以创建要素,将…

抢先体验全新标签页!Windows 11 必备小工具下载

面向 Dev 频道的 Windows 预览体验成员&#xff0c;微软近日推送了 Windows 11 新预览版&#xff0c;为文件资源管理器带来了全新标签页功能。Windows 11 文件资源管理器全新标签页介绍在 Windows 11 预览版中&#xff0c;新功能分别向 A 和 B 两组用户的电脑推送测试。A 用户的…

thymeleaf模板的使用(转)

作者&#xff1a;纯洁的微笑 出处&#xff1a;http://www.ityouknow.com/ 在上篇文章springboot(二)&#xff1a;web综合开发中简单介绍了一下thymeleaf&#xff0c;这篇文章将更加全面详细的介绍thymeleaf的使用。thymeleaf 是新一代的模板引擎&#xff0c;在spring4.0中推荐使…

二、基本类型及函数使用《2022 solidity8.+ 版本教程到实战》

一、基本变量类型 solidity 中的基本变量类型与一般编程中类似&#xff1a; // SPDX-License-Identifier: GPL-3.0 pragma solidity ^0.8.0; contract Hello{string public say"Hello 1_bit";int public ival-1;uint public uval1;address public aval0xd9145CCE52…

Ruby 学习笔记3

在Ruby中有很多方法是以?和!号结尾的 “&#xff1f;”被用于标示谓词&#xff0c;即返回Boolean直的方法&#xff0c;如Array.empty?(判断数组中元素是否为空) “&#xff01;”出现在方法名尾部的感叹号表明使用该方法是需要多加小心。许多Ruby的核心类都定义了 成对的方…

C语言试题六十九之请编写函数判断一个数是不是素数

📃个人主页:个人主页 🔥系列专栏:C语言试题200例目录 💬推荐一款刷算法、笔试、面经、拿大公司offer神器 👉 点击跳转进入网站 ✅作者简介:大家好,我是码莎拉蒂,CSDN博客专家(全站排名Top 50),阿里云博客专家、51CTO博客专家、华为云享专家 1、题目 编写函数:…

Python3.6学习笔记(六)

WSGI Python Web Server Gateway Interface 规范学习 由于Python的灵活性&#xff0c;提供了多种方式可以作为服务端语言&#xff0c;包括Python编写的服务器&#xff08;Medusa&#xff09;、Python处理模块&#xff08;mod_python)&#xff0c;或者使用CGI、FastCGI方式触发…

Markdown编辑器模板

这里写自定义目录标题欢迎使用Markdown编辑器新的改变功能快捷键合理的创建标题&#xff0c;有助于目录的生成如何改变文本的样式插入链接与图片如何插入一段漂亮的代码片生成一个适合你的列表创建一个表格设定内容居中、居左、居右SmartyPants创建一个自定义列表如何创建一个注…

as3文本框的动态拖拽和编辑

如今非常多软件都支持了编辑界面的文本拖拽和点击编辑来直接改动数值, 这样便于操作, 并且体验性也好, 抛砖引玉吧 于是就用好久没编写的as3来写了一下: 由于用的flash ide写的没有提示, 就临时不做细节处理了, 假设用于project上会有点小问题, 只是不影响本效果展示 代码: imp…

为 HttpClient 注册自定义请求标头

前言上次&#xff0c;我们介绍了《在 ASP.NET Core 中使用 HTTP 标头传播》。但是有时候&#xff0c;当服务间需要互相调用时&#xff0c;也需要将创建一些自定义标头传播到目标服务。比如&#xff0c; ServiceA 已经进行了身份验证&#xff0c;那么当它调用 ServiceB 时&#…

图片压缩上传Thumbnailator 插件

假如你现在还在为自己的技术担忧&#xff0c;假如你现在想提升自己的工资&#xff0c;假如你想在职场上获得更多的话语权&#xff0c;假如你想顺利的度过35岁这个魔咒&#xff0c;假如你想体验BAT的工作环境&#xff0c;那么现在请我们一起开启提升技术之旅吧&#xff0c;详情请…

jQuery实现登录提示

实现效果&#xff1a;将鼠标聚焦到邮箱地址文本框时&#xff0c;文本框 内的“请输入邮箱地址”文字将被清除&#xff1b; 若没有输入任何内容&#xff0c;鼠标移除后邮箱地址文本框被还原。 1 <!DOCTYPE html>2 <html>3 <head>4 <meta charset"…

C语言试题七十之请编写函数判断年份是否为闰年

📃个人主页:个人主页 🔥系列专栏:C语言试题200例目录 💬推荐一款刷算法、笔试、面经、拿大公司offer神器 👉 点击跳转进入网站 ✅作者简介:大家好,我是码莎拉蒂,CSDN博客专家(全站排名Top 50),阿里云博客专家、51CTO博客专家、华为云享专家 1、题目 编写函数:…

js 通过jquery插件获取url参数 其中的一个小问题,或许不算Bug。

形如&#xff1a;http://localhost:10864/srch.htm?keys&type1 这样的地址&#xff0c;如果我们要取keys的参数&#xff1a; var srchKey $.query.get("keys"); 那么得到的将是‘true’ &#xff0c;而不是空客串&#xff0c;这常常不是我们想要的 。 修正办法…

【Pix4d精品教程】未校准相机:287 out of 402 images calibrated (71%), all images enabled, 6 block,问题分析及解决方案汇总

文章目录 问题描述原因分析问题分析问题解决问题描述 在使用pix4d处理航测数据时,部分航带高精度检测时,提示未校准相机: 287 out of 402 images calibrated (71%), all images enabled, 6 blocks 质量报告如下所示: 切换到【控三射线】,查看空山射线,红色部分是校准失败…

设置Windows 8.1屏幕自己主动旋转代码, Auto-rotate function code

程序代码实现启用或禁用Windows 8.1 Tablet的自己主动旋转功能 方法一&#xff1a;使用SetDisplayAutoRotationPreferences函数功能 #include <Windows.h>/* typedef enum ORIENTATION_PREFERENCE { ORIENTATION_PREFERENCE_NONE 0x0, ORIENTATION_PRE…

四、函数修改器《2022 solidity8.+ 版本教程到实战》

一、函数修改器 modifier 在 solidity 中有一个函数修改器可作为前置、中置或者后置方法&#xff0c;有点像 ASP.NET 中的母版页&#xff08;最起码差不多十年不碰了&#xff0c;不懂还有没有这个概念&#xff09;&#xff0c;又有点像 ThinkPHP 中的前置方法&#xff0c;可以…

C#-基于ip2region的离线IP定位库

前言在开发中&#xff0c;我们需要记录关于登录者的ip和位置信息&#xff0c;可以通过ip2region来实现&#xff01;比如说:qq&#xff0c;gitee等 我们在异地登录时&#xff0c;会提醒我们账号异地登录&#xff01;外卖等软件&#xff0c;需要地理位置&#xff0c;如果我们的gp…

【No.7 C++对象的构造与析构时间】

【注意】 程序语言只是我们与计算机交流并让计算机实现我们创造性思想的工具&#xff0c;可以并鼓励深入掌握一门语言&#xff0c;但千万别沉迷于钻某种语言的牛角尖&#xff0c;一定要把握好二者间的度本帖属不定时连载贴&#xff0c;以试卷的形式提出一个比较基础的问题供大家…

mysql按月进行表分区

数据库 mysql 单表数据量达到千万、亿级&#xff0c;可以通过分表与表分区提升服务性能。 现有表accounting&#xff0c;4亿条数据&#xff0c;数据访问方式为insert与select&#xff0c;select为按月访问&#xff0c;为减少数据与程序变更&#xff0c;采用表分区的方式。 数据…