python基礎之常用模組

  • 2019 年 10 月 6 日
  • 筆記

無論是風裡,還是在雨里,我都在這裡守候著你~

socket模組

常用於通訊,任何通訊工具中都含有socket,比如qq,微信。

udp實例:

udp實例:

# 導入模組

import socket

def main():

# 創建套接字

# 參數一:ip協議,socket.AF_INET表示ipv4協議。

# 參數二:使用udp協議還是tcp協議 socket.SOCK_DGRAM表示udp協議。

udp_socket = socket.socket(socket.AF_INET,socket.SOCK_DGRAM)

# 綁定資訊,裡面是一個元組,第一個參數為ip,""表示自己的ip

# 第二個表示埠號

udp_socket.bind(("",7890))

# 接收對方的ip地址

dest_ip = input("請輸入對方的ip:")

# 接收對方的埠(port)

dest_port = int(input("請輸入對方的接收埠:"))

# 接收發送消息

send_data = input("請輸入需要發送的消息:")

# 發送消息

# 參數一:表示需要發送的消息。

# 參數二:一個元組,第一個為對方的ip地址,第二個為對方的埠號

udp_socket.sendto(send_data.encode("utf-8"),(dest_ip,dest_port))

# 接收消息 1024表示能接收的最大值。

recv_data = udp_socket.recvfrom(1024)

# 輸出接收到的消息,返回的也是一個元組,1,發送過來的資訊2,表示發送方的ip和埠

# 為什麼需要解碼gbk?因為Windows的編碼為gbk

print(recv_data[0].decode("gbk"))

# 關閉套接字

udp_socket.close()

if __name__ == "__main__":

main()

可以看到上文需要輸入對方的ip地址和埠號,為什麼?

簡單來說就是通過ip地址找到你的電腦,再通過埠號找到接收的程式。

其他的注釋應該很清楚了。tcp和udp的區別?

tcp是傳輸比較穩定,不掉包,udp是傳輸快,容易掉包。

掉包的意思就是說發送過去,對方一不定可以接收到(當然數據過大的時候會出現這種情況。)

這裡補充幾個名詞的含義。

單工:比如說收音機,只能發,或者只能收消息。

半雙工:能發也能收,但是在同一時刻只能收或只能發。

全雙工:同一時刻能發也能收。

tcp實例

import socket

def main():

# 創建套接字

# 參數一:ip協議,socket.AF_INET表示ipv4協議。

# 參數二:使用udp協議還是tcp協議 socket.SOCK_STREAM表示tcp協議

tcp_socket = socket.socket(socket.AF_INET,socket.SOCK_STREAM)

# 綁定資訊,裡面是一個元組,第一個參數為ip,""表示自己的ip

# 第二個表示埠號

tcp_socket.bind(("",7890))

# 接收對方的ip地址

dest_ip = input("請輸入對方的ip:")

# 接收對方的埠(port)

dest_port = int(input("請輸入對方的接收埠:"))

# 鏈接伺服器

tcp_socket.connec((dest_ip,dest_port))

# 接收發送消息

send_data = input("請輸入需要發送的消息:")

# 發送消息

tcp_socket.send(send_data.encode("utf-8"))

# 接收消息 1024表示能接收的最大值。

recv_data = tcp_socket.recv(1024)

# 輸出接收到的消息,返回的也是一個元組,1,發送過來的資訊2,表示發送方的ip和埠

# 為什麼需要解碼gbk?因為Windows的編碼為gbk

print(recv_data[0].decode("gbk"))

# 關閉套接字

tcp_socket.close()

if __name__ == "__main__":

main()

time模組

import time #導入模組

time.sleep(5) # 停留5秒,不給錢不優化那種

time.time() # 返回從1970年1月1日到現在經歷了多少秒。

# 格式化時間

time.strftime("%Y-%m-%d %H:%M:%S") # 2018-11-08 21:50:01

time.strftime("%Y/%m/%d %H:%M:%S") # 2018/11/08 21:50:01

其他格式:

%Y 四位數的年份表示(000-9999)

%m 月份(01-12)

%d 月內中的一天(0-31)

%H 24小時制小時數(0-23)

%I 12小時制小時數(01-12)

%M 分鐘數(00=59)

%S 秒(00-59)

%a 本地簡化星期名稱

%A 本地完整星期名稱

%b 本地簡化的月份名稱

%B 本地完整的月份名稱

%c 本地相應的日期表示和時間表示

%j 年內的一天(001-366)

%p 本地A.M.或P.M.的等價符

%U 一年中的星期數(00-53)星期天為星期的開始

%w 星期(0-6),星期天為星期的開始

%W 一年中的星期數(00-53)星期一為星期的開始

%x 本地相應的日期表示

%X 本地相應的時間表示

%Z 當前時區的名稱

%% %號本身

# 以上自己可以試試。

time.localtime() # 結構化時間

# time.struct_time(tm_year=2018, tm_mon=11, tm_mday=8, tm_hour=21, tm_min=59, tm_sec=14, tm_wday=3, tm_yday=312, tm_isdst=0)

time.tm_year # 返回年

# 將時間戳轉化為結構化時間

t = time.time()

time.localtime(t) # 現在的時間

time.gmtime() # 國外某地點現在的時間

# 將格式化時間轉化為時間戳

strtime = '2018-11-08 21:50:01'

time.mktime(strtime)

# 將格式化時間轉化為結構化時間

time.strptime('2018-11-8','%Y-%m-%d')

# 將結構化時間轉化為格式化時間

time.strftime('%Y-%m-%d %H:%M:%S',time.localtime(1600000000))

其他類型時間

time.asctime() # Thu Nov 8 22:22:27 2018

time.ctime(1600000000) # Sun Sep 13 20:26:40 2020

random隨機數模組

實例:

# 導入模組

import random

# 隨機整數

random.randint(0,5) # 返回大於0小於等於5的整數

# 隨機偶數

random.randrange(0,10,2) # 返回大於等於0小於10的偶數,2為步長,和列表一樣

# 隨機返回其中一個值

random.choice([1,2,3,4,5]) # 隨機返回其中一個值

# 隨機返回多個值

random.sanple([1,2,3,4,5],3) # 隨機返回3個值,返回幾個取決於第二個參數

# 打亂列表順序

list = [1,2,3,4,5]

random.shuffle(list) # 隨機打亂列表的順序)

os 模組(與作業系統相關)

實例:

#導入模組

import os

# getcwd() 獲取當前工作目錄(當前工作目錄默認都是當前文件所在的文件夾)

os.getcwd()

# chdir()改變當前工作目錄

os.chdir('/python/Demo')

# listdir() 獲取指定文件夾中所有內容的名稱列表

os.listdir('/python/Demo')

# mkdir()創建文件夾

os.mkdir('Test')

# makedirs()遞歸創建文件夾

os.makedirs('/python/Demo/Test/A/B')

# rmdir() 刪除空目錄

os.rmdir('Demo')

# removedirs遞歸刪除文件夾 必須都是空目錄

os.removedirs('/python/Demo/Test/A/B')

# stat()獲取文件或者文件夾的資訊

os.stat('/python3/Demo.py)

# system()執行系統命令

os.system('ls -al') #獲取隱藏文件

# abspath()將相對路徑轉化為絕對路徑

path = './Demo' #相對

result = os.path.abspath(path)

print(result)

# dirname()獲取完整路徑當中的目錄部分

path = '/python3/Demo/Test'

os.path.dirname(path) # /python3/Demo

# basename()獲取完整路徑當中的主體部分

os.path.basename(path) # Test

#split() 將一個完整的路徑切割成目錄部分和主體部分

result = os.path.split(path)

print(result) #返回一個元組('/python3/Demo', 'Test')

# join()將2個路徑合併成一個

path1 = '/python3/Demo'

path2 = 'Test.py'

os.path.join(path1,path2)# '/python3/Demo/Test.py'

# splitext() 將一個路徑切割成文件後綴和其他兩個部分,主要用於獲取文件的後綴

path = '/python3/Demo/Test.py'

os.path.splitext(path) # ('/python3/Demo/Test', '.py')

# getsize() 獲取文件的大小

path = '/python3/Demo/Test.py'

os.path.getsize(path)

# isfile()檢測是否是文件

path = '/python3/Demo/Test.py'

os.path.isfile(path)

# isdir()檢測是否是文件夾

os.path.isdir(path)

# islink() 檢測是否是鏈接

os.path.islink(path)

# getctime()獲取文件的創建時間

# getmtime()獲取文件的修改時間

# getatime()獲取文件的訪問時間

# getenv() 獲取系統的環境變數

# curdir表示當前文件夾 .表示當前文件夾

print(os.curdir)

#pardir表示上一層文件夾 ..表示上一層文件夾

#name 獲取代表作業系統的名稱字元串

print(os.name)

#sep 獲取系統路徑間隔符號

print(os.sep) # window是 linux事/

#linesep 獲取作業系統的換行符號

print(os.linesep) # window 是rn linux/unix 是 n

sys 模組(和python解釋器交互)

# 導入模組

import sys

sys.exit() # 退出程式

# sys.exit(0) 正常退出 sys.exit(1)遇見錯誤退出

print(sys.platform) # 作業系統名稱

print(sys.version) # python解釋器的版本

sys.path # 返回模組的搜索路徑

sys.argv # 實現從程式外部向程式傳遞參數。在終端才能看出效果,現在知道就好

序列化與反序列化模組

str = "[1,2,3,4,5,6]"

# 當我們想要像調用列表一樣調用上面的字元串時,我們需要反序列化

# 同理 當我們將比如列錶轉換為字元串類型就稱之為序列化

# json 每個語言都通用的序列化格式。但是能用json轉化的數據類型較少

# pickle python中的所有數據類型都可以序列化,但是只有python認識

# shelve 新來的,方便,不完善

json

# 導入模組

import json # 可以轉化的有 數字,字元串,列表,字典,元組(轉化為列表)

# 序列化

list = [1,2,3,4,5]

print(type(list)) # <class 'list'> 列表類型

str = json.dumps(list)

print(type(str)) # <class 'str'> 此時就轉化為了字元串格式

# 反序列化

attr = json.loads(str)

print(type(attr)) # <class 'list'> 列表類型

# 序列化寫入文件

f = open('txt','w',encoding = 'utf-8')

json.dump(list,f,ensure_ascii=False) # 把list 序列化寫入文件 ensure_ascii=False如果有中文需要加上

f.close()

# 從文件里拿出數據反序列化

f = open('txt','r',encoding = 'utf-8')

txt =json.load(f)

f.close()

print(type(txt)) # list 返回的list

pickle

# 導入模組

import pickle # 可以序列化所有數據類型

# 使用方法也是 dumps,dumps,loads,load

# 不同的是 dumps 返回的是bytes類型 loads之後就正常了。

# 同樣的寫入文件的時候需要wb,和rb

shelve

# 導入模組

import shelve

# 序列化

# 拿到句柄

ff = shelve.open('text')

# 這樣就序列化了

ff['txt'] = [1,2,3,4,5]

ff.close()

# 反序列化

# 拿到句柄

# 這樣就反序列化了

ff = shelve.open('text')

txt = ff['txt']

ff.close()

print(txt)

collections模組

當我們想要表示一個點的坐標時

實例:

# 導入模組

from collections import namedtuple

# namedtuple參數一:起的名字,參數二:坐標名

Spot = namedtuple('spot',['x','y'])

# 添加數據

s = Spot(3,4)

# 輸出x

print(s.x)

# 輸出y

print(s.y)

queue模組# 隊列

實例:

# 導入模組

import queue

# 創建一個隊列

q = queue.Queue()

q.put(1)

q.put(2)

print(q.get()) # 1

print(q.get()) # 2

print(q.get()) # 發生堵塞,不會報錯

# 先進先出

deque # 雙端隊列

實例:

# 導入模組

from collections import deque

# 創建一個雙端隊列

de = deque()

# 從前面添加數據

de.appendleft(111)

# 從後面添加數據

de.append(222)

# 在指定位置添加數據

de.insert(1,333)

# 從前面取數據

print(de.popleft())

# 從後面取數據

print(de.pop())

當我們想要一個字典key值有序時

實例:

# 導入模組

from collections import OrderedDict

d = {'q':'1','w':'2','e':'3'}

# 因為字典的key值是無序的,想要變得有序這樣既可:

ordict = OrderedDict(d)

給字典設置默認value值。

from collections import defaultdict

dict = defaultdict(list)

print(dict['key1']) # 輸出[]

# 參數必須是可以調用的比如list,set,dict,也可以是自己寫的函數,隨意。

# 為什麼設置默認值?因為當不存在value值時,不能調用字典的append方法。

當我們想要統計一個單詞某個字母出現的個數時

# 導入模組

from collections import Counter

num = Counter('qweasdqwertdgfdaDSD')

print(num) # 結果:Counter({'q': 4, 'w': 4, 'e': 4})

print(num['q']) # 4