1. 程式人生 > >python學習第二十一天

python學習第二十一天

1.關於模組。
import
from xxx import xxx
2.Collections

1. Counter 計數器
2. 棧: 先進後出.
佇列:先進先出
deque:雙向佇列
3. defaultdict 預設值字典
4. namedtuple 命名元祖. struct_time 結構化時間就是命名元祖
5. OrederedDict 有序字典。 按照我們儲存的順序儲存. 和3.6以後的字典一樣的

# import collections # 方法二的引入模組
from collections import Counter

s = "I am Euan, I have a dream, freedom"

# 方法一
dic = {}
for el in s:
dic[el] = dic.setdefault(el,0) + 1
print(dic)

# 方法二
# q = collections.Counter(s)
# print(q)

# 方法三
q = Counter(s)

print("__iter__" in dir(q))
for item in q:
print(item,":",q[item])


# 棧 : 特點:先進後出
# 佇列 : 特點:先進先出
# python中提供了佇列,沒有棧,

# 棧
# 自定義異常
class StackFullError(Exception): # 棧已滿
pass
class StackEmptyError(Exception): # 棧已空
pass

class Stack:
def __init__(self, size):
'''

:param size: 棧的大小
'''
self.index = 0
self.lst = []
self.size = size

# 給棧新增元素
def push(self,item):
'''

:param item: 新增的元素
:return:
'''
if self.index == self.size:
# 棧已經滿了不能新增內容,丟擲一個異常
raise StackFullError('The stack is full')
self.lst.insert(self.index,item) # 對於一個空列表,需要insert插入內容
# self.lst.insert(self.index,item) 把元素放到棧裡
self.index += 1 # 指標向上移動


# 從棧中獲取資料
def pop(self):
'''

:return: 返回刪除的元素(從棧中拿出的元素)
'''
if self.index == 0:
raise StackEmptyError('The stack is empty')
self.index -= 1 # 指標向下移動
item = self.lst.pop(self.index) # 獲取元素,刪除
return item

s = Stack(3)
s.push('1')
s.push('2')
s.push('3')
print(s.pop())
print(s.pop())
print(s.pop())

# 佇列
# 佇列中沒有元素了,繼續獲取的話,會阻塞
import queue
q = queue.Queue() # 建立佇列
q.put('Euan')
q.put('Xu')
q.put('Wade')
print(q)
print(q.get())
print(q.get())
print(q.get())

# 雙向列表

from collections import deque
q = deque() # 建立雙向列表
q.append('Euan') # 從右邊新增資料
q.append('Kobe')
q.append('Wade')
q.appendleft('威斯布魯克') # 從左邊新增資料
q.appendleft('阿託姆昆伯')
q.appendleft('哈登')
print(q.pop()) # 從右邊拿取資料
print(q.pop())
print(q.pop())
print(q.pop())
print(q.popleft()) # 從左邊拿取資料
print(q.popleft())


# 命名元組
from collections import namedtuple
point = namedtuple("point",['x','y','z']) # 相當於寫了一個類
# class Point:
# def __init__(self, x, y, z):
# self.x = x
# self.x = y
# self.x = z
p = point(7,16,25)
print(p)
print(p.x)

from collections import defaultdict

lst = [11,66,55,33,44,99,77,22,88,]

d = defaultdict(list)
for el in lst:
if el < 66 :
d["key1"].append(el)
else:
d["key2"].append(el)
print(d)



3.time時間模組

1. 獲取系統時間 time.time() 時間戳
2. 格式化時間 strftime() 時間格式: %Y-%m-%d %H:%M:%S %Y-%m-%d
3. 結構化時間 time.gmtime() time.localtime()
strptime() 把格式化時間轉化成結構化時間
mktime() 把結構化時間轉化成時間戳


import time

# 獲取當前時間系統,時間戳
print(time.time())
# 1542167259.4904895,給機器看的.
# 以1970-01-01 00:00:00為基準.
# 資料庫儲存的是這個時間.

# 格式化時間 2018-11-14 11:11:11
# 以下格式使用頻率特別高
s = time.strftime("%Y-%m-%d %H:%M:%S") # string format time
print(s) # 列印當前時間

# 計時器
while 1:
s = time.strftime("%Y-%m-%d %H:%M:%S")
print(s)
time.sleep(1)


# 結構化時間
print(time.localtime())
t = time.localtime()
print(t.tm_yday)
print(t.tm_year)
print(t.tm_mon)


# # (從時間戳 ——> 格式化時間),(格式化時間 ——> 從時間戳),兩者再轉換時都必須先轉換為結構化時間
# 從時間戳 ——> 格式化時間
# 資料庫中儲存的 時間戳:1542168201.0
t = time.localtime(1542168201.0) # localtime() : 當地時區 ; gmtime() : 格林尼治時間
print(t) # t 此時為 結構化時間
# 結構化時間 轉換為 格式化時間
str_time = time.strftime("%Y-%m-%d %H:%M:%S", t)
print(str_time)

# 格式化時間 ——> 從時間戳
s = "2018-11-14 12:03:21"
t = time.strptime(s,"%Y-%m-%d %H:%M:%S") # ("%Y-%m-%d %H:%M:%S")這個格式必須和給出的時間格式一致
print(t) # t 此時為結構化時間
# 結構化時間長這樣 : time.struct_time(tm_year=2018, tm_mon=11, tm_mday=14, tm_hour=12, tm_min=3, tm_sec=21, tm_wday=2, tm_yday=318, tm_isdst=-1)
# 結構化時間 轉換為 時間戳
ss = time.mktime(t)
print(ss)


# 時間差
import time
# # 第一種方法
begin = "2018-11-14 16:30:00"
end = "2018-11-14 18:00:50"

begin_struct_time =time.strptime(begin, "%Y-%m-%d %H:%M:%S")
end_struct_time =time.strptime(end, "%Y-%m-%d %H:%M:%S")

begin_second = time.mktime(begin_struct_time)
end_second = time.mktime(end_struct_time)

diff_time = abs((begin_second - end_second))
min = int(diff_time//60)

diff_s = int(diff_time%60) # 最終秒的結果
diff_hour = (min//60) # 最終分鐘的結果
diff_min = (min%60) # 最終小時的結果
print("時間差是 %s小時%s分鐘%s秒鐘" % (diff_hour, diff_min,diff_s))

# # 第二種方法
begin = "2018-11-14 16:30:00"
end = "2018-11-14 18:00:50"

begin_struct_time =time.strptime(begin, "%Y-%m-%d %H:%M:%S")
end_struct_time =time.strptime(end, "%Y-%m-%d %H:%M:%S")

begin_second = time.mktime(begin_struct_time)
end_second = time.mktime(end_struct_time)
diff_time_sec = abs((begin_second - end_second))

# # 以下為與方法一的不同點
# 轉化成結構化時間
t = time.gmtime(diff_time_sec) # 最好用格林尼治時間。 否則有時差
print('時間差是%s年%s月%s日%s小時%s分鐘%s秒鐘' % (t.tm_year-1970, t.tm_mon-1, t.tm_mday-1, t.tm_hour, t.tm_min, t.tm_sec))



4.os和sys
1. os模組
os.sep 檔案路徑分隔符
os.makedirs("file/file2") 可生成多層遞迴目錄
os.removedirs("file") 若目錄溫控,則刪除,並遞迴到上一級目錄,如若也為空,則刪除,以此類推
os.mkdir('file') 生成單級目錄;相當於shell中的mkdir dirname
os.rmdir('file') 刪除單級空目錄,若目錄不為空則無法刪除,報錯;相當於shell中的 rmdir dirname
os.listdir('file') 列出指定目錄下的所有檔案和子目錄,包括影藏檔案,並以列表方式列印
os.remove 刪除一個檔案
os.stat('path/filename') 獲取檔案/目錄資訊
os.system("bash command") 執行shell命令,直接顯示
os.popen("bash command).read() 執行shell命令,獲取執行結果
os.getcwd() 獲取當前工作目錄,即當前python指令碼工作的目錄路徑
os.chdir("dirname") 改變當前指令碼工作目錄;相當於shell下c

os.path
os.path.abspath(path) 返回path規範化的絕對路徑
os.path.split(path) 將path分割成目錄和檔名二元組返回
os.path.dirname(path) 返回path的目錄。其實就是os.path.split(path)的第一個元素
os.path.basename(path) 返回path最後的檔名。如何path以/或\結尾,那麼就會返回空值。即os.path.split(path)的第二個元素
os.path.exists(path) 如果path存在,返回True;如果path不存在,返回False
os.path.isabs(path) 如果path是絕對路徑,返回True
os.path.isfile(path) 如果path是一個存在的檔案,返回True。否則返回False
os.path.isdir(path) 如果path是一個存在的目錄,則返回True。否則返回False
os.path.join(path1[, path2[, ...]]) 將多個路徑組合後返回,第一個絕對路徑之前的引數 將被忽略
os.path.getatime(path) 返回path所指向的檔案或者目錄的最後訪問時間
os.path.getmtime(path) 返回path所指向的檔案或者目錄的最後修改時間
os.path.getsize(path) 返回path的大小

特殊屬性:
os.sep 輸出作業系統特定的路徑分隔符,win下為"\\",Linux下為"/"
os.linesep 輸出當前平臺使用的行終止符,win下為"\r\n",Linux下為"\n"
os.pathsep 輸出用於分割檔案路徑的字串 win下為;,Linux下為:
os.name 輸出字串指示當前使用平臺。win->'nt'; Linux->'posix'

os.star
# 特殊屬性:
st_mode: inode 保護模式 st_ino: inode 節點號。
st_dev: inode 駐留的裝置。
st_nlink: inode 的連結數。
st_uid: 所有者的使用者ID。
st_gid: 所有者的組ID。
st_size: 普通檔案以位元組為單位的大小;包含等待某些特殊檔案的資料。
st_atime: 上次訪問的時間。 st_mtime: 最後一次修改的時間。
st_ctime: 由作業系統報告的"ctime"。在某些系統上(如Unix)是最新的元資料更改的時間,在其它系統上(如Windows)是建立時間(詳細資訊參見平臺的文件)。

2. sys模組 所有和python直譯器相關的都在sys模組
sys.path python查詢模組的路徑
sys.argv 命令列引數List,第一個元素是程式本身路徑
sys.exit(n) 退出程式,正常退出時exit(0),錯誤退出sys.exit(1)
sys.version 獲取Python解釋程式的版本資訊
sys.platform 返回作業系統平臺名稱