编程教育资源分享平台

网站首页 > 后端开发 正文

Python程序开发入门(第五章)字典(Dictionary)及日期和时间

luoriw 2024-02-01 14:23:47 后端开发 10 ℃ 0 评论

第五章

Python字典(Dictionary)及日期和时间

5.1 Python字典(Dictionary)

Python字典是另一种可变容器模型,且可存储任意类型对象。字典的每个键值 key=>value 对用冒号:分割,每个键值对之间用逗号,分割,整个字典包括在花括号{}中 ,格式如下所示:

d = {key1 : value1, key2 : value2 }

键一般是唯一的,如果重复最后的一个键值对会替换前面的,值不需要唯一。

>>> dict = {'a': 1, 'b': 2, 'b': '3'}

>>> dict['b']

'3'

>>> dict

{'a': 1, 'b': '3'}

值可以取任何数据类型,但键必须是不可变的,如字符串,数字或元组。

一个简单的字典实例:

dict = {'Alice': '2341', 'Beth': '9102', 'Cecil': '3258'}

也可如此创建字典:

dict1 = { 'abc': 456 } dict2 = { 'abc': 123, 98.6: 37 }

5.1.1 访问字典里的值

把相应的键放入熟悉的方括弧,如下实例:

#!/usr/bin/python

dict = {'Name': 'Zara', 'Age': 7, 'Class': 'First'}

print ("dict['Name']: ", dict['Name'])

print ("dict['Age']: ", dict['Age'])

以上实例输出结果:

dict['Name']: Zara

dict['Age']: 7

如果用字典里没有的键访问数据,会输出错误如下:

#!/usr/bin/python

dict = {'Name': 'Zara', 'Age': 7, 'Class': 'First'}

print ("dict['Alice']: ", dict['Alice'])

以上实例输出结果:

dict['Alice']:

Traceback (most recent call last):

File "test.py", line 5, in <module>

print "dict['Alice']: ", dict['Alice']

KeyError: 'Alice'

5. 1.2 修改字典

向字典添加新内容的方法是增加新的键/值对,修改或删除已有键/值对如下实例:

#!/usr/bin/python

dict = {'Name': 'Zara', 'Age': 7, 'Class': 'First'}

dict['Age'] = 8 # 更新

dict['School'] = "RUNOOB" # 添加

print ("dict['Age']: ", dict['Age'])

print ("dict['School']: ", dict['School'])

以上实例输出结果:

dict['Age']: 8

dict['School']: RUNOOB

5. 1.3 删除字典元素

能删单一的元素也能清空字典,清空只需一项操作。显示删除一个字典用del命令,如下实例:

#!/usr/bin/python

# -*- coding: UTF-8 -*-

dict = {'Name': 'Zara', 'Age': 7, 'Class': 'First'}

del dict['Name'] # 删除键是'Name'的条目

dict.clear() # 清空字典所有条目

del dict # 删除字典

print ("dict['Age']: ", dict['Age'])

print ("dict['School']: ", dict['School'])

但这会引发一个异常,因为用del后字典不再存在:

dict['Age']:

Traceback (most recent call last):

File "test.py", line 8, in <module>

print "dict['Age']: ", dict['Age']

TypeError: 'type' object is unsubscriptable

(注:del()方法后面也会讨论。)

5. 1.4 字典键的特性

字典值可以没有限制地取任何python对象,既可以是标准的对象,也可以是用户定义的,但键不行。

两个重要的点需要记住:

(1)不允许同一个键出现两次。创建时如果同一个键被赋值两次,后一个值会被记住,如下实例:

#!/usr/bin/python

dict = {'Name': 'Zara', 'Age': 7, 'Name': 'Manni'}

print ("dict['Name']: ", dict['Name'])

以上实例输出结果:

dict['Name']: Manni

(2)键必须不可变,所以可以用数字,字符串或元组充当,所以用列表就不行,如下实例:

#!/usr/bin/python

dict = {['Name']: 'Zara', 'Age': 7}

print ("dict['Name']: ", dict['Name'])

以上实例输出结果:

Traceback (most recent call last):

File "test.py", line 3, in <module>

dict = {['Name']: 'Zara', 'Age': 7}

TypeError: list objects are unhashable

5. 1.5 字典内置函数&方法

Python字典包含了以下内置函数:

序号

函数及描述

1

cmp(dict1, dict2) 比较两个字典元素。

2

len(dict) 计算字典元素个数,即键的总数。

3

str(dict) 输出字典可打印的字符串表示。

4

type(variable) 返回输入的变量类型,如果变量是字典就返回字典类型。

Python字典包含了以下内置方法:

序号

函数及描述

1

dict.clear() 删除字典内所有元素

2

dict.copy() 返回一个字典的浅复制

3

dict.fromkeys(seq[, val]) 创建一个新字典,以序列 seq 中元素做字典的键,val 为字典所有键对应的初始值

4

dict.get(key, default=None) 返回指定键的值,如果值不在字典中返回default值

5

dict.has_key(key)
如果键在字典dict里返回true,否则返回false

6

dict.items() 以列表返回可遍历的(键, 值) 元组数组

7

dict.keys() 以列表返回一个字典所有的键

8

dict.setdefault(key, default=None)
和get()类似, 但如果键不存在于字典中,将会添加键并将值设为default

9

dict.update(dict2) 把字典dict2的键/值对更新到dict里

10

dict.values() 以列表返回字典中的所有值

11

pop(key[,default]) 删除字典给定键 key 所对应的值,返回值为被删除的值。key值必须给出。 否则,返回default值。

12

popitem() 返回并删除字典中的最后一对键和值。

5. 2 python日期和时间

Python 程序能用很多方式处理日期和时间,转换日期格式是一个常见的功能。Python 提供了一个 time 和 calendar 模块可以用于格式化日期和时间,时间间隔是以秒为单位的浮点小数,每个时间戳都以自从1970年1月1日午夜(历元)经过了多长时间来表示,但最长不能超过2038年。

5. 2.1 Time(时间) 模块

Time 模块包含了以下内置函数,既有时间处理的,也有转换时间格式的:

序号

函数及描述

1

time.altzone
返回格林威治西部的夏令时地区的偏移秒数。如果该地区在格林威治东部会返回负值(如西欧,包括英国)。对夏令时启用地区才能使用。

2

time.asctime([tupletime])
接受时间元组并返回一个可读的形式为"Tue Dec 11 18:07:14 2008"(2008年12月11日 周二18时07分14秒)的24个字符的字符串。

3

time.clock( )
用以浮点数计算的秒数返回当前的CPU时间。用来衡量不同程序的耗时,比time.time()更有用。

4

time.ctime([secs])
作用相当于asctime(localtime(secs)),未给参数相当于asctime()

5

time.gmtime([secs])
接收时间戳(1970纪元后经过的浮点秒数)并返回格林威治天文时间下的时间元组t。注:t.tm_isdst始终为0

6

time.localtime([secs])
接收时间戳(1970纪元后经过的浮点秒数)并返回当地时间下的时间元组t(t.tm_isdst可取0或1,取决于当地当时是不是夏令时)。

7

time.mktime(tupletime)
接受时间元组并返回时间戳(1970纪元后经过的浮点秒数)。

8

time.sleep(secs)
推迟调用线程的运行,secs指秒数。

9

time.strftime(fmt[,tupletime])
接收以时间元组,并返回以可读字符串表示的当地时间,格式由fmt决定。

10

time.strptime(str,fmt='%a %b %d %H:%M:%S %Y')
根据fmt的格式把一个时间字符串解析为时间元组。

11

time.time( )
返回当前时间的时间戳(1970纪元后经过的浮点秒数)。

12

time.tzset()
根据环境变量TZ重新初始化时间相关设置。

Time模块包含了以下2个非常重要的属性:

序号

属性及描述

1

time.timezone
属性 time.timezone 是当地时区(未启动夏令时)距离格林威治的偏移秒数(>0,美洲<=0大部分欧洲,亚洲,非洲)。

2

time.tzname
属性time.tzname包含一对根据情况的不同而不同的字符串,分别是带夏令时的本地时区名称,和不带的。

5. 2.1.1 altzone()函数

函数返回格林威治西部的夏令时地区的偏移秒数。如果该地区在格林威治东部会返回负值(如西欧,包括英国)。对夏令时启用地区才能使用。

altzone()方法语法:

time.altzone

以下实例展示了 altzone()函数的使用方法:

#!/usr/bin/python

# -*- coding: GBK -*-

import time

print ("time.altzone %d " % time.altzone)

以上实例输出结果为:

time.altzone -32400

5. 2.1.2 asctime ()(获取格式化的时间函数)

我们可以根据需求选取各种时间格式,但是最为简单获取可读的时间模式的函数是asctime():

实例

#!/usr/bin/python

# -*- coding: GBK -*-

import time

localtime = time.asctime( time.localtime(time.time()) )

print("本地时间为 :", localtime)

以上实例输出结果:

本地时间为 : Mon Nov 29 09:38:45 2021

5. 2.1.3 clock() 函数

Python 3.8 已移除 clock() 方法 可以使用 time.perf_counter() 或 time.process_time() 方法替代。

Python time.clock() 函数以浮点数计算的秒数返回当前的CPU时间。用来衡量不同程序的耗时,比time.time()更有用。

这个需要注意,在不同的系统上含义不同。在UNIX系统上,它返回的是"进程时间",它是用秒表示的浮点数(时间戳)。而在WINDOWS中,第一次调用,返回的是进程运行的实际时间。而第二次之后的调用是自第一次调用以后到现在的运行时间。(实际上是以WIN32上QueryPerformanceCounter()为基础,它比毫秒表示更为精确)

clock()方法语法:

time.clock()

该函数有两个功能:在第一次调用的时候,返回的是程序运行的实际时间;以第二次之后的调用,返回的是自第一次调用后,到这次调用的时间间隔。在win32系统下,这个函数返回的是真实时间(wall time),而在Unix/Linux下返回的是CPU时间。

以下实例展示了 clock()函数的使用方法:

实例

#!/usr/bin/python

import time

def procedure():

time.sleep(2.5)

# measure process time

t0 = time.clock()

procedure()

print (time.clock() - t0, "seconds process time")

# measure wall time

t0 = time.time()

procedure()

print (time.time() - t0, "seconds wall time")

以上实例输出结果为:

2.4992738537751906 seconds process time

2.500143051147461 seconds wall time

5. 2.1.4 ctime() 函数

Time.ctime() 函数把一个时间戳(按秒计算的浮点数)转化为time.asctime()的形式。如果参数未给或者为None的时候,将会默认time.time()为参数。它的作用相当于asctime(localtime(secs))。

ctime()方法语法:

time.ctime([ sec ])

参数sec -- 要转换为字符串时间的秒数。

以下实例展示了 ctime() 函数的使用方法:

#!/usr/bin/python

# -*- coding: GBK -*-

import time

print ("time.ctime() : %s" % time.ctime())

以上实例输出结果为:

time.ctime() : Mon Nov 29 14:00:24 2021

5. 2.1.5 gmtime()

Time.gmtime() 函数将一个时间戳转换为UTC时区(0时区)的struct_time,可选的参数sec表示从1970-1-1以来的秒数。其默认值为time.time(),函数返回time.struct_time类型的对象。(struct_time是在time模块中定义的表示时间的对象)。

gmtime()方法语法:

time.gmtime([ sec ])

参数sec -- 转换为time.struct_time类型的对象的秒数。

以下实例展示了 gmtime() 函数的使用方法:

#!/usr/bin/python

# -*- coding: GBK -*-

import time

print ("time.gmtime() : ",time.gmtime())

以上实例输出结果为:

time.gmtime(): time.struct_time(tm_year=2021, tm_mon=11, tm_mday=29, tm_hour=6,

tm_min=14, tm_sec=9, tm_wday=0, tm_yday=333, tm_isdst=0)

5. 2.1.6 localtime()(获取当前时间函数)

从返回浮点数的时间戳方式向时间元组转换,只要将浮点数传递给如localtime之类的函数。

实例

#!/usr/bin/python

# -*- coding: GBK -*-

import time

localtime = time.localtime(time.time())

print ("本地时间为 :", localtime)

以上实例输出结果:

本地时间为 : time.struct_time(tm_year=2021, tm_mon=11, tm_mday=29, tm_hour=9, tm

_min=33, tm_sec=26, tm_wday=0, tm_yday=333, tm_isdst=0)

5. 2.1.7 mktime()

Time.mktime() 函数执行与gmtime(), localtime()相反的操作,它接收struct_time对象作为参数,返回用秒数来表示时间的浮点数。

如果输入的值不是一个合法的时间,将触发 OverflowError 或 ValueError。

mktime()方法语法:

time.mktime(t)

参数t -- 结构化的时间或者完整的9位元组元素。

返回值:返回用秒数来表示时间的浮点数。

以下实例展示了 mktime() 函数的使用方法:

实例

#!/usr/bin/python

import time

t = (2009, 2, 17, 17, 3, 38, 1, 48, 0)

secs = time.mktime( t )

print ("time.mktime(t) : %f" % secs)

print ("asctime(localtime(secs)): %s" % time.asctime(time.localtime(secs)))

以上实例输出结果为:

time.mktime(t) : 1234861418.000000

asctime(localtime(secs)): Tue Feb 17 17:03:38 2009

5. 2.1.8 sleep()函数

Time.sleep() 函数推迟调用线程的运行,可通过参数secs指秒数,表示进程挂起的时间。

sleep()方法语法:

time.sleep(t)

参数t -- 推迟执行的秒数。

以下实例展示了 sleep() 函数的使用方法:

#!/usr/bin/python

import time

print ("Start : %s" % time.ctime())

time.sleep( 5 ) #上面执行完后,暂停5秒,再执行下面操作

print ("End : %s" % time.ctime())

以上实例输出结果为:

Start : %s Mon Nov 29 14:22:17 2021

End : %s Mon Nov 29 14:22:22 2021

5. 2.1.9 strftime()(格式化日期函数)

我们可以使用time.strftime(format[, t])方法来格式化日期:

实例

#!/usr/bin/python

# -*- coding: UTF-8 -*-

import time # 格式化成2021-11-29 09:46:45形式

print (time.strftime("%Y-%m-%d %H:%M:%S", time.localtime())) # 格式化成Mon Nov 29 09:46:45 2021形式

print (time.strftime("%a %b %d %H:%M:%S %Y", time.localtime())) # 将格式字符串转换为时间戳

a = "Mon Nov 29 09:46:45 2021"

print (time.mktime(time.strptime(a,"%a %b %d %H:%M:%S %Y")))

以上实例输出结果:

2021-11-29 09:46:45

Mon Nov 29 09:46:45 2021

1638149925.0

5. 2.1.10 strptime

Time.strptime() 函数根据指定的格式把一个时间字符串解析为时间元组。

strptime()方法语法:

time.strptime(string[, format])

参数:

string -- 时间字符串。

format -- 格式化字符串。

返回值:

返回struct_time对象。

以下实例展示了 strptime() 函数的使用方法:

#!/usr/bin/python

# -*- coding: GBK -*-

import time

struct_time = time.strptime("30 Nov 00", "%d %b %y")

print ("返回的元组: " , struct_time)

以上实例输出结果为:

返回的元组: time.struct_time(tm_year=2000, tm_mon=11, tm_mday=30, tm_hour=0, tm_min=0, tm_sec=0, tm_wday=3, tm_yday=335, tm_isdst=-1)

python中用于时间日期格式化符号:

格式化符号

实现功能

%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

当前时区的名称

%%

%号本身

5. 2.1.11 time()(获取当前时间戳函数)

Python 的 time 模块下有很多函数可以转换常见日期格式。如函数time.time()用于获取当前时间戳, 如下实例:

#!/usr/bin/python

# -*- coding: GBK -*-

import time # 引入time模块

ticks = time.time()

print ("当前时间戳为:", ticks)

上面实例输出结果:

当前时间戳为: 1638149010.1856701

时间戳单位最适于做日期运算。但是1970年之前的日期就无法以此表示了。超过2038年的日期也不行,因为目前UNIX和Windows只支持到2038年。

很多Python函数用一个元组装起来的9组数字处理时间:

序号

字段

0

4位数年

2008

1

1 到 12

2

1到31

3

小时

0到23

4

分钟

0到59

5

0到61 (60或61 是闰秒)

6

一周的第几日

0到6 (0是周一)

7

一年的第几日

1到366 (儒略历)

8

夏令时

-1, 0, 1, -1是决定是否为夏令时的旗帜

上述也就是struct_time元组。这种结构具有如下属性:

序号

属性

0

tm_year

2008

1

tm_mon

1 到 12

2

tm_mday

1 到 31

3

tm_hour

0 到 23

4

tm_min

0 到 59

5

tm_sec

0 到 61 (60或61 是闰秒)

6

tm_wday

0到6 (0是周一)

7

tm_yday

1 到 366(儒略历)

8

tm_isdst

-1, 0, 1, -1是决定是否为夏令时的旗帜

5. 2.1.12 time.tzset()

Time.tzset() 根据环境变量TZ重新初始化时间相关设置。标准TZ环境变量格式:

std offset [dst [offset [,start[/time], end[/time]]]]

参数:

  • std 和 dst:三个或者多个时间的缩写字母。传递给 time.tzname.
  • offset: 距UTC的偏移,格式: [+|-]hh[:mm[:ss]] {h=0-23, m/s=0-59}。
  • start[/time], end[/time]: DST 开始生效时的日期。格式为 m.w.d — 代表日期的月份、周数和日期。w=1 指月份中的第一周,而 w=5 指月份的最后一周。'start' 和 'end' 可以是以下格式之一:Jn: 儒略日 n (1 <= n <= 365)。闰年日(2月29)不计算在内。n: 儒略日 (0 <= n <= 365)。 闰年日(2月29)计算在内Mm.n.d: 日期的月份、周数和日期。w=1 指月份中的第一周,而 w=5 指月份的最后一周。time:(可选)DST 开始生效时的时间(24 小时制)。默认值为 02:00(指定时区的本地时间)。

语法: time.tzset()

以下实例展示了 tzset() 函数的使用方法:

#!/usr/bin/python

# -*- coding: UTF-8 -*-

import time

import os

os.environ['TZ'] = 'EST+05EDT,M4.1.0,M10.5.0'

time.tzset()

print time.strftime('%X %x %Z')

os.environ['TZ'] = 'AEST-10AEDT-11,M10.5.0,M3.5.0'

time.tzset()

print time.strftime('%X %x %Z')

以上实例输出结果为:

13:00:40 02/17/09 EST

05:00:40 02/18/09 AEDT

5. 2.2 Calendar 模块(获取某月日历函数)

此模块的函数都是与日历相关的,例如打印某月的字符月历。星期一是默认的每周第一天,星期天是默认的最后一天。更改设置需调用calendar.setfirstweekday()函数。模块包含了以下内置函数:

序号

函数及描述

1

calendar.calendar(year,w=2,l=1,c=6)
返回一个多行字符串格式的year年年历,3个月一行,间隔距离为c。 每日宽度间隔为w字符。每行长度为21* W+18+2* C。l是每星期行数。

2

calendar.firstweekday( )
返回当前每周起始日期的设置。默认情况下,首次载入 calendar 模块时返回 0,即星期一。

3

calendar.isleap(year)

是闰年返回 True,否则为 False。

>>> import calendar

>>> print(calendar.isleap(2000))

True

>>> print(calendar.isleap(1900))

False

4

calendar.leapdays(y1,y2)
返回在Y1,Y2两年之间的闰年总数。

5

calendar.month(year,month,w=2,l=1)
返回一个多行字符串格式的year年month月日历,两行标题,一周一行。每日宽度间隔为w字符。每行的长度为7* w+6。l是每星期的行数。

6

calendar.monthcalendar(year,month)
返回一个整数的单层嵌套列表。每个子列表装载代表一个星期的整数。Year年month月外的日期都设为0;范围内的日子都由该月第几日表示,从1开始。

7

calendar.monthrange(year,month)
返回两个整数。第一个是该月的星期几的日期码,第二个是该月的日期码。日从0(星期一)到6(星期日);月从1到12。

8

calendar.prcal(year,w=2,l=1,c=6)
相当于 print calendar.calendar(year,w=2,l=1,c=6)

9

calendar.prmonth(year,month,w=2,l=1)
相当于 print calendar.month(year,month,w=2,l=1)

10

calendar.setfirstweekday(weekday)
设置每周的起始日期码。0(星期一)到6(星期日)。

11

calendar.timegm(tupletime)
和time.gmtime相反:接受一个时间元组形式,返回该时刻的时间戳(1970纪元后经过的浮点秒数)。

12

calendar.weekday(year,month,day)
返回给定日期的日期码。0(星期一)到6(星期日)。月份为 1(一月) 到 12(12月)。

Calendar模块有很广泛的方法用来处理年历和月历,例如打印某月的月历:

#!/usr/bin/python

# -*- coding: GBK -*-

import calendar

cal = calendar.month(2021, 1)

print ("以下输出2021年1月份的日历:")

print (cal)

以上实例输出结果:

以下输出2021年1月份的日历:

January 2021

Mo Tu We Th Fr Sa Su

1 2 3

4 5 6 7 8 9 10

11 12 13 14 15 16 17

18 19 20 21 22 23 24

25 26 27 28 29 30 31

Tags:

本文暂时没有评论,来添加一个吧(●'◡'●)

欢迎 发表评论:

最近发表
标签列表
最新留言