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