python學習筆記(五)
38、繼承
子類繼承父類時,如果不寫init方法,表示繼承父類的init方法。如果寫了init方法,表示重寫父類的init方法。其他方法也是同理。對於變量也是同樣的道理。
class A:
def __init__(self):
self.a=”a”
self.b=”b”
def print(self):
print(self.a)
class B(A):
def __init__(self):
super(B,self).__init__() //註意繼承書寫的格式,類名寫自己的類,self不能缺少。
self.c=”c”
def print_b(self):
print(self.b)
39、日期運算
import datetime,time
計算兩個日期之間的差值:
date5 = datetime.datetime.strptime(‘2012-9-22 12:35:40‘,‘%Y-%m-%d %H:%M:%S‘)
date6 = datetime.datetime.strptime(‘2015-9-22 10:35:40‘,‘%Y-%m-%d %H:%M:%S‘)
sep = date6 - date5
print(sep)
計算三天之後的日期:
now = datetime.datetime.now()
delta = datetime.timedelta(days=3)
n_days = now + delta
print(n_days.strftime(‘%Y-%m-%d %H:%M:%S‘))
其中strptime的類型是時間類,不是字符串格式。
date1 = time.ctime() #為字符串,不能進行加減運算
date2 = datetime.date.today() #為date類,能與timedelta進行運算
date3 = datetime.datetime.now() #為datetime類,能與timedelta進行運算
雖然都能與timedelta進行運算,但是不能的類之間不能進行運算,如date2-date3。
time.strptime(),datetime.datetime.strptime()
向一個開始輸入框和結束輸入框裏輸入時間,需要轉換為string類型:
startTime = datetime.date.today()
startTimeStr = startTime.strftime()
endTime = startTime - datetime.tiemdelta(days=3)
endTimeStr = endTime.strftime()
40、日誌模塊
import logging
logging.basicConfig(filename="config.log",filemode="a",
format="%(asctime)s--%(name)s--%(levelname)s:%(message)s",level=logging.INFO)
console = logging.StreamHandler()
logging.getLogger().addHandler(console)
# 上面兩行是將日誌同時輸出到console,方便調試。
logging.error("This is a error log.")
logging.info("This is a info log.")
41、python中的私有變量
(1)_xx,以單下劃線開頭的標識的protected類型的變量。即保護類型只能允許其本身與子類進行訪問。若內部變量標識為,如當使用 from M import * 時,不會將一個下劃線開頭的對象引入。
(2)__xx,雙下劃線的表示的是私有類型的變量。只能允許這個類本身進行訪問,連子類也不可以用於命名一個類屬性(類變量),調用時名字被改變(在類FooBar內部,__boo變成_FooBar__boo,如self._FooBar__boo)
(3)__xx__是定義特殊方法。用戶控制的命名空間內的變量或是屬性,如__init__,__import__或是__file__。只有當文檔有說明時使用,不要自己定義這類變量。(就是說這些是python內部定義的變量名)
在這裏強調一下私有變量,python默認的成員函數和成員變量都是公開的,沒有像其他類似語言的public,private等關鍵字修飾,但是可以在變量前面加上兩個下劃線“__”,這樣的話,函數或變量就變成私有的,這是python的已有變量軋壓(這個翻譯好拗口,英文名稱是private name mangling)
42、列表表達式和列表生成器
列表推導式有包含一個表達式的括號組成,表達式後面跟隨一個for字句,之後可以有零個或多個for或if字句,結果是一個列表,由表達式依據其後面的for或if字句上下文計算而來的結果構成
a = [(x,y) for x in [1,2,3] for y in [2,3,5] if x!=y]
這樣,a就生成了一個列表,每個元素是由x、y構成的元組。
生成器表達式與列表表達式很像:m = ((x,y) for x in [1,2,3] for y in [2,3,5])
引用生成器表達式中的值:
print(m.__next__())
print(m.__next__())
總結:(1)把列表表達式的[]換成()得到的就是生成器表達式;(2)列表解析與生成器表達式都是一種便利的編程方式,只不過生成器表達式更節省內存。
43、列表中元素去重
列表有刪除元素的方法,如list.pop(i),list.remove(value),del list[i]。有一點需要註意,每刪除一個元素,後面的元素會自動前移一位,導致用for遍歷的時候,每刪除一個,後面的一個元素下標自動減1,使這個元素沒被遍歷到,從而出現遺漏。
要想刪除列表中所有的重復元素,就不能簡單的用for,而是用遞歸。如下:
list1 = [1,2,3,3,3,2,2,5,6,5,6]
def delDupli(list1):
for i in list1:
if list1.count(i) != 1:
list1.remove(i)
delDupli(list1)
delDupli(list1)
print(list1)
python學習筆記(五)