python的struct模塊
① 關於python代碼中struct模塊的定義
這個你得好好看看struct模塊的pack函數的文檔了,fmt就是format,pack的第一個參數代表了格式的信息,這個格式的格式,有專門的定義
② python中的struct模塊怎麼使用
Python為各種數據類型(如整型等)提供與「C」不同的抽象層次,它們也以不同的方式存儲它們。當然,存儲在二進制文件中的數據或通過網路發送和接收的數據是連續的位元組。在Python中,列表中的數據可能不會被存儲為連續的位元組塊。
2
為了處理它們,將python值轉換為「C」結構很重要,即將它們打包成連續的數據位元組,或者將一個連續的位元組塊分解成Python對象。模塊「struct」提供了將python對象打包為連續的位元組塊的功能,或者將一大塊位元組拆分成python結構。
③ Python中如何使用C的結構體struct求解
閟truct就可以使用結構體了:
import struct
生成一個結構體實例:
data = struct.pack( 'format_string', struct_menber_1, struct_menber_2, ... )
其中的format_string用來指定結構體的格式(指明該結構體在C中的定義),由兩部分組成:
首先是一個可選的特殊字元,用來指明位元組序、數據類型大小和對齊方式:
@: native order, size & alignment (default)
=: native order, std. size & alignment
<: little-endian, std. size & alignment
>: big-endian, std. size & alignment
!: same as >
然後是指明結構體定義的部分:
The remaining chars indicate types of args and must match exactly;
these can be preceded by a decimal repeat count:
x: pad byte (no data); c:char; b:signed byte; B:unsigned byte;
h:short; H:unsigned short; i:int; I:unsigned int;
l:long; L:unsigned long; f:float; d:double.
Special cases (preceding decimal count indicates length):
s:string (array of char); p: pascal string (with count byte).
Special case (only available in native format):
P:an integer type that is wide enough to hold a pointer.
Special case (not in native mode unless 'long long' in platform C):
q:long long; Q:unsigned long long
Whitespace between formats is ignored.
如果struct模塊的函數出錯,將產生struct.error異常。
④ python struct pack怎麼弄成二進制
有的時候需要用python處理二進制數據,比如,存取文件,socket操作時.這時候,可以使用python的struct模塊來完成.可以用 struct來處理c語言中的結構體.
struct模塊中最重要的三個函數是pack(), unpack(), calcsize()
8
# 按照給定的格式(fmt),把數據封裝成字元串(實際上是類似於c結構體的位元組流)pack(fmt, v1, v2, ...) # 按照給定的格式(fmt)解析位元組流string,返回解析出來的tupleunpack(fmt, string) # 計算給定的格式(fmt)佔用多少位元組的內存calcsize(fmt)
上述fmt中,支持的格式為:
FORMAT
C TYPE
PYTHON TYPE
STANDARD SIZE
NOTES
x pad byte no value
c char string of length 1 1
b signed char integer 1 (3)
B unsigned char integer 1 (3)
? _Bool bool 1 (1)
h short integer 2 (3)
H unsigned short integer 2 (3)
i int integer 4 (3)
I unsigned int integer 4 (3)
l long integer 4 (3)
L unsigned long integer 4 (3)
q long long integer 8 (2), (3)
Q unsigned long long integer 8 (2), (3)
f float float 4 (4)
d double float 8 (4)
s char[] string
p char[] string
P void * integer (5), (3)
注1.q和Q只在機器支持64位操作時有意思
注2.每個格式前可以有一個數字,表示個數
注3.s格式表示一定長度的字元串,4s表示長度為4的字元串,但是p表示的是pascal字元串
注4.P用來轉換一個指針,其長度和機器字長相關
注5.最後一個可以用來表示指針類型的,佔4個位元組
為了同c中的結構體交換數據,還要考慮有的c或c++編譯器使用了位元組對齊,通常是以4個位元組為單位的32位系統,故而struct根據本地機器位元組順序轉換.可以用格式中的第一個字元來改變對齊方式.定義如下:
CHARACTER
BYTE ORDER
SIZE
ALIGNMENT
@ native native native
= native standard none
< little-endian standard none
> big-endian standard none
! network (= big-endian) standard none
使用方法是放在fmt的第一個位置,就像』@5s6sif』
例子1:
結構體如下:
structHeader{ unsigned shortid; char[4] tag; unsigned intversion; unsigned intcount;}
通過socket.recv接收到了一個上面的結構體數據,存在字元串s中,現在需要把它解析出來,可以使用unpack()函數:
importstructid, tag, version, count =struct.unpack("!H4s2I", s)
上面的格式字元串中,!表示我們要使用網路位元組順序解析,因為我們的數據是從網路中接收到的,在網路上傳送的時候它是網路位元組順序的.後面的H表示 一個unsigned short的id,4s表示4位元組長的字元串,2I表示有兩個unsigned int類型的數據.
就通過一個unpack,現在id, tag, version, count里已經保存好我們的信息了.
同樣,也可以很方便的把本地數據再pack成struct格式:
ss =struct.pack("!H4s2I", id, tag, version, count);
pack函數就把id, tag, version, count按照指定的格式轉換成了結構體Header,ss現在是一個字元串(實際上是類似於c結構體的位元組流),可以通過 socket.send(ss)把這個字元串發送出去。
例子2:
importstruct a=12.34 # 將a變為二進制bytes=struct.pack('i',a)
此時bytes就是一個string字元串,字元串按位元組同a的二進制存儲內容相同。
再進行反操作,現有二進制數據bytes,(其實就是字元串),將它反過來轉換成python的數據類型:
# 注意,unpack返回的是tuple !!a,=struct.unpack('i',bytes)
如果是由多個數據構成的,可以這樣:
a='hello'b='world!'c=2d=45.123 bytes=struct.pack('5s6sif',a,b,c,d)
此時的bytes就是二進制形式的數據了,可以直接寫入文件比如 binfile.write(bytes)
然後,當我們需要時可以再讀出來,bytes=binfile.read()
再通過struct.unpack()解碼成python變數:
a,b,c,d=struct.unpack('5s6sif',bytes)
』5s6sif』這個叫做fmt,就是格式化字元串,由數字加字元構成,5s表示佔5個字元的字元串,2i,表示2個整數等等,下面是可用的字元及類型,ctype表示可以與python中的類型一一對應。
注意:二進制文件處理時會碰到的問題
我們使用處理二進制文件時,需要用如下方法:
binfile=open(filepath,'rb') #讀二進制文件 binfile=open(filepath,'wb') #寫二進制文件
那麼和binfile=open(filepath,』r')的結果到底有何不同呢?
不同之處有兩個地方:
第一,使用』r'的時候如果碰到』0x1A』,就會視為文件結束,這就是EOF。使用』rb』則不存在這個問題。即,如果你用二進制寫入再用文本讀出的話,如果其中存在』0X1A』,就只會讀出文件的一部分。使用』rb』的時候會一直讀到文件末尾。
第二,對於字元串x=』abc\ndef』,我們可用len(x)得到它的長度為7,\n我們稱之為換行符,實際上是』0X0A』。當我們用』w'即文本方式寫的時候,在windows平台上會自動將』0X0A』變成兩個字元』0X0D』,』0X0A』,即文件長度實際上變成8.。當用』r'文本方式讀取時,又自動的轉換成原來的換行符。如果換成』wb』二進制方式來寫的話,則會保持一個字元不變,讀取時也是原樣讀取。所以如果用文本方式寫入,用二進制方式讀取的話,就要考慮這多出的一個位元組了。』0X0D』又稱回車符。linux下不會變。因為linux只使用』0X0A』來表示換行。
⑤ 風變編程的Python課程學完效果如何
一、Python簡介
Python是一種用來編寫應用程序的高級程序設計語言,TIOBE程序語言排行榜2015年12月的排名如下:
Python實現強勢逆襲,而且我相信,隨著時間的推移,國內Python語言未來前景也是一片向好。
Python的特點是優雅簡單,易學易用(雖然我感覺還是有一些概念不容易理解),Python的哲學是盡量用最少的,最簡單易懂的代碼實現需要的功能。Python適宜於開發網路應用,腳本寫作,日常簡單小工具等等。Python的缺點是效率較低,但是在大量的場合效率卻不是那麼重要或者說Python不是其性能瓶頸,所以不要太在意。其次是2.x-3.x的過渡使得許多3.x還缺少很多2.x下的模塊,不過也在完善中。其次就是源代碼無法加密,發布Python程序其實就是發布源代碼。
二、基礎語法要點
1.如果一個字元串中有許多需要轉義的字元,而又不想寫那麼多'',那麼可以用 r'...' 表示 '...'內的內容不轉義。
2.Python可用'''...'''來表示多行內容,如:
123456>>>print('''line1line2line3''')line1line2line3
3.Python的邏輯運算and, or, not 分別對應C語言中的&&, ||, !.
4.Python的整數與浮點數大小都沒有范圍。
5.Python中除法有兩種: '/'除出來必是浮點數, '//'除出來是整數,即地板除。
6.Python中一切皆引用。每個對象都有一個引用計數器(內部跟蹤變數)進行跟蹤,引用計數值表示該對象有多少個引用,當初次產生賦給變數時,引用計數為1,其後沒進行下列行為中的任意一種都會增加引用計數:
123賦值: a=b用作函數參數傳遞: func(a)成為容器對象的一個元素: lis=[1,2,a]
以下任意一種行為都會減少引用計數:
1234del銷毀:dela變數另賦給其他對象:a=False對象從容器中刪除: lis.remove(a)身在的容器被銷毀:dellis
7.深拷貝與淺拷貝的概念與對比,有點復雜,看這篇文章
8.list,tuple和dict,set
list:為列表,是一個有序集合,類似於數組但又比數組功能強大,可以隨時append,pop元素,下標從0開始,且下標為加n模n制,即lis[-1] = lis[len-1],下標范圍[-len,len-1].
tuple:為元組,類似於list,但list為可變類型,而tuple不可變,即沒有append,pop等函數。一個建議是為了安全起見,能用tuple代替list盡量用tuple。如果tuple只有一個元素,要寫成如(1,)以避免歧義。
dict:字典類型,存放key-value鍵值對,可以根據key迅速地找出value,當然,key必須是不可變類型,如下是錯誤的:
12345>>> dic={[1,2]:'value'}Traceback (most recent call last):File"<pyshell#10>", line1,in<mole>dic={[1,2]:'value'}TypeError: unhashabletype:'list'
list與dict的優劣對比:
1234567dict:1.插入,查找速度快,跟key的數目無關2.需佔用大量內存,內存浪費嚴重list:1.插入,查找速度慢,O(n)的復雜度,隨元素個數增加而增加2.佔用內存小
dict內部存放的順序和key放入的順序是沒有關系的
set:set與dict類似,相當於只有key沒有value的dict,每個key不同,set間有 &, | 等操作對應集合的交,並操作。
三、函數
1.函數是對象,函數名即是指向對應函數對象的引用,所以可以將函數名賦給一個變數,相當於給函數起一個『別名』。
123>>> mmm=max>>> mmm(1,2,3)3
2.Python函數可以返回」多個值「,之所以打引號,是因為實際上返回的多個值拼成了一個元組,返回這個元組。
3.定義默認參數需要牢記:默認參數必須指向不變對象。否則第一次調用和第二次調用結果會不一樣,因為可變的默認參數調用後改變了。
4.可變參數:傳入的參數個數是可變的,可以是0個或多個。可變參數會將你傳入的參數自動組裝為一個tuple。在你傳入的list或tuple名字前加一個 * 即說明傳入的是可變參數。習慣寫法為*args。
5.關鍵字參數:傳入0個或多個含參數名的參數,這些參數被自動組裝成一個dict。習慣寫法**kw,如**a表示把a中所有的鍵值對以關鍵字參數的形式傳入kw,獲得一個dict,這個dict是a的一份拷貝,對kw改動不會傳遞到a
6.命名關鍵字在函數定義中跟在一個*分割符後,如
12deffunc(a,b,*,c,d):pass
c,d為命名關鍵字參數,可以限制調用者可以傳入的參數名,同時可以提供默認值。
7.參數定義順序:必選參數,默認參數,可變參數/命名關鍵字參數,關鍵字參數。
8.切片操作格式為lis[首下標:尾下標:間隔],如果都不填,即lis[::]則代表整個容器lis
9.用圓括弧()括起來一個列表生成式創建一個生成器generator,generator保存生成演算法,我們可以用next(g)取得生成器g的下一個返回值。生成器的好處就是我們不需要提前生成所有列表元素,而是需要時再生成,這在某些情況下可以節省許多內存。演算法也可以不是列表生成式而是自定義函數,只需在函數定義中包含yield關鍵字。
10.map()和rece(): 二者都是高階函數。map()接收兩個參數,一個是函數,一個是Iterable序列,map將傳入的函數依次作用在序列每一個元素上,並把結果作為新的Iterator返回。rece()類似累積計算版的map(),把一個函數作用在一個序列上,每次接收兩個參數,將結果繼續與序列的下一個元素做累積計算。
利用map和rece編寫一個str2float函數,如把字元串'123.456'轉換成浮點數123.456:
123456789101112131415(s):deff1(x,y):returnx*10+ydefchar2num(s):return{'0':0,'1':1,'2':2,'3':3,'4':4,'5':5,'6':6,'7':7,'8':8,'9':9}[s]deff2(x,y):returnx*0.1+ya,b=s.split('.')print('a=',a)print('b=',b)returnrece(f1,map(char2num,a))+0.1*rece(f2,map(char2num,b[::-1]))print('str2float('123.456') =', str2float('123.456'))
11.fliter()函數過濾序列,類似於map()作用於每一元素,根據返回值是True或者False決定舍棄還是保留該元素。函數返回一個Iterator。
12.sorted()函數可實現排序,類似於C++庫中的sort()函數,但是比其更加簡潔,語法為sorted(lis,key=func,reverse=T/F)
key函數可實現自定義的排序規則,reverse表示升序還是降序。
13.一個函數可以返回一個函數,但是返回時該函數並未執行,所以返回函數中不要引用任何可能發生變化的變數,否則會出現邏輯錯誤。
14.裝飾器(decorator): 當需要增強函數的功能卻不希望修改函數本身,那麼可以採用裝飾器這種運行時動態增加功能的方式,增加的功能卸載裝飾器函數中。如在執行前後列印'begin call'和'end call',可以這樣做:
12345678910111213141516importfunctoolsdeflog(func):@functools.wraps(func)#為了校正函數簽名,最好寫上defwrapper(*args,**kw):print('begin call')f=func(*args,**kw)print('end call')returnfreturnwrapper@logdefhah():print('hahahaha')hah()
123
begin callhahahahaend call
15.偏函數: functools.partial(),作用是將一個函數的某些參數固定住,作為新函數的參數,即固定住該參數,返回一個新函數,使調用更簡單。
四、面向對象編程
1.Python實例變數可以自由地綁定任何屬性
2.為了不讓內部屬性不被外部訪問,在屬性的名稱前加上兩個下劃線__,這樣就變成了一個私有變數(private),注意,不能直接訪問不代表一定不能訪問,事實上,加雙下劃線後Python就會將其改名為『_class名__name』,所以還是可以這樣來訪問這個『私有』變數。
3.對於靜態語言,如果要求傳入一個class類型的對象,那麼傳入的對象必須是class類型或者其子類,否則將無法調用class中的方法,而Python這樣的動態語言有『鴨子類型』一說,即不一定要傳入class類型或其子類,而只要保證傳入的對象中有要使用的方法即可。
4.如果想要限制實例可以綁定的屬性,那麼在定義class時定義一個__slots__變數即可,例如:
12classStudent(object):__slots__=(『name』,』age』)
注意,__slots__限制的屬性對當前類實例起完全限製作用,且與子類共同定義其__slots__,也就是說子類可以定義自己的__slots__,子類實例允許定義的屬性就是自身的__slots__加上父類的__slots__,即並集。
5.@ property裝飾器可以使一個getter方法變成屬性,如果方法名為me,那麼@me.setter裝飾器則可使一個setter方法變成屬性。這樣可以使代碼更簡短,同時可對參數進行必要的檢查。
6.通過多重繼承,可使子類擁有多個父類的所有功能。
7.在類中__call__方法可使實例對象像函數那樣直接調用,作用即是該方法定義的過程。
8.ORM(Object Relational Mapping 對象關系映射),就是把關系資料庫的一行映射為一個對象,也就是一個類對應一個表。ORM的實現需要通過metaclass元類修改類的定義。元類可以改變類創建時的行為。
五、調試
1.Python調試方法:
(1)直接列印
(2)斷言
(3)pdb
(4)IDE
六、IO編程
1.序列化: 把變數從內存中變成可存儲或傳輸的過程稱之為序列化。Python用pickle模塊實現序列化。序列化之後,就可以把序列化後的內容存儲到磁碟上或者通過網路進行傳輸。pickle.mps()將對象序列化成一個bytes,而pickle.loads()可以根據bytes反序列化出對象。
2.pickle雖好,但是它專為Python而生,所以要在不同語言間傳遞對象,最好還是xml或者json,而json表示格式是一個字元串,更易讀取,且比xml快,所以更加適宜於對象序列化。Python內置了json模塊,相應方法仍然是mps()和loads()。
3.但是在默認情況下,有些對象是無法序列化的,所以我們有時還需要定製轉換方法,告訴json該如何將某類對象轉換成可序列為json格式的{}對象。如下即是一個轉換方法:
123456defmantodict(std):return{'name': std.name,'age': std.age,'id': std.id}
七、進程與線程
1.Python用mutiprocessing模塊來實現多進程。
2.如果要大量創建子進程,可以使用進程池:
1frommultiprocessingimportPool
示例如下:
12345678....p=Pool(4)foriinrange(5):p.apply_async(long_time_task, args=(i,))print('Waiting for all subprocesses done...')p.close()p.join()print('All subprocesses done.')
要使用進程池需新建Pool對象,對Pool對象調用join()使等待池中所有子進程運行完畢,調用join()方法之前必須調用close(),且此後無法再新加子進程。
3.使用subprocess模塊可以方便的啟動並管理一個子進程,控制其輸入輸出。
4.進程間通信使用Queue,Pipes實現。
5.threading模塊管理線程。threading.lock()創建線程鎖,防止同時訪問互斥資源造成的錯誤,示例如下:
1234567lock=threading.Lock()...lock.acquire()...change(mutex)...lock.release()
6.ThreadLocal可以解決參數在一個線程中各個函數之間互相傳遞的問題。
7.managers模塊實現分布式進程。
八、正則表達式與常用內建模塊
1.re模塊進行正則表達式編譯和匹配,如果該表達式需要匹配很多次,那麼最好進行編譯從而大大節省時間。
正則表達式匹配郵箱例子:
12345678910importrehah=re.compile('[0-9a-zA-Z]+[.[0-9a-zA-Z]+]*@[0-9a-zA-Z]+.[a-z]{2,3}')print(hah.match('[email protected]').group())print(hah.match('[email protected]').group())i=1whilei <10:r=input('請輸入郵箱:')print(hah.match(r).group())i=i+1
2.datetime模塊進行日期和時間的處理,每一個時間對應一個timestamp,我們把1970年1月1日 00:00:00 UTC+00:00時區的時刻稱為epoch time,記為0(1970年以前的時間timestamp為負數),當前時間就是相對於epoch time的秒數,稱為timestamp。字元串和datetime也可以相互轉換,採用strptime()方法,字元串轉換為datetime時需要設定一個識別格式,其中
1%Y-%m-%d%H:%M:%S
分別表示年-月-日 時-分-秒。
從datetime得出月份,星期等字元串用strftime()方法,其中:
1%a,%b%d%H:%M
分別表示星期, 月份 日期 時:分。
示例:
12345678910fromdatetimeimportdatetimer='2015-11-23 12:01'dt=datetime.strptime(r,'%Y-%m-%d %H:%M')print(dt)week=dt.strftime('%a %b %d, %H:%M')print(week)2015-11-2312:01:00Mon Nov23,12:01
3.collections是Python內建的一個集合模塊,提供了許多有用的集合類。
4.Base64是一種任意二進制到文本字元串的編碼方法,常用於在URL、Cookie、網頁中傳輸少量二進制數據。
5.struct模塊用來解決bytes和其他二進制數據類型的轉換。
6.Python的hashlib提供了常見的哈希演算法,如MD5,SHA1等等。hashlib實現簡單登錄:
importhashlibdb={'michael':'','bob':'','alice':''}defget_md5(ostr):md5=hashlib.md5()md5.update(ostr.encode())returnmd5.hexdigest()deflogin(user, password):r=get_md5(password)fornameindb:ifdb[name]==r:returnTruereturnFalseprint(login('bob','abc999'))True
7.Python的內建模塊itertools提供了非常有用的用於操作迭代對象的函數。
8.urllib提供了一系列用於操作URL的功能。如GET,POST...
9.PIL(Python Imaging Library Python圖像庫)是一個強大的圖像處理標准庫,功能強大卻又簡單易用。現在的名字叫做Pillow。可以如下安裝Pillow:
1pip3 install pillow
從下面生成數字驗證碼的程序可以窺其一斑:
九、網路編程和電子郵件
1.網路編程主要是TCP和UDP的編程,示例見【Python網路編程】利用Python進行TCP、UDP套接字編程
2.SMTP是發送郵件的協議,Python內置對SMTP的支持,可以發送純文本郵件、HTML郵件以及帶附件的郵件。Python對SMTP支持有smtplib和email兩個模塊,email負責構造郵件,smtplib負責發送郵件。Python內置一個poplib模塊,實現了POP3協議,可以直接用來收郵件。由於現在絕大多數大型郵件服務商都採取了反垃圾郵件措施,所以這部分的簡單實驗並沒有成功,還需進一步研究,等遇到具體情況再說。
3.Python內嵌了sqlite資料庫,還可以自行安裝連接mysql,MySQL是當前最流行的開源資料庫,在行業內有著廣泛的應用。
十、Web開發和非同步IO
1.WSGI(Web Server Gateway Interface) 伺服器網關介面。
2.Python web 開發框架:
-Flask:流行的Web框架
-Django:全能型Web框架
-web.py:一個小巧的Web框架
-Bottle:和Flask類似的Web框架
-Tornado:Facebook的開源非同步Web框架
3.協程
⑥ python struct模塊使用問題
when you pack a struct, you need to give it the format you need:
Check it here : http://www.python.org/doc//current/library/struct.html
In your case, you should
pack('BBHHHLL', a,b,c,d,e,f,g) # assuming all are unsigned.
⑦ qt中如何解包利用python 的struct.pack()函數打包的數據
在Python中使用struct模塊打包數據和在C/C++語言中定義一個結構體(也是把多個成員打包到一塊)差不多。
只要客戶端告訴了你打包的數據的格式(比如:數據包的總長度、數據包中各個數據域的長度及類型,以及端序——大端還是小端),然後定義一個等價的C語言結構體,並把接收到的數據放入一個這樣的結構體變數(對象)中就完成了解包工作。然後,訪問結構體中的特定成員,就是訪問傳送過來的特定數據了。
⑧ python 怎麼處理二進制文件
處理二進制數據離不開python的struct模塊,struct理解上你可以把它理解為c語言的結構體,使用該模塊的pack和unpack方法,可以很容易的把二進制數據轉換為常用的類型數據,如整型、字元型等
結構體如下:
struct Header
{
unsigned short id;
char[4] tag;
unsigned int version;
unsigned int count;
}
⑨ python中的struct模塊中pack參數個數限制
struct.pack 函數後面的可變長參數沒有參數長度的限制。
另外,如果你已經將所需的參數放入一個叫args 的 tuple中,那麼可以用下面的方法傳給 pack 函數:
args=("H","elloworld",5)
struct.pack("c12si",*args)
#等價於
struct.pack("c12si","H","elloworld",5)
⑩ Python必學的模塊有哪些
簡單來說,模塊就是一堆代碼實現某個功能,它們是已經寫好的.py文件,在我們的.py文件中只需要用import導入模塊就能使用它的功能了。
Python中的模塊有內置標准模塊、開源模塊和自定義模塊。
內置標准模塊就是Python自帶的模塊,即下載好Python就可以直接導入使用的模塊,例如我們之前使用過的math模塊、time模塊等。
開源模塊就是不收費的由好心人寫好的模塊,我們可以通過下載這些模塊後導入使用,開源模塊一般也被我們稱為第三方模塊,例如數據處理工具NumPy、Pandas,以及深度學習著名框架Tensorflow都屬於開源模塊。
自定義模塊與開源模塊相對應,開源模塊是他人寫的,而自定義模塊就是自己寫好的模塊。
Python常見的三個模塊
一、time與datetime模塊
在Python中,通常有這幾種方式來表示時間:
時間戳(timestamp):通常來說,時間戳表示的是從1970年1月1日00:00:00開始按秒計算的偏移量。我們運行「type(time.time())」,返回的是float類型。
格式化的時間字元串(Format String)
結構化的時間(struct_time):struct_time元組共有9個元素共九個元素:(年,月,日,時,分,秒,一年中第幾周,一年中第幾天,夏令時)
二、random模塊
三、os模塊
os模塊是與操作系統交互的一個介面