在内置数据类型(dict,list,set,tuple)的基础上,collections模块还提供了额外
的几个数据类型:Counter,deque,defaultdict,namedtuple和OrderedDict等
1.namedtuple:生成可以使用名字来访问元素内容的tuple
2.deque:双端队列,可以快速的从另外一侧追加和推出对象
3.Counter:计算器,主要用来计数
4.OrderredDict:有序字典
5.defaultdict:带有默认值的字典
因为元组的局限性:不能为元组内部的数据进行命名,所以往往我们并不知道一个元组所要表达的意义,所以在这里引入了 collections.namedtuple 这个工厂函数,来构造一个带字段名的元组。具名元组的实例和普通元组消耗的内存一样多,因为字段名都被存在对应的类里面。这个类跟普通的对象实例比起来也要小一些,因为 Python 不会用 __dict__ 来存放这些实例的属性。下面来看看具名元组的实例:
p = (1 , 2)
突兀的出现这么一个tuple大家就很难了解它到底想要表达什么东西,而这个时候namedtuple就派上用场了:
from collections import namedtuple point = namedtuple(‘point‘,[‘x‘,‘y‘]) p = point(1,2) print(p) >>>p.x out: 1 >>>p.y out: 2
加上一个‘x‘,‘y‘就很容易让人明白这是一个坐标
类似的,如果要用坐标和半径表示一个圆,也可以用namedtuple定义:
#namedtuple(‘名称‘, [属性list]): Circle = namedtuple(‘Circle‘, [‘x‘, ‘y‘, ‘r‘])
ps:书写规范
namedtuplr的小括号里 第一个是类名,第二个是类的各个字段的名字。后者可以是由数个字符串组成的可迭代对象,或者是由空格分隔开的字段名组成的字符串
对于list这种线性存储的数据类型,插入和删除元素就很慢,于是deque这种高效实现插入和删除操作的双向列表就问世了,它的出现对于队列和栈的操作提供了一大便利
from collections import deque q = deque([‘a‘,‘b‘,‘c‘]) q.append(1) q.appendleft(2) print(q)
out: deque([2, ‘a‘, ‘b‘, ‘c‘, 1])
""" 队列不应该支持任意位置插值 只能在首尾插值(不能插队) """ q.insert(0, ‘哈哈哈‘) print(q) out: deque([‘哈哈哈‘, 2, ‘a‘, ‘b‘, ‘c‘, 1])
print(q.pop()) # 弹出右边第一个元素 out: 1 print(q.popleft()) # 弹出左边第一个元素 out: 哈哈哈
很多人认为python中的字典是无序的,因为它是按照hash来存储的,但是python中有个模块collections(英文,收集、集合),里面自带了一个子类
OrderedDict,实现了对字典对象中元素的排序。请看下面的实例:
from collections import OrderedDict print(‘Regular dictionary‘) d={} d[‘a‘]=‘A‘ d[‘b‘]=‘B‘ d[‘c‘]=‘C‘ for k,v in d.items(): print(k,v) print( "\nOrder dictionary") d1 =OrderedDict() d1[‘a‘] = ‘A‘ d1[‘b‘] = ‘B‘ d1[‘c‘] = ‘C‘ d1[‘1‘] = ‘1‘ d1[‘2‘] = ‘2‘ for k,v in d1.items(): print(k,v) out: Regular dictionary a A c C b B Order dictionary a A b B c C 1 1 2 2
可以看到,同样是保存了ABC等几个元素,但是使用OrderedDict会根据放入元素的先后顺序进行排序。所以输出的值是排好序的。
注意,OrderedDict
的Key会按照插入的顺序排列,不是Key本身排序:
d = OrderedDict() d[‘z‘] = 1 d[‘y‘] = 2 d[‘x‘] = 3 d.keys() # 按照插入的Key的顺序返回 [‘z‘, ‘y‘, ‘x‘]
当我使用普通的字典时,用法一般是dict={},添加元素的只需要dict[element] =value即,调用的时候也是如此,dict[element] = xxx,但前提是element字典里,如果不在字典里就会报错,如:
这时defaultdict就能派上用场了,defaultdict的作用是在于,当字典里的key不存在但被查找时,返回的不是keyError而是一个默认值.来看个例子:
from collections import defaultdict s = [(‘yellow‘, 1), (‘blue‘, 2), (‘yellow‘, 3), (‘blue‘, 4), (‘red‘, 1)] d = defaultdict(list) for k, v in s: d[k].append(v) print(list(d.items()))
输出:
表示时间的三种方式
在Python中,通常有这三种方式来表示时间:时间戳、元组(struct_time)、格式化的时间字符串:
(1)时间戳(timestamp) :通常来说,时间戳表示的是从1970年1月1日00:00:00开始按秒计算的偏移量。我们运行“type(time.time())”,返回的是float类型。
(2)格式化的时间字符串(Format String): ‘1999-12-06’
1.time.sleep(secs) 线程推迟指定的时间运行 适合放在脚本里,定时sleep一会然后继续干啥 while True: time.sleep(3) print time.strftime(‘%H:%M:%S‘) 17:21:35 17:21:38 17:21:41 17:21:44 …… 2.time.localtime([secs]) 将一个时间戳转换成一个当前时区的struct_time,如果seconds参数未输入,则以当前时间为转换标准 未提供secs参数时,按当前时间为准 In : time.localtime() Out: time.struct_time(tm_year=2014, tm_mon=8, tm_mday=14, tm_hour=17, tm_min=23, tm_sec=48, tm_wday=3, tm_yday=226, tm_isdst=0) 提供secs为当前时间戳时 In : time.time() Out: 1408008232.217969 In : time.localtime(time.time()) Out: time.struct_time(tm_year=2014, tm_mon=8, tm_mday=14, tm_hour=17, tm_min=24, tm_sec=2, tm_wday=3, tm_yday=226, tm_isdst=0) 3.time.strftime(format[, t]) 将指定的struct_time(默认为当前时间),根据指定的格式化字符串输出 t未指定,传入time.localtime()作为默认参数: In : time.strftime(‘%Y-%m-%d %H:%M:%S‘) Out: ‘2014-08-14 17:28:16’ 指定t为time.localtime(1407945600.0)时: In : time.localtime(1407945600.0) Out: time.struct_time(tm_year=2014, tm_mon=8, tm_mday=14, tm_hour=0, tm_min=0, tm_sec=0, tm_wday=3, tm_yday=226, tm_isdst=0) In : time.strftime(‘%Y-%m-%d %H:%M:%S‘,time.localtime(1407945600.0)) Out: ‘2014-08-14 00:00:00’ 4.time.time() 返回当前时间的时间戳 In : time.time() Out: 1408008711.730218 5.time.mktime(t) 将一个struct_time转换为时间戳,如下time.localtime接收一个时间戳返回一个struct_time,而time.mktime接收一个struct_time,返回一个时间戳 In : time.localtime(1407945600.0) Out: time.struct_time(tm_year=2014, tm_mon=8, tm_mday=14, tm_hour=0, tm_min=0, tm_sec=0, tm_wday=3, tm_yday=226, tm_isdst=0) In : time.mktime(time.localtime(1407945600.0)) Out: 1407945600.0
datetime模块常用的主要有下面这四个类: 1. datetime.date: 是指年月日构成的日期(相当于日历) 2. datetime.time: 是指时分秒微秒构成的一天24小时中的具体时间(相当于手表) 3. datetime.datetime: 上面两个合在一起,既包含时间又包含日期 4. datetime.timedelta: 时间间隔对象(timedelta)。一个时间点(datetime)加上一个时间间隔(timedelta)可以得到一个新的时间点(datetime)。比如今天的上午3点加上5个小时得到今天的上午8点。同理,两个时间点相减会得到一个时间间隔。 1.datetime.date 类 1.新建一个date对象,日期为今天,既可以直接调用datetime.date.today(),也可以直接向datetime.date()传值,如下: In : today = datetime.date.today() In : today Out: datetime.date(2014, 8, 15) In : t = datetime.date(2014,8,15) In : t Out: datetime.date(2014, 8, 15) 2.datetime.date.strftime(format) 格式化为需要的时间,如常用的 “年-月-日 小时:分钟:秒” 格式 In : today.strftime(‘%Y-%m-%d %H:%M:%S‘) Out: ‘2014-08-15 00:00:00’ date对象中小时、分钟、秒默认都是0,纪元年的那个时间 3.datetime.date.timple() 转成struct_time格式,这样传递给time.mktime(t) 后,直接转成时间戳格式 In : today.timetuple() Out: time.struct_time(tm_year=2014, tm_mon=8, tm_mday=15, tm_hour=0, tm_min=0, tm_sec=0, tm_wday=4, tm_yday=227, tm_isdst=-1) In : time.mktime(today.timetuple()) Out: 1408032000.0 4.datetime.date.replace(year, month, day) 返回一个替换后的date对象 In : today.replace(year=2013) Out: datetime.date(2013, 8, 15) 5.datetime.date.fromtimestamp(timestamp) 将时间戳转化为date对象 In : datetime.date.fromtimestamp(1408058729) Out: datetime.date(2014, 8, 15) 2.datetime.time 类 1.新建一个time对象 In : t Out: datetime.time(8, 45, 20) 2.datetime.time.(format)格式化输出 In : t.strftime(‘%Y-%m-%d %H:%M:%S‘) Out: ‘1900-01-01 08:45:20’ time对应的年、月、日为1900、01、01,纪元年的那个时间 3.datetime.time.replace([hour[, minute[, second[, microsecond[, tzinfo]]]]]) 返回一个替换后的time对象 In : t.replace(hour=9) Out: datetime.time(9, 45, 20) 3.datetime.datetime类 1.新建一个datetime对象,日期为今天,既可以直接调用datetime.datetime.today(),也可以直接向datetime.datetime()传值,如下: In : d1 = datetime.datetime.today() In : d1 Out: datetime.datetime(2014, 8, 15, 8, 12, 34, 790945) In : d2 = datetime.datetime(2014, 8, 15, 8, 12, 34, 790945) In : d2 Out: datetime.datetime(2014, 8, 15, 8, 12, 34, 790945) 2.datetime.datetime.now([tz]) 当不指定时区时,和datetime.datetime.today()是一样的结果,如下 In : datetime.datetime.now() Out: datetime.datetime(2014, 8, 15, 8, 14, 50, 738672) 3..datetime.datetime.strftime(format) 格式化为需要的时间,如常用的 “年-月-日 小时:分钟:秒” 格式 In : d1 Out: datetime.datetime(2014, 8, 15, 8, 12, 34, 790945) In : d1.strftime(‘%Y-%m-%d %H:%M:%S‘) Out: ‘2014-08-15 08:12:34’ 4.datetime.datetime.timple() 转成struct_time格式,这样传递给time.mktime(t) 后,直接转成时间戳格式 In : d1 Out: datetime.datetime(2014, 8, 15, 8, 12, 34, 790945) In : d1.timetuple() Out: time.struct_time(tm_year=2014, tm_mon=8, tm_mday=15, tm_hour=8, tm_min=12, tm_sec=34, tm_wday=4, tm_yday=227, tm_isdst=-1) In : time.mktime(d1.timetuple()) Out: 1408061554.0 5.datetime.datetime.replace(year, month, day) 返回一个替换后的date对象 In : d1 Out: datetime.datetime(2014, 8, 15, 8, 12, 34, 790945) In : d1.replace(year=2000) Out: datetime.datetime(2000, 8, 15, 8, 12, 34, 790945) 6.datetime.datetime.fromtimestamp(timestamp) 将时间戳转化为datetime对象 In : time.time() Out: 1408061894.081552 In : datetime.datetime.fromtimestamp(1408061894) Out: datetime.datetime(2014, 8, 15, 8, 18, 14) 4.datetime.timedelta类 时间的加减法用,如下: In : today = datetime.datetime.today() In : yesterday = today - datetime.timedelta(days=1) In : yesterday Out: datetime.datetime(2014, 8, 14, 15, 8, 25, 783471) In : today Out: datetime.datetime(2014, 8, 15, 15, 8, 25, 783471)
几种格式之间的转换
random模块用于生成随机数,废话不多说,下面介绍几个随机数的常用方法:
import random #随机小数 random.random() # 大于0且小于1之间的小数 out: 0.7664338663654585 random.uniform(1,3) #大于1小于3的小数 out: 1.6270147180533838 #随机整数 random.randint(1,5) # 大于等于1且小于等于5之间的整数 random.randrange(1,10,2) # 大于等于1且小于10之间的奇数 #随机选择一个返回 random.choice([1,‘23‘,[4,5]]) # #1或者23或者[4,5] #随机选择多个返回,返回的个数为函数的第二个参数 random.sample([1,‘23‘,[4,5]],2) # #列表元素任意2个组合 out: [[4, 5], ‘23‘] #打乱列表顺序 item=[1,3,5,7,9] random.shuffle(item) # 打乱次序 item out: [5, 1, 3, 7, 9] random.shuffle(item) item out: [5, 9, 7, 1, 3]
小练习:
""" 大写字母 小写字母 数字 5位数的随机验证码 提示: chr random.choice 封装成一个函数,用户想生成几位就生成几位 """ def get_code(n): code = ‘‘ for i in range(n): # 先生成随机的大写字母 小写字母 数字 upper_str = chr(random.randint(65,90)) lower_str = chr(random.randint(97,122)) random_int = str(random.randint(0,9)) # 从上面三个中随机选择一个作为随机验证码的某一位 code += random.choice([upper_str,lower_str,random_int]) return code res = get_code(4) print(res)
os模块是与操作系统交互的一个接口
sys模块是与python解释器交互的一个接口
原文:https://www.cnblogs.com/linxidong/p/11207960.html