Python------date,continue,迭代物件,生成器
大多數的語言都提供了時間操作的相應類,諸如java的java.util.Date,java.util.Calendar等等, Python中是time 和 calendar .
首先需要導包import time;
然後就可以使用了,mTime= time.time()
那結果呢?
1448004021.1337154 (而且這個數字還繼續在變)
WHY?
用ticks計時單位返回從12:00am, January 1, 1970(epoch) 開始的記錄的當前作業系統時間,格林威治時間你懂的
在Java中也有類似實現,像下面:
Date date =new Date();
System.out.println(date .getTime());
結果: 1448004275140
- 1
- 2
- 3
- 4
那如何顯示出我們平時的時分秒啊,日起之類的呢?
Java中的實現是:
Date date =new Date();
DateFormat df1 = DateFormat.getDateInstance(DateFormat.FULL, Locale.CHINA);
System.out.println(df1.format(date));
結果: 2015年11月20日 星期五
- 1
- 2
- 3
- 4
- 5
而Python中:
localtime = time.localtime(time.time())
print("第107行,本地時間 :" , localtime)
#時間格式化
print("第109行,列印格式化後的本地時間",time.asctime(localtime))
結果: 第107行,本地時間 : time.struct_time(tm_year=2015, tm_mon=11, tm_mday=20, tm_hour=15, tm_min=20, tm_sec=21, tm_wday=4, tm_yday=324, tm_isdst=0)
第109行,列印格式化後的本地時間 Fri Nov 20 15:20:21 2015
- 1
- 2
- 3
- 4
- 5
- 6
- 7
Fri Nov 20 15:20:21 2015是不是看了就眼熟了?,那麼107行列印的那一長串又是什麼呢?
Python函式用一個元組裝起來的9組數字處理時間,每個元素代表的意思依次為: 年,月,日,小時,分鐘,秒一週第幾天,一年第幾天,是否夏令時
然後呼叫
,time.asctime()
方法把這個元素格式化為我們所更能理解的格式。
跟事件相關的還有Calendar,Python對日曆進行了很好的一層封裝,諸如我要打出某一年某一月的所有日曆,只需要一行程式碼calendar.month(2015,11)
結果:
November 2015 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
是不是瞬間高能? 還有諸如 返回在兩年之間的閏年總數。
print(calendar.leapdays(2000,2009),"年")
結果: 3年
- 1
- 2
- 3
Python continue 語句
continue 語句跳出本次迴圈,而break跳出整個迴圈意義和Java中差不多都是直接終端這一步操作回到迴圈的起始點,看例子:
for x in "HelloWorldhaha":
if x=="r":
continue
print("now word:",x,end=" ")
if x=="a":
break
結果: now word: H now word: e now word: l now word: l now word: o now word: W now word: o now word: l now word: d now word: h now word: a NiHao 當前數字 0
第一個邏輯只是讓r這一組列印沒有執行,第二組邏輯的break是讓整個迴圈結束了,所以二者的區別還是很大的沒一個是單輪一個事全域性哦。
再貼一個**pass**的例子
for x in range(10):
if x%3==0:
pass
print("NiHao",end=" ")
print("當前數字",x)
結果:
當前數字 1
當前數字 2
NiHao 當前數字 3
當前數字 4
當前數字 5
NiHao 當前數字 6
當前數字 7
當前數字 8
NiHao 當前數字 9
所以,pass就是 什麼都沒發生的意思。。
- 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
Python生成器
在Python中,這種一邊迴圈一邊計算的機制,稱為生成器:generator。只要把一個列表生成式的[]改成(),就建立了一個generator。
print("第8行列印list",[x for x in range(10)])
結果: 第8行列印list [0, 1, 2, 3, 4, 5, 6, 7, 8, 9]
//建立一個generator
print("第11行列印generator",(x for x in range(10)))
結果: 第39行列印變形的fib <generator object fib at 0x000000F008E43AF0>
- 1
- 2
- 3
- 4
- 5
- 6
- 7
- 8
generator是無法被直接打印出來的,我們可以用next()函式把他一個一個讀出來(也不可以獲取他的長度)
一樣的道理,我們可以用for迴圈等一些迭代的方法,把他裡面的內容讀出來
g=(x for x in range(10))
#可迭代
for x in g:
print(x,end=" ")
結果: 0 1 2 3 4 5 6 7 8 9
或者用
next(g)
結果: 0
- 1
- 2
- 3
- 4
- 5
- 6
- 7
- 8
- 9
那麼如果用next()讀下去讀不到東西了,就會拋異常,像這樣
Traceback (most recent call last): File “”, line 1, in StopIteration
generator還提供了一個關鍵字yield,看上去 功能和return之類的差不多,但是執行到yield函式就會停止,並且記錄位置,下一次呼叫會從 這個 位置 開始操作
deftestYie():
print("第一次執行到這裡")
yield 1
print('第二次執行到這裡')
yield 3
print('第三次執行到這裡')
yield 5
#需要先構造一個函式物件
newTestYie=testYie()
print(next(newTestYie))
print(next(newTestYie))
print(next(newTestYie))
yield必須在一個函式中,不可以出現在基類裡。
結果:
第一次執行到這裡
1
第二次執行到這裡
3
第三次執行到這裡
5
從正常理解結果看上去,函式只被呼叫了1次,其實並不是,被執行了3次才出現了這麼個結果,每一次都是從關鍵字結束,第二次又從關鍵字的位置開始
如果再多呼叫一次,就會出現剛才的異常了
- 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
當一個函式 出現 yield 關鍵詞的時候 這個 函式就是 generator函數了
迭代物件
迭代的概念以及如何在之前已經有講過,今天要再強調的是Iterable物件以及Iterator物件
From Internet
一類是集合資料型別,如list、tuple、dict、set、str等;
一類是generator,包括生成器和帶yield的generator function。
這些可以直接作用於for迴圈的物件統稱為可迭代物件:Iterable。
可以被next()函式呼叫並不斷返回下一個值的物件稱為迭代器:Iterator。
我們可以用isinstance函式來判斷物件的型別,如:
#判斷是否是可迭代物件
print('第77行判斷字串是否是可迭代物件',isinstance("as",Iterable))
print('第78行判斷list是否是可迭代物件',isinstance([],Iterable))
print('第79行判斷字典是否是可迭代物件',isinstance({"aa":123,"cc":123},Iterable))
#判斷是否迭代物件Iterator
print('第82行判斷字典是否是迭代物件',isinstance({"aa":123,"cc":123},Iterator))
print('第83行判斷list是否是迭代物件',isinstance([x for x in range(10)],Iterator))
print('第84行判斷generator是否是迭代物件',isinstance((x for x in range(10)),Iterator))
結果:
第77行判斷字串是否是可迭代物件 True
第78行判斷list是否是可迭代物件 True
第79行判斷字典是否是可迭代物件 True
第82行判斷字典是否是迭代物件 False
第83行判斷list是否是迭代物件 False
第84行判斷generator是否是迭代物件 True
- 1
- 2
- 3
- 4
- 5
- 6
- 7
- 8
- 9
- 10
- 11
- 12
- 13
- 14
- 15
- 16
- 17
- 18
兩種型別還能互相轉換:
#轉換為Iterator物件
print('第87行Iterable轉換為Iterator物件',isinstance(iter([x for x in range(10)]),Iterator))
第87行Iterable轉換為Iterator物件 True
- 1
- 2
- 3
- 4
那麼,有了Iterable為什麼還需要Iterator呢?(好繞口,好難記)
這是因為Python的Iterator物件表示的是一個數據流,Iterator物件可以被next()函式呼叫並不斷返回下一個資料,直到沒有資料時丟擲StopIteration錯誤。可以把這個資料流看做是一個有序序列,但我們卻不能提前知道序列的長度,只能不斷通過next()函式實現按需計算下一個資料,所以Iterator的計算是惰性的,只有在需要返回下一個資料時它才會計算。 Iterator甚至可以表示一個無限大的資料流,例如全體自然數。而使用list是永遠不可能儲存全體自然數的。
Thanks