一丁频、標準庫 datetime
1.1 datetime
模塊
- 對日期、時間邑贴、時間戳的處理
1.2 datetime
類
- 類方法
a.today()
返回本地時區(qū)當前時間的datetime
對象
b.now(tz=None)
返回當前時間的datetime
對象席里,精確至微秒,若tz
為None
拢驾,返回同today()
c.utcnow()
沒有時區(qū)的當前時間
d.fromtimestamp(timestamp, tz=None)
從一個時間戳返回一個datetime
對象
1.3 datetime
對象
timestamp()
返回一個到微秒的時間戳
a. 時間戳:格林威治時間 1970 年 1 月 1 日 0 點到現(xiàn)在的秒數(shù)構(gòu)造方法
datetime.datetime(2020, 12, 6, 16, 29, 43, 79043)
year
奖磁、month
、day
繁疤、hour
咖为、minute
、second
嵌洼、microsecond
案疲,取datetime
對象的年月日時分秒及微秒weekday()
返回周幾,周一為0
麻养,周日為6
isoweekday()
返回周幾褐啡,周一為1
,周日為7
date()
返回日期date
對象time()
返回時間time
對象replace()
修改并返回新的時間isocalendar(0
返回一個三元組(年鳖昌,周數(shù)备畦,周幾)
1.4 日期格式化
類方法
strptime(date_string, format)
,返回datetime
對象對象方法
strftime(format)
许昨,返回字符串字符串
format
函數(shù)格式化
import datetime
dt = datetime.datetime.strptime("08/12/20 16:30", "%d/%m/%y %H:%M")
print(dt.strftime("%Y-%m-%d %H:%M:%S"))
print("{0:%Y}/{0:%m}/{0:%d} {0:%H}::{0:%H}::{0:%S}".format(dt))
print('{:%Y-%m-%d %H:%M:%S}'.format(dt))
示例.png
1.5 timedelta
對象
datetime2 = datetime1 + timedelta
datetime2 = datetime1 - timedelta
timedelta = datetime1 - datetime2
- 構(gòu)造方法
a.datetime.timedelta(days=0, seconds=0, microseconds=0, milliseconds=0, minutes=0, hours=0, weeks=0)
b.year = datetime.timedelta(days=365)
-
total_seconds()
返回時間差的總秒數(shù)
二懂盐、標準庫 time
2.1 time
-
time.sleep(secs)
將調(diào)用線程掛起指定的秒數(shù)
三、列表解析
3.1 舉例
- 生成一個列表糕档,元素 0 ~ 9莉恼,對每一個元素自增 1 后求平方返回新列表
lst = list(range(10))
newlst = list()
for i in lst:
newlst.append((i+1) ** 2)
print(newlst)
lst = list(range(10))
newlst = [ (i + 1) ** 2 for i in lst]
print(newlst)
示例.png
3.2 語法
[ 返回值 for 元素 in 可迭代對象 if 條件]
- 使用中括號
[]
,內(nèi)部是for
循環(huán)速那,if
條件語句可選 - 返回一個新列表
3.3 列表解析式是一種語法糖
- 編譯器會優(yōu)化俐银,不會因為簡寫而影響效率,反而因優(yōu)化提高了效率
- 減少程序員工作量端仰,減少出錯
- 簡化了代碼捶惜,但可讀性增強
3.4 舉例
- 獲取 10 以內(nèi)的偶數(shù),比較執(zhí)行效率
even = []
for i in range(10):
if i % 2 == 0:
even.append(i)
even = [ i for i in range(10) if i % 2 == 0]
示例.png
- 思考
-
有這樣的賦值語句
newlist = [print(i) for i in range(10)]
荔烧,請問打印出什么吱七?newlist
打印出來是什么汽久?
示例.png -
獲取 20 以內(nèi)的偶數(shù),若同時 3 的倍數(shù)也打印
[i for i in range(20) if i % 2 == 0 elif i % 3 ==0]
行么踊餐?
示例.png
-
四景醇、列表解析進階
4.1 [expr for item in iterable if cond1 if cond2]
- 等價于
ret = []
for item in iterable:
if cond1:
if cond2:
ret.appent(expr)
- 舉例
- 20 以內(nèi),既能被 2 整除又能被 3 整除的數(shù)
[i for i in range(20) if i %2 == 0 and i % 3 == 0] [i for i in range(20) if i 5 2 == 0 if i % 3 == 0]
示例.png
4.2 [expr for i in iteranle1 for j in iterable2]
- 等價于
ret = []
for i in iterable1:
for j in iterable2:
ret.append(expr)
- 舉例
[(x, y) for x in 'abcde' for y in range(3)] [[x, y] for x in 'abcde' for y in range(3)] [{x, y} for x in 'abced' for y in range(3)] # 集合是整個生成列表中的元素市袖,不會去重 [{x: y} for x in 'abced' for y in range(3)] # 字典與集合相同啡直,不會去重
示例.png
示例.png
示例.png
示例.png
4.4 請問下面 3 中輸出各是什么?為什么
[(i,j) for i in range(7) if i>4 for j in range(20,25) if j>23]
[(i,j) for i in range(7) for j in range(20,25) if i>4 if j>23]
[(i,j) for i in range(7) for j in range(20,25) if i>4 and j>23]
示例.png
五苍碟、列表解析練習
5.1 練習(要求使用列表解析式完成)
- 返回 1 - 10 平方的列表
[i ** 2 for i in range(11) if i > 0 ]
示例.png
- 有一個列表
lst = [1, 4, 9, 16, 2, 5, 10, 15]
酒觅,生成一個新列表,要求新列表元素是lst
相鄰 2 項的和
lst = [1, 4, 9, 16, 2, 5, 10, 15]
[lst[i] + lst[i+1] for i in range(len(lst)) if i < (len(lst)-1)]
示例.png
六微峰、生成器表達式 Generator expression
6.1 語法
(返回值 for 元素 in 可迭代對象 if 條件)
- 列表解析式中的括號換成小括號即可
- 返回一個生成器
示例.png
6.2 和列表解析式的區(qū)別
- 生成器表達式是 按需計算(或稱 惰性求值舷丹、延遲計算),需要的時候才計算值
- 列表解析式是立即返回值
示例.png
6.3 生成器
- 可迭代對象
- 迭代器
示例.png
6.4 舉例
g = ("{:04}".format(i) for i in range(1,11))
next(g)
for x in g:
print(x)
print('~~~~~~~~~~~~')
for x in g:
print(x)
- 列表對比
g = ["{:04}".format(i) for i in range(1,11)]
for x in g:
print(x)
print('~~~~~~~~~~~~')
for x in g:
print(x)
6.5 總結(jié)
-
生成器
- 延遲計算
- 返回迭代器蜓肆,可迭代
- 從前到后走完一遍颜凯,不能回頭
-
列表
- 立即計算
- 返回的不是迭代器,返回可迭代對象列表
- 從前導后走完一遍仗扬,可重新回頭迭代
6.6 習題
it = (print("{}".format(i+1)) for i in range(2))
first = next(it)
second = next(it)
val = first + second
-
val
的值是什么
print() 函數(shù)是立即返回症概,所以不論是 first 還是 second 的值都是 None
所以 val 的運算結(jié)果會拋異常
示例
-
val = first + second
語句之后能否再次next(it)
不可以 next() 了,因為此前的計數(shù)器是 range(2)早芭,程序已經(jīng)迭代兩次彼城,所以不可再次 next()
示例.png
it = (x for x in range(10) if x % 2)
first = next(it)
second = next(it)
val = first + second
-
val
的值是什么?
val 的值為 4
示例.png
-
val = first + second
語句后能否再次next(it)
因為此前計數(shù)器并未迭代完退个,所以可以繼續(xù) next() 調(diào)用
示例.png
6.7 和列表解析式的對比
- 計算方式
- 生成器表達式延遲計算募壕,列表解析式立即計算
- 內(nèi)存占用
- 單從返回值本身來說,生成器表達式
- 生成器沒有數(shù)據(jù)语盈,內(nèi)存占用極少舱馅,它是使用時一個個返回數(shù)據(jù),若將這些返回的數(shù)據(jù)合起來占用的內(nèi)存和列表解析式差不多刀荒,但是代嗤,它不需要立即占用這么多內(nèi)存
- 列表解析式構(gòu)造新的列表需要立即占用內(nèi)存,不管你是否立即使用這么多數(shù)據(jù)
- 計算速度
- 但看計算時間缠借,生成器表達式耗時非常短资溃,列表解析式耗時長
- 但生成器本身并沒有返回任何值,只返回了一個生成器對象
- 列表解析式構(gòu)造并返回了一個新的列表烈炭,所以開起來耗時了
七、集合解析式
7.1 語法
{ 返回值 for 元素 in 可迭代對象 if 條件 }
- 列表解析式的中括號換成大括號
{}
即可 - 立即返回一個集合
7.2 用法
{(x, x+1) for x in range(10)}
{[x] for x in range(10)}
八宝恶、字典解析式
8.1 語法
{ 返回值 for 元素 in 可迭代對象 if 條件 }
- 列表解析式中的括號換成大括號
{}
即可 - 使用
key:value
形式 - 立即返回一個字典
8.2 用法
{x:(x, x+1) for x in range(10)}
{x:[x, x+1] for x in range(10)}
{(x,):[x, x+1] for x in range(10)}
{[x]:[x, x+1] for x in range(10)}
{chr(0x41 +x):x**2 for x in range(10)}
{str(x):y for x in range(3) for y in range(4)}
- 等價于
ret = {}
for x in range(3):
for y in range(4):
ret[str(x)] = y
九符隙、總結(jié)
- Python 2 引入列表解析式
- Python 2.4 引入生成器表達式
- Python 3 引入集合趴捅、字典解析式,并遷移至 Python 2.7
- 一般來說霹疫,應該多應用解析式拱绑,簡短、高效
- 若一個解析式非常復雜丽蝎,難以讀懂猎拨,可考慮拆解成
for
循環(huán) - 生成器和迭代器是不同的對象,但都是可迭代對象
- 可迭代對象范圍更大屠阻,都可使用
for
循環(huán)遍歷