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.pswp.cn/news/285907.shtml
繁體地址,請注明出處:http://hk.pswp.cn/news/285907.shtml
英文地址,請注明出處:http://en.pswp.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;采用表分區的方式。 數據…