python基础之常用模块
socket模块
常用于通讯,任何通讯工具中都含有socket,比如qq,微信。
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 是\r\n 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