標籤:config inf __file__ 調試 遍曆 prot 語言 evel oob
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學習筆記(五)