1. 程式人生 > >Python------date,continue,迭代物件,生成器

Python------date,continue,迭代物件,生成器

大多數的語言都提供了時間操作的相應類,諸如java的java.util.Datejava.util.Calendar等等, Python中是timecalendar .

首先需要導包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));

結果:   20151120日 星期五
  • 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行判斷字串是否是可迭代物件 True78行判斷list是否是可迭代物件 True79行判斷字典是否是可迭代物件 True82行判斷字典是否是迭代物件 False83行判斷list是否是迭代物件 False84行判斷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

這裡寫圖片描述