python3.6.5版本保留字总数_Python3.6學習筆記(五)

網絡編程

網絡程序出現的比互聯網要早很多,實現方式主要依靠網絡上不同主機間進程的通信,通信協議最重要的是TCP/IP協議。在這兩個協議基礎上還有很多更高級的協議,包括HTTP、SMTP等。要進行兩個主機間的網絡通信,必須四個元素:源地址、源端口號、目的地址、目的端口號。

c49783ed08a846dd595346e19df68f17.png

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':

break

sock.send(('Hello,%s!' % data.decode('utf-8')).encode('utf-8'))

sock.close()

print('Connection from%s:%sclosed.' % addr)

while True:

sock, addr = s.accept()

t = threading.Thread(target=tcplink, args=(sock, addr))

t.start()

客戶端代碼

import socket

s = 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 time

s = 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 time

s = 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快了很多。

9936bcea64136ccd0880a10b5246c82f.png

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.py

def application(environ, start_response):

start_response('200 OK', [('Content-Type', 'text/html')])

body = '

Hello,%s!

' % (environ['PATH_INFO'][1:] or 'web')

return [body.encode('utf-8')]

使用WSGI的方式來進行Web開發,需要花很多精力來處理請求和響應的對應關系,這個時候可以引入框架。這里以Web.py框架為例。

import web

urls = (

'/(.*)', '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')

>>> 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(),這樣就可以非常高效地往頭部添加或刪除元素。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值