Python之模塊和包——第十三天

1、模塊:
(1)定義:在python裏,將一個.py文件稱之爲一個模塊(Module)
(2)模塊的好處:

  • 大大提高了代碼的可維護性
  • 可以被其他模塊引用,提高效率
  • 避免函數名和變量名重複報錯
    (3)模塊的分類:
  • python標準庫(例如import time)
  • 第三方模塊(第三方插件等)
  • 應用程序自定義模塊(自己寫的)
    2、__name__的兩個用法
    (1)被調用模塊的自我測試
if __name__=="__main__":
    print("test測試本模塊功能")

(2)禁止別的模塊調用該模塊,防止其他衝突

if __name__=="__main__":
    main.run()

(3)放在被調用函數裏執行,結果爲main;放在調用函數裏執行,結果是其文件路徑名
3、時間模塊的使用
(1)strftime(format[,t])——把一個代表時間的元組或者struct_time(由time.localtime()和time.gmtime()轉化爲格式化的時間字符串,如果t未指定,將傳入time.localtime().)

import time
print(time.strftime("%Y-%m-%d %X",time.localtime()))

#輸出結果:
2020-01-26 16:58:19

(2)strptime(string[,format])——把一個格式化字符串轉化爲struct_time,實際上和strftime()是逆操作

import time
print(time.strptime("2020-01-26 17:01:21","%Y-%m-%d %X"))

#輸出結果:
time.struct_time(tm_year=2020, tm_mon=1, tm_mday=26, tm_hour=17, tm_min=1, tm_sec=21, tm_wday=6, tm_yday=26, tm_isdst=-1)

(3)datetime

import datetime
print(datetime.datetime.now())

#輸出結果:
2020-01-26 17:18:44.951699

4、隨機模塊(random)
(1)random

import random
ret=random.random()
print(ret)

#輸出結果:
0.3696590055819927

(2)print(randint(1,3))———1,2,3,整數的閉區間[1,3]
(3)print(randrange(1,3))———1,2,整數的半開半閉區間[1,3)
(4)print(choice([1,2,3]))——隨機選取列表中的一個值
(5)print(sample([1,2,3],2))——隨機選取列表中的兩個值
(6)print(uniform(1,3))——選任意類型的浮點型2.408009332454876
(7)shuffle——將列表順序打亂隨機輸出

import random
item=[1,2,3,4,5]
random.shuffle(item)
print(item)

#輸出結果:
[1, 3, 5, 2, 4]

5、隨機驗證碼實例

import random

def code():
    ret=""
    for i in range(5):
        num=random.randint(0,9)
        alf=chr(random.randint(65,122))
        s=str(random.choice([num,alf]))
        ret+=s
    return ret
print(code())

#輸出結果:
數字+字母的隨機五位(不知道爲啥有特殊字符)

6、BASE_DIR
使用BASE_DIR可以取到絕對路徑、相對路徑,使用方法如下:
打印__file__可以查看當前文件路徑

BASE_DIR=os.path.dirname(os.path.dirname(os.path.abspath(__file__)))

7、os模塊
(1)定義:os模塊是與操作系統交互的一個接口
(2)os模塊方法(很多用法和Linux相似)

  • os.getcwd()——獲取當前python腳本的目錄路徑
  • os.chdir(“dirname”)——改變當前腳本目錄;相當於shell下cd
  • os.curdir(".")——返回當前目錄
  • os.pardir("…")——獲取當前目錄的父母了字符串名
  • os.makedirs(“dirname1/dirname2”)——可生成多層遞歸目錄
  • os.removedirs()——若目錄爲空,則刪除,並遞歸到上一級目錄,若也爲空,則刪除,以此類推
  • os.mkdir(“dirname”)——生成單級目錄
  • os.rmdir(“dirname”)——刪除單級”空目錄“
  • os.listdir(“dirname”)——列出目錄下文件和子目錄
  • os.remove()——刪除一個文件
  • os.rename(“oldname”,“newname”)——重命名文件
  • os.stat(“path/filename”)——獲取文件/目錄信息
  • os.sep——輸出操作系統特定的路徑分隔符,win下”\“,Linux下”/“
  • os.linesep——行終止符,win下爲”\t\n“,Linux下爲”\n“
  • os.pathsep——分割文件路徑的字符串,win下爲";",Linux下爲":"
  • os.system(“bash command”)——運行shell命令,直接顯示
  • os.environ——獲取系統環境變量
  • os.path.abspath(path)——獲取path規範化的絕對路徑
  • os.path.split(path)——將path分成目錄和文件名二元組返回
import os
print(os.path.split("/Users/baijie/PycharmProjects/Test/venv/bin/python /Users/baijie/PycharmProjects/Test/venv/hhh/1.py"))

#輸出結果:
('/Users/baijie/PycharmProjects/Test/venv/bin/python /Users/baijie/PycharmProjects/Test/venv/hhh', '1.py')
  • os.path.dirname(path)——返回path目錄,上面輸出結果中元組的第一個元素
  • os.path.basename(path)——返回文件名,上面元組中第二個元素
  • os.path.exists(path)——判斷路徑是否存在,返回結果爲True或者False
  • os.path.isabs(path)——判斷是否是絕對路徑
  • os.path.isfile(path)——判斷是否是存在的文件
  • os.path.isdir(path)——判斷是否是存在的目錄
  • os.path.join(path1[,path2[,…]])——將多個路徑組合後返回,第一個絕對路徑之前的參數將被忽略
  • os.path.getatime(path)——返回path文件或者目錄的最後存取時間
  • os.path.getmtime(path)——返回path文件或者目錄的最後修改時間

8、sys模塊
(1)進度條實例

import time
import sys

for  i in range(100):
    sys.stdout.write("#")
    time.sleep(0.1)
    sys.stdout.flush()

(2)sys.path——查看當前目錄
(3)sys.version——獲取當前解釋器的版本
9、json模塊
(1)json主要用於處理數據
(2)json.dumps()——將所有的數據類型轉換成json字符串格式
**說明:**原理就是將單引變雙引,沒有引號直接加雙引
(3)json.loads()——還原成原來的數據類型
說明: loads不必須在dumps使用後纔可以,只要是符合json格式規則,即都是雙引號就可以使用

10、pickle模塊
pickle模塊和json模塊方法相同,只是表現形式不同,json是轉換爲字符串,pickle轉換成字節。

11、序列化
定義:我們把對象(變量)從內存中變成可存儲或傳輸的過程稱之爲序列化,序列化之後,就可以把序列化的內容寫入磁盤,或者通過網絡傳輸到別的機器上。反之,把變量內容從序列化的對象重新讀到內存裏稱之爲反序列化。

12、XML模塊

xml是實現 不同語言或程序之間進行數據交換的協議,跟json差不多,但json使用起來更加簡單,至今還有很多傳統公司如金融行業的很多系統的接口還是xml,xml是通過<>節點數據結構的。

13、re模塊

(1)就其本質而言,正則表達式(re)是一種小型的、高度專業化的編碼語言,它內嵌在python中,並通過re模塊實現,正則表達式模式被編譯成一系列的字節碼,然後由C編寫的匹配引擎執行。
(2)正則表達式用處:用於模糊匹配
(3)小實例:找出字符串中的數字(假如姓名年齡寫一起了)

import re
s="alex22kangkang34bcde45"
s1=re.findall("\d+",s)
print(s1)

#輸出結果:
['22', '34', '45']

(4)正則表達式說明(所有的正則都是針對其前面一個字符說的)

  • 普通字符:大多數字符和字母都會和自身相匹配
 import re
ls=re.findall("abcde","abcdeoo0pdfd")
print(ls)

#輸出結果:
['abcde']

說明:
前面是要查找的字符,後面是全部字符串,如果查找的字符串不存在,輸出[]

  • 元字符:. ^ $ * + ? {} [] | ()
    1).是通配符 ,一個.代表一個字符
import re
a=re.findall("a..d","abcdeoo0pdfd")
b=re.findall("..","abcdeoo0pdfd")
print(a)
print(b)

#輸出結果:
['abcd']
['ab', 'cd', 'eo', 'o0', 'pd', 'fd']

2)^用於查看開頭的字符串,只能在字符串的開頭匹配內容

import re
a=re.findall("^a..d","abcdeoo0pdfd")
print(a)

#輸出結果:
['abcd']

3)$用於查找結尾的字符串

import re
a=re.findall("..fd$","abcfdeoo0pdfd")
print(a)

#輸出結果:
['pdfd']

4)*、+、?的區別
*匹配範圍[0,+00),+匹配範圍[1,+00),?匹配範圍[0,1],均符合貪婪匹配規則,有則取最大的

import re
a=re.findall("abd*","abcfdeoodab")
b=re.findall("abd+","abcfdeoodab")
print(a)
print(b)

#輸出結果:
['ab', 'ab']
[]

還可以混合使用

import re
a=re.findall("alex*?","abcfdealexxxxxx")
b=re.findall("alex+?","abcfdealexxxxxx")
print(a)
print(b)

#輸出結果:
['ale']
['alex']

5){}中間內容自定義,格式{a}、{a,b}、{a,}不寫默認爲無窮
6)[]或,只取一個

import re
a=re.findall("a[bl]","abcfdealexxxxxx")
b=re.findall("a[a-z]","abc")
print(a)
print(b)

#輸出結果:
['ab', 'al']
['ab']

7)當^放在[]裏面時,表示非

import re
b=re.findall("a[^a-z]","a97bc0987654")
print(b)

#輸出結果:
['a9']

8)如果想找的字符中包含元字符,用\,轉義一下就是普通的字符了,查找最裏面層()的內容,看實例

import re
a=re.findall("\([^()]*\)","12+66*6+2-8*(2-1)")
print(a)

#輸出結果:
['(2-1)']

9)\爲轉義字符,,可以讓有意義的變沒意義,沒意義的變有意義
,即讓元字符變成普通字符,讓普通字符變成有意義的字符
\d——匹配任何十進制數,相當於[0-9]
\D——匹配任何非數字字符,相當於[^0-9]
\s——匹配任何空白字符,相當於[\t\n\r\f\v]
\S——匹配任何非空白字符,相當於[^\t\n\r\f\v]
\w——匹配任何字母數字字符,相當於[a-zA-Z0-9_]
\W——匹配任何非字母數字字符,相當於[^a-zA-Z0-9_]
\b——匹配一個特殊字符邊界,比如空格、#、@

10)| 爲或,|作爲分割線,查找左右兩側的,左側爲一個整體,右側爲一個整體

import re
a=re.findall("cb|a","cb90hfjsfafbfj")
print(a)

#輸出結果:
['cb', 'a']

11)()分組

12)search()——查找一次就結束

import re
a=re.search("[a-z]+","alex36kangkang18").group()
print(a)

#輸出結果:
alex

13)?P也是分組,看實例

import re
a=re.search("(?P<name>[a-z]+)\d+","alex36kangkang18").group()
print(a)

#輸出結果:
alex36

加了分組,根據相應組名搜索,如下

import re
a=re.search("(?P<name>[a-z]+)\d+","alex36kangkang18").group("name")
print(a)

#輸出結果:
alex
import re
a=re.search("(?P<name>[a-z]+)(?P<age>\d+)","alex36kangkang18").group("name","age")
print(a)

#輸出結果:
('alex', '36')

13)split()——將字符去掉,並且分組,去掉的以”“顯示

import re
a=re.split("[abc]","ablalalaoooccd")
print(a)

#輸出結果:
['', '', 'l', 'l', 'l', 'ooo', '', 'd']

14)sub()——替換字符串
參數有4個,第一爲需要替換的字符,第二爲想要替換成的字符,第三爲全部字符串,第四爲替換幾個,第四可有可無

import re
a=re.sub("\d","A","abcde00008888",2)
print(a)

#輸出結果:
abcdeAA008888

15)subn()——可以自動統計替換次數

import re
a=re.subn("\d","A","abcde00008888")
print(a)

#輸出結果:
('abcdeAAAAAAAA', 8)

14、Class
__init __()函數不能有返回值,默認返回爲None

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章