python学习之路---day21--模块和栈
模块和栈 一:计数模块collections
基础版本:
s="qwewsfdfjiehrfqweqweqwqewq"
dic={}
for el in s:
dic[el]=dic.setdefault(el,0)+1
print(dic)
升级版本:
import collections
from collections import Counter
s="qwewsfdfjiehrfqweqweqwqewq"
qq=Counter(s)
print("__iter__" in dir(qq))
for item in qq:
print(item,qq[item])
# 同时列表也可以用counter
# # 列表也可以用Counter
import collections
lst=["","","","","",""]
q=collections.Counter(lst)
print(q) #打印: Counter({'1': 4, '2': 1, '4': 1})
二:栈和队列
001:栈
栈的进出原则:先进后出
栈的基本知识点总结:
栈是一种先进后出的序列表,先放进去的元素,只能通过栈指针去取出来,每当放入一个元素的时候当往栈里面添加一个元素时,
栈指针会往上移动一个(index会变成 index+1--〉放元素时),取元素的时候,也是通过栈指针,取指针的下一个元素,此时栈
顶指针是: index=index-1(取元素时),,,空栈的时候添加元素只能用插入--〉insert()
自定义栈满了之后的异常
class StackFullError(Exception):
pass class StackEmptyError(Exception):
pass class Stack: #定义一个栈类
def __init__(self,size):
self.index=0 #栈顶指针
self.lst=[]
self.size=size def push(self,item): #往栈里面添加元素
if self.index==self.size:
#栈已经满了 需要报错
raise StackFullError("the Stack is full") self.lst.insert(self.index,item) #空列表需要用insert
self.index+=1
#从栈中获取数据
def pop(self):
if self.index==0:
raise StackEmptyError("the stack is empty") #这里也需要自定义一个异常(栈空了需要报异常)
self.index-=1 #指针向下移动
item=self.lst.pop(self.index) #获取元素删除
return item s=Stack(5) #给栈一个大小
s.push("q")
s.push("w")
s.push("e")
s.push("r")
s.push("t") #往栈里面添加元素 print(s.pop()) #从栈里面拿数据元素
print(s.pop())
print(s.pop())
print(s.pop())
print(s.pop())
print(s.pop()) print(s.pop()) #超出栈大小,抛出异常
02):队列
队列数据进出原则:先进先出
例子01:
import queue #引入队列模块
q=queue.Queue() #创建一个队列,固定模板(在queue模块中有一个)
q.put("张三")
q.put("李四")
q.put("王五")
q.put("旺财")
q.put("小白") print(q.get())
print(q.get())
print(q.get())
print(q.get())
print(q.get())
#打印:张三 李四 王五 旺财 小白
#
print(q.get()) #造成阻塞
print("没有了")
#在队列里面已经没有元素了,还继续拿元素的时候,队列会一直处于执行状态,等待着元素的进入,这个时候就是阻塞了
03):双向队列
from collections import deque #从系统中自带的collections 模块 引入 deque
q=deque() #创建一个双向队列 q.append("张三") #从右边末尾开始加元素
q.append("李斯特") #加在最右边,提取数据时候,总是从最右边开始获取 q.appendleft("王五") #加在最左边,提取的时候总是从最左边开始获取数据
q.appendleft("旺财") print(q.pop()) #从最右边开始获取
print(q.popleft()) #从最左边开始获取
04):namedtuple #命名元组
from collections import namedtuple
Point=namedtuple("点",["x","y","z"])
p=Point("zhangshan","lisu","王五")
print(p)
print(p.x)
print(p.y)
print(p.z) 类似于:
class Point:
def __init__(self,x,y):
self.x=x
self.y=y
p=Point(2,3)
p.z=12
print(p.z)
05):默认字典 defaultdict
例子01:
from collections import defaultdict
lst=[11,22,33,44,55,66,77,88,99]
d=defaultdict(list) #d是一个空列表
for el in lst:
if el<66:
d["key1"].append(el) #d["key1"] 是一个字典的键,将el 添加到其所对应的键值的列表中
else:
d["key2"].append(el) #key1 key2 是不存在的,但是可以拿到key1 key2
print(d) 例子2:
from collections import defaultdict
d=defaultdict(list)
#d=defaultdict(abc) abc 可以是list、set、str等等,作用是当key不存在时,
# 返回的是abc的默认值,比如list对应[ ],str对应的是空字符串,
d["wangwu"]="王五"
print(d["zhangsan"]) #打印:[]
print(d["wangwu"]) #打印:王五
06):orderdict和defaultdict
orderdict 顾名思义. 字典的key默认是⽆序的. ⽽OrderedDict是有序的
dic = {'a':'娃哈哈', 'b':'薯条', 'c':'胡辣汤'}
print(dic)
from collections import OrderedDict
od = OrderedDict({'a':'娃哈哈', 'b':'薯条', 'c':'胡辣汤'}) #从这个3.6版本是看不出来的,但是内部是无序的
print(od)
三:时间模块
获取当前时间 (时间戳)
001:打印本地时间(时间有localtime 和 gmtime )
import time
print(time.time()) #d打印的时当前时间:1542167144.751588
002格式化时间:
s=time.strftime("%Y/%m/%d %H:%M:%S") #string format time
print(s) #打印:2018/11/14 11:48:02
相似类等待时间 :wait() #傻等,必须要是 notify()
例子:
while 1: #这是一个计时器
s=time.strftime("%Y-%m-%d %H:%M:%S")
print(s)
time.sleep(2) #每隔(睡眠) 2秒 然后再执行打印
003:结构化时间:
import time
t=time.localtime()
print(t)
#打印:time.struct_time(tm_year=2018, tm_mon=11, tm_mday=14, tm_hour=11, tm_min=55, tm_sec=22, tm_wday=2, tm_yday=318, tm_isdst=0)
print(t.tm_year) #只获取年份,其他的分 秒类似写法
004:将时间戳转换成格式化时间
时间戳--〉格式化时间:
import time
a=19888899
t=time.localtime(a)
#t=time.gmtime(0) #时区 gmtime() 格林尼治时间
print(t) #打印:time.struct_time(tm_year=1970, tm_mon=8, tm_mday=19, tm_hour=12, tm_min=41, tm_sec=39, tm_wday=2, tm_yday=231, tm_isdst=0)
str_time=time.strftime("%Y/%m/%d %H:%M/%S:%A/%Z",t)
print(str_time) #打印:1970/08/19 12:41/39:Wednesday 格式化时间--〉时间戳(思路:格式化时间--〉结构化时间--〉时间戳) import time
# 格式化时间--〉结构化时间
s="2017-2-23 13:45:34"
t=time.strptime(s,"%Y-%m-%d %H:%M:%S")
print(t) #打印:time.struct_time(tm_year=2017, tm_mon=2, tm_mday=23, tm_hour=13, tm_min=45, tm_sec=34, tm_wday=3, tm_yday=54, tm_isdst=-1)
# 结构化时间--〉时间戳
tt=time.mktime(t)
print(tt) #打印:1487828734.0
案例:
时间戳和格式化 结构化时间的相互转换(用两种方法写)
例子:
计算时间差(用户输入起始时间和结束时间. 计算时间差(小时),
例如, 用户输入 2018-10-08 12:00:00 2018-10-08 14:30:00 输出 2 小时30分
方法一:
思路:格式化时间--〉结构化时间-->时间戳 然后时间戳相减,得到差值,将差值进行转为结构化时间输出
import time
a1="2018-10-08 12:00:00"
a2="2018-10-08 14:30:00"
t1=time.strptime(a1,"%Y-%m-%d %H:%M:%S") #格式化时间转换为结构化时间 time.strptime(string,format)
#print(t1) #time.struct_time(tm_year=2018, tm_mon=10, tm_mday=8, tm_hour=12, tm_min=0, tm_sec=0, tm_wday=0, tm_yday=281, tm_isdst=-1)
t2=time.strptime(a2,"%Y-%m-%d %H:%M:%S") #格式化时间转换为结构化时间 time.strptime(string,format)
#print(t2) #time.struct_time(tm_year=2018, tm_mon=10, tm_mday=8, tm_hour=14, tm_min=30, tm_sec=0, tm_wday=0, tm_yday=281, tm_isdst=-1) tt1=time.mktime(t1) #将结构化时间通过time.mktime() 转换为时间戳
# print(tt1) #1538971200.0
tt2=time.mktime(t2) #将结构化时间通过time.mktime() 转换为时间戳
# print(tt2) #1538980200.0
tt_new=int(abs(tt1-tt2)) #不知道=谁减去谁,直接一个abs()绝对值就可以了
# print(tt_new) #9000
tt_last=time.gmtime(tt_new) #在将时间戳转换为结构化时间(不要用time.localtime() 不然会有8小时的时区差)
print(tt_last) # time.struct_time(tm_year=1970, tm_mon=1, tm_mday=1, tm_hour=2, tm_min=30, tm_sec=0, tm_wday=3, tm_yday=1, tm_isdst=0)
print("时间差了%d年%d月%d天%d小时%d分钟%d秒" % (tt_last.tm_year-1970,tt_last.tm_mon-1, tt_last.tm_mday-1,tt_last.tm_hour, tt_last.tm_min, tt_last.tm_sec))
方法二:
思路:也是分别将给定的格式化时间转换为时间戳,然后将时间戳转换为结构化时间
import time
a1="2018-10-08 12:00:00"
a2="2018-10-08 14:30:00"
t1=time.strptime(a1,"%Y-%m-%d %H:%M:%S") #格式化时间转换为结构化时间 time.strptime(string,format)
t2=time.strptime(a2,"%Y-%m-%d %H:%M:%S") #格式化时间转换为结构化时间 time.strptime(string,format)
tt1=time.mktime(t1) #将结构化时间通过time.mktime() 转换为时间戳
tt2=time.mktime(t2) #将结构化时间通过time.mktime() 转换为时间戳
tt_new=int(abs(tt1-tt2)) #不知道谁减去谁,直接一个abs()绝对值就可以了
print(tt_new) #9000 这个是秒
tt_Hour=tt_new//3600
print(tt_Hour) #显示出:小时 2
tt_Min=int((tt_new-tt_Hour*3600)/60) #显示出来还剩下多少分钟
print(tt_Min) #显示出来分钟 30
print("时间差是%s小时%s分钟" % (tt_Hour,tt_Min))
⽇期格式化的标准:
%y 两位数的年份表示(00-99)
%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 当前时区的名称
%% %号本身
四:random 模块
import random #引入随机数模块
print(random.randint(1,9)) #1到9 随机产生 一个整数 (前闭后闭 可以取到9)
print(random.random()) #随机产生一个(0,1)之间的小树
print(random.choice([1,"张三",["李四","王五","赵四"]])) # 从这些元素中随机产生一个
print(random.sample([["","",""],"旺财","小白",123],2)) #2 代表从这些数据中随机产生2个出来组成,可也可以改成其他3等等 lst=[14,6,8,2,32,1,90,7]
random.shuffle(lst)
print(lst) #每次返回的数据都不一样。random对其顺序打乱了
lst的返回值为None
五:os模块(所有的和操作系统相关的内容都在os模块)
import os
os.makedirs("123/345") #可⽣成多层递归⽬录
os.removedirs("") #FileExistsError: [WinError 183] 当文件已存在时,无法创建该文件。: '123/345'
os.removedirs("123/345") #删除123文件夹下的345文件夹或则文件,如果文件夹下有其他文件,则无法进行删除操作
os.mkdir('') #生成单级目录;相当于shell中mkdir dirname
os.rmdir('') #删除单级空⽬录,若⽬录不为空则⽆法删除,报错;相当于shell中
print(os.listdir("../整理--day019 约束和异常处理/")) #返回指定的文件夹包含的文件或文件夹的名字的列表。这个列表以字母顺序
os.remove("123/234") #删除123文件夹下的234文件(或则文件夹) ,当234文件夹内有内容时,无法删除
os.rename("oldname","newname") 重命名⽂件/⽬录
os.stat('path/filename') 获取⽂件/⽬录信息
os.system("bash command") #运⾏shell命令,直接显示
os.popen("bash command").read() #运⾏shell命令,获取执⾏结果
os.getcwd() 获取当前⼯作⽬录,即当前python脚本⼯作的⽬录路径
os.chdir("dirname") 改变当前脚本⼯作⽬录;相当于shell下cd os.path
os.path.abspath(path) 返回path规范化的绝对路径
os.path.split(path) 将path分割成⽬录和⽂件名⼆元组返回
os.path.dirname(path) 返回path的⽬录。其实就是os.path.split(path)的第⼀个元素
os.path.basename(path) 返回path最后的⽂件名。如何path以/或\结尾,那么就会返回空值。
即os.path.split(path)的第⼆个元素
os.path.exists(path) 如果path存在,返回True;如果path不存在,返回False
os.path.isabs(path) 如果path是绝对路径,返回True
os.path.isfile(path) 如果path是⼀个存在的⽂件,返回True。否则返回False
os.path.isdir(path) 如果path是⼀个存在的⽬录,则返回True。否则返回False
os.path.join(path1[, path2[, ...]]) 将多个路径组合后返回,第⼀个绝对路径之前的参数
将被忽略
os.path.getatime(path) 返回path所指向的⽂件或者⽬录的最后访问时间
os.path.getmtime(path) 返回path所指向的⽂件或者⽬录的最后修改时间
os.path.getsize(path) 返回path的⼤⼩
# 特殊属性:
os.sep 输出操作系统特定的路径分隔符,win下为"\\",Linux下为"/"
os.linesep 输出当前平台使⽤的⾏终⽌符,win下为"\r\n",Linux下为"\n"
os.pathsep 输出⽤于分割⽂件路径的字符串 win下为;,Linux下为:
os.name 输出字符串指示当前使⽤平台。win->'nt'; Linux->'posix' os.stat() 属性解读:
stat 结构:
st_mode: inode 保护模式
st_ino: inode 节点号。
st_dev: inode 驻留的设备。
st_nlink: inode 的链接数。
st_uid: 所有者的⽤户ID。
st_gid: 所有者的组ID。
st_size: 普通⽂件以字节为单位的⼤⼩;包含等待某些特殊⽂件的数据。
st_atime: 上次访问的时间。
st_mtime: 最后⼀次修改的时间。
st_ctime: 由操作系统报告的"ctime"。在某些系统上(如Unix)是最新的元数据更改的时间,在
其它系统上(如Windows)是创建时间(详细信息参⻅平台的⽂档)。
六. sys模块
所有和python解释器相关的都在sys模块.
sys.argv 命令⾏参数List,第⼀个元素是程序本身路径
sys.exit(n) 退出程序,正常退出时exit(0),错误退出sys.exit(1)
sys.version 获取Python解释程序的版本信息
sys.path 返回模块的搜索路径,初始化时使⽤PYTHONPATH环境变量的值
sys.platform 返回操作系统平台名称
python学习之路---day21--模块和栈的更多相关文章
- Python学习之路12☞模块与包
一 模块 1.1 什么是模块? 一个模块就是一个包含了python定义和声明的文件,文件名就是模块名字加上.py的后缀. 1.2 为何要使用模块? 如果你退出python解释器然后重新进入,那么你之前 ...
- python学习之路-7 模块configparser/xml/shutil/subprocess以及面向对象初级入门
本篇记录内容 模块 configparser xml shutil subprocess 面向对象 面向对象基础 面向对象编程和函数式编程对比 面向对象中对象和类的关系 面向对象之构造方法 面向对象之 ...
- python学习之路-day2-pyth基础2
一. 模块初识 Python的强大之处在于他有非常丰富和强大的标准库和第三方库,第三方库存放位置:site-packages sys模块简介 导入模块 import sys 3 sys模 ...
- Python学习之路-Day2-Python基础3
Python学习之路第三天 学习内容: 1.文件操作 2.字符转编码操作 3.函数介绍 4.递归 5.函数式编程 1.文件操作 打印到屏幕 最简单的输出方法是用print语句,你可以给它传递零个或多个 ...
- Python学习之路-Day2-Python基础2
Python学习之路第二天 学习内容: 1.模块初识 2.pyc是什么 3.python数据类型 4.数据运算 5.bytes/str之别 6.列表 7.元组 8.字典 9.字符串常用操作 1.模块初 ...
- Python学习之路-Day1-Python基础
学习python的过程: 在茫茫的编程语言中我选择了python,因为感觉python很强大,能用到很多领域.我自己也学过一些编程语言,比如:C,java,php,html,css等.但是我感觉自己都 ...
- Python学习之路【第一篇】-Python简介和基础入门
1.Python简介 1.1 Python是什么 相信混迹IT界的很多朋友都知道,Python是近年来最火的一个热点,没有之一.从性质上来讲它和我们熟知的C.java.php等没有什么本质的区别,也是 ...
- Python学习之路——pycharm的第一个项目
Python学习之路——pycharm的第一个项目 简介: 上文中已经介绍如何安装Pycharm已经环境变量的配置.现在软件已经安装成功,现在就开始动手做第一个Python项目.第一个“Hello W ...
- python学习之路------你想要的都在这里了
python学习之路------你想要的都在这里了 (根据自己的学习进度后期不断更新哟!!!) 一.python基础 1.python基础--python基本知识.七大数据类型等 2.python基础 ...
随机推荐
- Web项目开发性能优化解决方案
web开发性能优化---安全篇 1.ip验证 2.操作日志.安全日志.登录日志 3.SQL注入校验 4.权限管理 5.验证规范(前端.后端.数据库约束) 2014-10-29 08:04 2773 ...
- 【更多教程关注公众号全要买】1-2 Disruptor与BlockingQueue压力测试性能对比
JDK所提供的BlockingQueue替换成Dis
- Quick Find
--------------------siwuxie095 Quick Find 这里介绍并查集的一种实现思路:Qui ...
- VBox 安装 Ubuntu Server 的那些坑,键盘乱码、网卡互连、共享目录等
1.更新,相信大家都是有强迫症的 sudo apt-get update sudo apt-get upgrade 出现错误:Could not open lock file /var/lib/dpk ...
- (字符串)ZigZag Conversion
[解析] 第一次看到这个题目的人,可能不知道ZigZag是什么意思,简单解释一下,就是把字符串原顺序012345……按下图所示排列: 发现所有行的重复周期都是 2 * nRows - 2 对于首行和末 ...
- 【Head First Java 读书笔记】(二)类与对象
前篇当中,代码都放在main()里面,那根本不是面向对象的做法. 椅子大战(对象如何改变你的一生) 程序规格: 在图形接口画出四方形,圆形和三角形,当用户点选图形时,图形需要顺时针转360度并依据形状 ...
- POJ3259 Wormholes(SPFA判断负环)
Description While exploring his many farms, Farmer John has discovered a number of amazing wormholes ...
- ToastUtils
public class ToastUtils { private static String TAG="ToastUtils"; private static Toast toa ...
- Android 画个电池出来(Paint和canvas)
1.Android中很多时候都要自己去画一个自定义控件出来,就需要用到Paint和Canvas这两个类. 2.效果图:
- sqlServer2008技术内幕笔记总结(实用的sql方法总结)
over函数的使用: 1.可以实现基于什么求和,省去group by: select xingming,xingbie,COUNT(*) over() as '总人数' from jbxx_xuesh ...