標(biāo)準(zhǔn)庫(kù)
datetime模塊
對(duì)日期隧哮、時(shí)間桶良、時(shí)間戳的處理
-
datetime類
-
類方法:
today():返回本地時(shí)區(qū)當(dāng)前時(shí)間的datetime對(duì)象
now(tz=None):返回當(dāng)前時(shí)間的datetime對(duì)象,時(shí)間到微秒沮翔,如果tz為None陨帆,返回和today()一樣
utcnow():沒有時(shí)區(qū)的當(dāng)前時(shí)間(國(guó)際化的時(shí)候建議用這個(gè))
fromtimestamp(timestamp , tz = None) 從一個(gè)時(shí)間戳返回一個(gè)datetime對(duì)象
-
datetime對(duì)象
- timestamp():返回一個(gè)到微秒的時(shí)間戳
- 時(shí)間戳:格林威治時(shí)間1970年1月1日0點(diǎn)到現(xiàn)在的秒數(shù)。
- 構(gòu)造方法 datetime.datetime(2016, 12, 6, 16, 29, 43, 79043)
- year采蚀、month疲牵、day、hour榆鼠、minute纲爸、second、microsecond妆够,取datetime對(duì)象的年月日時(shí)分秒及微秒
- weekday() 返回星期的天识啦,周一0,周日6
- isoweekday() 返回星期的天神妹,周一1颓哮,周日7
- date() 返回日期date對(duì)象
- time() 返回時(shí)間time對(duì)象
- replace() 修改并返回新的時(shí)間
- isocalendar() 返回一個(gè)三元組(年,周數(shù)鸵荠,周的天)
- timestamp():返回一個(gè)到微秒的時(shí)間戳
-
日期格式化
類方法 strptime(date_string, format) 题翻,返回datetime對(duì)象
對(duì)象方法 strftime(format) ,返回字符串
-
字符串format函數(shù)格式化
import datetime dt = datetime.datetime.strptime("21/11/06 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:%M}::{0:%S}".format(dt))
-
-
timedelta對(duì)象
datetime2 = datetime1 + timedelta
datetime2 = datetime1 - timedelta
timedelta = datetime1 - datetime2
-
構(gòu)造方法
- datetime.timedelta(days=0, seconds=0, microseconds=0, milliseconds=0, minutes=0, hours=0, weeks=0) - year = datetime.timedelta(days=365)
total_seconds() 返回時(shí)間差的總秒數(shù)
time模塊
- time.sleep(secs) 將調(diào)用線程掛起指定的秒數(shù)(發(fā)起一個(gè)系統(tǒng)調(diào)用,讓程序暫停)
解析式
列表解析式
- 語法:
[返回值 for 元素 in 可迭代對(duì)象 if 條件]
使用中括號(hào)[]嵌赠,內(nèi)部是for循環(huán)塑荒,if條件語句可選
返回一個(gè)新的列表
- 列表解析式是一種語法糖:
- 編譯器會(huì)優(yōu)化,不會(huì)因?yàn)楹?jiǎn)寫而影響效率姜挺,反而會(huì)因優(yōu)化而提高了效率齿税。
- 減少了程序員工作量,減少出錯(cuò)炊豪。
- 簡(jiǎn)化了代碼凌箕,但可讀性增強(qiáng),不便于可讀词渤。
- 舉例:
- 獲取10以內(nèi)的偶數(shù)
#普通
even = []
for x in range(10):
if x % 2 == 0:
even.append(x)
#解析式
even = [x for x in range(10) if x%2 == 0]
- 思考:
有這樣的賦值語句
newlist = [print(i) for i in range(10)]
打印出來的是什么牵舱?
print()把所有的i全打印出來,newlist里面則是10個(gè)None獲取20以內(nèi)的偶數(shù)缺虐,如果同時(shí)是3的倍數(shù)芜壁,把它打印出來
[i for i in range(20) if not i % 2 and i % 3 == 0]
[i for i in range(20) if not i % 2 if i % 3 == 0]
獲取20以內(nèi)2的倍數(shù)或者3的倍數(shù),把它打印出來
[i for i in range(20) if not i % 2 or i % 3 == 0]
"0001.abadicddws" 是ID格式高氮,要求ID格式是以點(diǎn)號(hào)分割慧妄,左邊是4位從1開始的整數(shù),右邊是
10位隨機(jī)小寫英文字母剪芍。請(qǐng)依次生成前100個(gè)ID的列表
import string
import random
x= string.ascii_lowercase
["{:>04}.{}".format(i,"".join(random.choices(x,k = 10))) for i in range(1,8)]
['0001.rvverptnre',
'0002.beqkpbxhfl',
'0003.woxvvayzjo',
'0004.wrbnnkelcc',
'0005.kpsjowcfvz',
'0006.pnqwqzlttc',
'0007.wehobydqnf']
字典解析式
- 語法:
- {返回值 for 元素 in 可迭代對(duì)象 if 條件}
- 列表解析式的中括號(hào)換成大括號(hào){}就行了
- 使用key:value形式
- 立即返回一個(gè)字典
用法:
{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)} #[x]不可哈希塞淹,字典的k要求可哈希
{chr(0x41+x):x**2 for x in range(10)}
{str(x):y for x in range(3) for y in range(4)} # 輸出多少個(gè)元素?
#會(huì)覆蓋罪裹,返回{0:3饱普,1:3,2:3}
集合解析式
- 語法
- {返回值 for 元素 in 可迭代對(duì)象 if 條件}
- 列表解析式的中括號(hào)換成大括號(hào){}就行了
- 立即返回一個(gè)集合
用法
{(x,x+1) for x in range(10)}
{[x] for x in range(10)} #[x]是個(gè)集合状共,不能哈希套耕,所以放在集合解析式里面會(huì)報(bào)錯(cuò)
生成器
生成器Generator
生成器指的是生成器對(duì)象,可以由生成器表達(dá)式得到口芍,也可以使用yield關(guān)鍵字得到一個(gè)生成器函數(shù)箍铲,調(diào)用這個(gè)函數(shù)得到一個(gè)生成器對(duì)象雇卷。
生成器函數(shù):
-
函數(shù)體內(nèi)包含yield語句的函數(shù)鬓椭,返回一個(gè)生成器對(duì)象,生成器函數(shù)的函數(shù)體不會(huì)立即執(zhí)行关划。
生成器對(duì)象小染,是一個(gè)可迭代對(duì)象,是一個(gè)迭代器贮折。
生成器對(duì)象裤翩,是延遲計(jì)算,惰性求值。
next(generator)會(huì)從函數(shù)的當(dāng)前位置向后執(zhí)行到之后碰到的第一個(gè)yield語句踊赠,會(huì)彈出值呵扛,并暫停函數(shù)執(zhí)行。
再次執(zhí)行會(huì)執(zhí)行到下一個(gè)yield語句筐带,沒有多余的yield語句能執(zhí)行今穿,如果函數(shù)沒有顯式的return語句,繼續(xù)調(diào)用next函數(shù)就會(huì)拋出StopIteration異常伦籍。
return會(huì)導(dǎo)致無法繼續(xù)獲取下一個(gè)值蓝晒,拋出StopIteration異常。
-
生成器函數(shù)帖鸦,它是函數(shù)芝薇,不過這個(gè)函數(shù)不像普通的函數(shù)調(diào)用時(shí)能返回一個(gè)合法的值,它返回的是一個(gè)還沒有求過任何值的生成器對(duì)象作儿,用next撥一下才會(huì)往后執(zhí)行一下洛二。
#舉例 def gen(): print('line 1') yield 1 print('line 2') yield 2 print('line 3') return 3 next(gen()) # line 1 next(gen()) # line 1 g = gen() print(next(g)) # line 1 print(next(g)) # line 2 print(next(g, 'End')) # 沒有元素給個(gè)缺省值 print(next(g, 'End')) # 沒有元素給個(gè)缺省值
生成器的應(yīng)用
#計(jì)數(shù)器
def inc():
def counter():
i = 0
while True:
i += 1
yield i
c = counter()
return lambda : next(c)
foo = inc()
print(foo()) #調(diào)用的時(shí)候是因?yàn)閕nc()函數(shù)返回的是一個(gè)匿名函數(shù),而匿名函數(shù)的調(diào)用方式是(lambda 參數(shù)列表:函數(shù)體)(),所以調(diào)用的時(shí)候是foo后要加上()立倍,即也就是inc()()灭红。
#等價(jià)于
def inc():
def counter():
i = 0
while True:
i += 1
yield i
c = counter()
def _inc(): #用到外面的自由變量(c):閉包
return next(c)
return _inc
foo = inc() #可調(diào)用對(duì)象,函數(shù)
print(foo())
yield from
yield from是python3.3出現(xiàn)的新語法
yield from iterable 是for item in iterable: yield item形式的語法糖口注。
for x in range(1000):
yield x
#等價(jià)于
yield from range(1000)
從可迭代對(duì)象中一個(gè)個(gè)拿數(shù)據(jù)
def counter(n): #生成器变擒,迭代器
for x in range(n):
yield x
def inc(n):
yield from counter(n)
foo = inc(10)
print(next(foo))
print(next(foo))
協(xié)程coroutine
生成器的高級(jí)用法
比進(jìn)程、線程輕量級(jí)
是在用戶空間調(diào)度函數(shù)的一種實(shí)現(xiàn)
Python3 asyncio就是協(xié)程實(shí)現(xiàn)寝志,已經(jīng)加入到標(biāo)準(zhǔn)庫(kù)
Python3.5 使用async娇斑、await關(guān)鍵字直接原生支持協(xié)程
協(xié)程調(diào)度器實(shí)現(xiàn)思路
- 有2個(gè)生成器A、B
- next(A)后材部,A執(zhí)行到了yield語句暫停毫缆,然后去執(zhí)行next(B),B執(zhí)行到y(tǒng)ield語句也暫停乐导,然后再次調(diào)用next(A)苦丁,再調(diào)用next(B)在,周而復(fù)始物臂,就實(shí)現(xiàn)了調(diào)度的效果
- 可以引入調(diào)度的策略來實(shí)現(xiàn)切換的方式
協(xié)程是一種非搶占式調(diào)度
生成器表達(dá)式Generator expression
- 語法
(返回值 for 元素 in 可迭代對(duì)象 if 條件)
列表解析式的中括號(hào)換成小括號(hào)就行了
返回一個(gè)生成器
- 和列表解析式的區(qū)別
生成器表達(dá)式是按需計(jì)算(或稱惰性求值旺拉、延遲計(jì)算),需要的時(shí)候才計(jì)算值棵磷,返回迭代器蛾狗,可以迭代,從前到后走完一遍后仪媒,不能回頭沉桌。
列表解析式是立即返回值,返回的不是迭代器,返回可迭代對(duì)象列表留凭, 從前到后走完一遍后佃扼,可以重新回頭迭代。
- 和列表解析式的對(duì)比
- 計(jì)算方式
- 生成器表達(dá)式延遲計(jì)算蔼夜,列表解析式立即計(jì)算
- 內(nèi)存占用
- 單從返回值本身來說松嘶,生成器表達(dá)式省內(nèi)存,列表解析式返回新的列表
- 生成器沒有數(shù)據(jù)挎扰,內(nèi)存占用極少翠订,但是使用的時(shí)候,雖然一個(gè)個(gè)返回?cái)?shù)據(jù)遵倦,但是合起來占用的內(nèi)存也差不多
- 列表解析式構(gòu)造新的列表需要占用內(nèi)存
- 計(jì)算速度
- 單看計(jì)算時(shí)間看尽超,生成器表達(dá)式耗時(shí)非常短,列表解析式耗時(shí)長(zhǎng)
- 但是生成器本身并沒有返回任何值梧躺,只返回了一個(gè)生成器對(duì)象
- 列表解析式構(gòu)造并返回了一個(gè)新的列表
- 生成器
- 可迭代對(duì)象(able結(jié)尾)
- 迭代器(or結(jié)尾)似谁,是不是迭代器用next()方法可以檢測(cè),iter()方法可以把一個(gè)可迭代對(duì)象封裝成迭代器掠哥。
- 生成器和迭代器是不同的對(duì)象巩踏,但都是可迭代對(duì)象,生成器對(duì)象续搀,就是迭代器對(duì)象塞琼,迭代器不一定是生成器。
內(nèi)建函數(shù)
- 標(biāo)識(shí) id
- 返回對(duì)象的唯一標(biāo)識(shí)禁舷,CPython返回內(nèi)存地址
- 哈希 hash()
- 返回一個(gè)對(duì)象的哈希值
- 類型 type()
- 返回對(duì)象的類型
- 類型轉(zhuǎn)換
- float() int() bin() hex() oct() bool() list() tuple() dict() set() complex() bytes() bytearray()
- 輸入 input([prompt])
- 接收用戶輸入彪杉,返回一個(gè)字符串
- 打印 print(*objects, sep=' ', end='\n', file=sys.stdout, flush=False)
- 打印輸出,默認(rèn)使用空格分割牵咙、換行結(jié)尾派近,輸出到控制臺(tái)
- 對(duì)象長(zhǎng)度 len(s)
- 返回一個(gè)集合類型的元素個(gè)數(shù)
- isinstance(obj, class_or_tuple)
- 判斷對(duì)象obj是否屬于某種類型或者元組中列出的某個(gè)類型
- isinstance(True, int)
- issubclass(cls, class_or_tuple)
- 判斷類型cls是否是某種類型的子類或元組中列出的某個(gè)類型的子類
- issubclass(bool, int)
絕對(duì)值abs(x) x為數(shù)值
最大值max() 最小值min()
- 返回可迭代對(duì)象中最大或最小值
- 返回多個(gè)參數(shù)中最大或最小值
round(x) 四舍六入五取偶,round(-0.5)
pow(x , y) 等價(jià)于 x**y
range(stop) 從0開始到stop-1的可迭代對(duì)象洁桌;range(start, stop[, step])從start開始到stop-1結(jié)束步長(zhǎng)為step的可迭代對(duì)象
divmod(x, y) 等價(jià)于 tuple (x//y, x%y)
sum(iterable[, start]) 對(duì)可迭代對(duì)象的所有數(shù)值元素求和渴丸,start:初始值
- sum(range(1,100,2))
- chr(i) 給一個(gè)一定范圍的整數(shù)返回對(duì)應(yīng)的字符
- chr(97) chr(20013)
- ord(c) 返回字符對(duì)應(yīng)的整數(shù)
- ord('a') ord('中')
- sorted
sorted(iterable[, key][, reverse] )排序
- 返回一個(gè)新的列表,默認(rèn)升序
- reverse是反轉(zhuǎn)
sorted([1, 3, 5])
sorted([1, 3, 5], reverse=True)
sorted({'c':1, 'b':2, 'a':1})
- 翻轉(zhuǎn) reversed(seq)
返回一個(gè)翻轉(zhuǎn)元素的迭代器(惰性求值)
list(reversed("13579"))
{ reversed((2, 4)) } # 有幾個(gè)元素另凌?
for x in reversed(['c','b','a']):
print(x)
reversed(sorted({1, 5, 9}))
- 枚舉 enumerate(seq, start=0)
迭代一個(gè)序列谱轨,返回索引數(shù)字和元素構(gòu)成的二元組
start表示索引開始的數(shù)字,默認(rèn)是0
for x in enumerate([2,4,6,8]):
print(x)
for x in enumerate("abcde"):
print(x,end=" ")
- 迭代器和取元素 iter(iterable)途茫、next(iterator[, default])
iter將一個(gè)可迭代對(duì)象封裝成一個(gè)迭代器
next對(duì)一個(gè)迭代器取下一個(gè)元素碟嘴。如果全部元素都取過了溪食,再次next會(huì)拋StopIteration異常
it = iter(range(5))
next(it)
it = reversed([1,3,5])
next(it)
- 拉鏈函數(shù)zip(*iterables)
像拉鏈一樣囊卜,把多個(gè)可迭代對(duì)象合并在一起,返回一個(gè)迭代器
將每次從不同對(duì)象中取到的元素合并成一個(gè)元組
list(zip(range(10),range(10)))
list(zip(range(10),range(10),range(5),range(10)))
dict(zip(range(10),range(10)))
{str(x):y for x,y in zip(range(10),range(10))}