python 中 模塊,包, 與常用模塊


一 模塊

模塊:就是一組功能的集合體, 我們的程序可以直接導入模塊來復用模塊里的功能

導入方式 一般為 : import 模塊名

在python中, 模塊一般分為四個通用類別

1使用python編寫.py 文件

2、已被編譯為共享庫或DLL 的c 或c++擴展

3把一系列模塊組織到一起的文件夾(注:文件夾下有一個__init__.py文件,該文件夾稱之為包)

4、使用c編寫並鏈接到python解釋器的內置模塊

使用模塊的優點:

1、從文件級別組織程序, 更方便管理

2、拿來主義, 提升開發效率

二 使用模塊 import

導入模塊 import

1:語法: import 模塊名

2:在第一次導入模塊時會做三件事,重復導入會直接引用內存中已經加載好的結果

1、為源文件穿件新的名稱空間, 
2、在新建的名稱空間中執行模塊中包含的代碼。
3、創建名字(模塊名)來引用該名稱空間

3:被導入的模塊 有獨立的名稱空間

每個模塊都是一個獨立的名稱空間, 定義在這個模塊中的函數,把這個模塊的名稱空間當做全局名稱空間, 這樣我們在編寫自己的模塊時, 就不用擔心我們定義在自己模塊中全局變量會被導入時 , 與使用者的全局變量沖突。

4 為模塊名起別名

為依據導入的模塊起別人的方式對編寫可擴展的代碼很有用

import span as sm

5 在一行中導入多個模塊   模塊名中間用 “,” 分隔

import sys,os,re

三 使用模塊 form.....import

1、from...import 的使用

1 from 模塊名 import  要讀的read1,read2

 

2 、import  和from ....import   的對比

唯一區別就是:使用from。。import... 則是將spam 中的名字直接導入到當前的名稱空間中, 所有在當前名稱空間中, 直接使用名字就可以了, 無需加前綴 模塊名


優點:使用起來方便了
缺點:容易與當前執行文件中的名字沖突

3、也支持重命名 as

 from spam import read1 as read

4、一行導入多個名字

from spam import read1,read2,money

5、 導入所有   from。。。。import *

#from spam import * 把spam中所有的不是以下划線(_)開頭的名字都導入到當前位置

四:py 文件區分兩種用途:模塊與腳本

編寫好的一個python文件 可以有兩種途徑:

一:腳本,一個文件就是整個程序,用來被執行
二 :模塊,文件中存放着一堆功能,用來唄導入使用


#python為我們內置了全局變量__name__,
    當文件被當做腳本執行時:__name__ 等於'__main__'
    當文件被當做模塊導入時:__name__等於模塊名


#作用:用來控制.py文件在不同的應用場景下執行不同的邏輯
    if __name__ == '__main__':

五:模塊的搜索路徑

模塊的查找順序:內存中已經加載的模塊-->內置模塊---->sys.path路徑中包含的模塊

包就是一個包含有__init__.py文件的文件夾,所以其實我們創建包的目的就是為了用文件夾將文件/模塊組織起來

需要強調的是:

1、在python3中,即使包下沒有__init__.py 文件,import包仍然不會報錯,而python2中若是沒有的話, 就會報錯

2、創建包的目的不是為了運行, 而是被導入使用, 記住,包只是模塊的一種形式而已,包的本質就是一種模塊

一、包的使用之import

1 import glance.db.models
2 glance.db.models.register_models('mysql') 

 

二:包的使用之 from。。。import。。。

1 from glance.db import models

強調:

1、在導入時帶點,  點的左邊必須是一個包, 這是導入包特有的語法
2、包內, 模塊直接的導入應該使用from。。。import。。。
3from。。。import。。。。 import后必須是一個明確的名字, 沒有任何的前綴。




from a.b.c.f  import g.h.x    # 這是錯誤的

#f 的左邊必須是包
import后的名字不能有任何的前綴, 不能有 .

常用模塊

一、time和datetime 模塊

在python中通常有這幾種方式來表達時間:

1:時間戳(timestamp):通常來說, 時間戳表示的是從1970年1月1日 00:00:00 開始按照秒計算的偏移量

2:格式化的時間字符串(Format String)

3:結構化的時間(struct_time):struct_time元組共有9個元素共九個元素:(年,月,日,時,分,秒,一年中第幾周,一年中第幾天,夏令時)

二、random模塊

 1 import random
 2  
 3 print(random.random())#(0,1)----float    大於0且小於1之間的小數
 4  
 5 print(random.randint(1,3))  #[1,3]    大於等於1且小於等於3之間的整數
 6  
 7 print(random.randrange(1,3)) #[1,3)    大於等於1且小於3之間的整數
 8  
 9 print(random.choice([1,'23',[4,5]]))#1或者23或者[4,5]
10  
11 print(random.sample([1,'23',[4,5]],2))#列表元素任意2個組合
12  
13 print(random.uniform(1,3))#大於1小於3的小數,如1.927109612082716 
14  
15  
16 item=[1,3,5,7,9]
17 random.shuffle(item) #打亂item的順序,相當於"洗牌"
18 print(item)

三: os 模塊

os 模塊是與操作系統交互的一個接口

os.getcwd() 獲取當前工作目錄,即當前python腳本工作的目錄路徑
os.chdir("dirname")  改變當前腳本工作目錄;相當於shell下cd
os.curdir  返回當前目錄: ('.')
os.pardir  獲取當前目錄的父目錄字符串名:('..')
os.makedirs('dirname1/dirname2')    可生成多層遞歸目錄
os.removedirs('dirname1')    若目錄為空,則刪除,並遞歸到上一級目錄,如若也為空,則刪除,依此類推
os.mkdir('dirname')    生成單級目錄;相當於shell中mkdir dirname
os.rmdir('dirname')    刪除單級空目錄,若目錄不為空則無法刪除,報錯;相當於shell中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.name    輸出字符串指示當前使用平台。win->'nt'; Linux->'posix'
os.system("bash command")  運行shell命令,直接顯示
os.environ  獲取系統環境變量
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的大小
View Code

 

os路徑處理:

推薦使用:

import  os

import os,sys
possible_topdir = os.path.normpath(os.path.join(
    os.path.abspath(__file__),
    os.pardir, #上一級
    os.pardir,
    os.pardir
))
sys.path.insert(0,possible_topdir)

四: sys模塊

1 sys.argv           命令行參數List,第一個元素是程序本身路徑
2 sys.exit(n)        退出程序,正常退出時exit(0)
3 sys.version        獲取Python解釋程序的版本信息
4 sys.maxint         最大的Int值
5 sys.path           返回模塊的搜索路徑,初始化時使用PYTHONPATH環境變量的值
6 sys.platform       返回操作系統平台名稱

五  序列化:json&pickle

序列化:我們把對象(變量)從內存中編程可存儲或傳輸的過程稱之為序列化,在python中pickling.

序列化的優點

1:持久保存狀態

2:跨平台數據交互  (其中pickle只能讀取python文件,不能跨平台)

import json
import pickle

注意:json 不認單引號,

序列化:

序列化:
json。dumps(dic) 
pickle.dumps(s)


反序列化:
json.loads()
pickle.loads()

六 hashlib 模塊

1:hash:一種算法, 該算法接受傳入的內容,經過運算得到一串 hash值

hash 值得特點是:

#只要傳入的內容是一樣的 得到的hash值必然一樣。 

#不能由hash值返解成內容 ===》把密碼做成hash值,不應該在網絡傳輸明文密碼

#只要使用的hash算法不變, 無論小燕的內容多大, 得到的hash值長度是固定的

# import hashlib
#
# m=hashlib.md5()
# m.update('hello'.encode('utf-8'))
# m.update('world'.encode('utf-8'))
# m.update('egon'.encode('utf-8'))
# print(m.hexdigest()) #3801fab9b8c8d9fcb481017969843ed5

密碼加鹽

import  hashlib
pwd="alex12345"

m=hashlib.me5()
m.update("一行白鷺上青天")
m.update(pwd.encode("utf-8"))
print(m.hexdigest())

七 re模塊(正則)

正則就是用一些具有特殊含義的符號組合到一起(正則表達式)來描述字符或者字符串的方法。或者說正則就是 用來描述一列事物的規則。

在(python 它內嵌在python中, 並通過re模塊來實現。

 

二 常用匹配模式(元字符)

 =================================匹配模式=================================
#一對一的匹配
# 'hello'.replace(old,new)
# 'hello'.find('pattern')

#正則匹配
import re
#\w與\W
print(re.findall('\w','hello egon 123')) #['h', 'e', 'l', 'l', 'o', 'e', 'g', 'o', 'n', '1', '2', '3']
print(re.findall('\W','hello egon 123')) #[' ', ' ']

#\s與\S
print(re.findall('\s','hello  egon  123')) #[' ', ' ', ' ', ' ']
print(re.findall('\S','hello  egon  123')) #['h', 'e', 'l', 'l', 'o', 'e', 'g', 'o', 'n', '1', '2', '3']

#\n \t都是空,都可以被\s匹配
print(re.findall('\s','hello \n egon \t 123')) #[' ', '\n', ' ', ' ', '\t', ' ']

#\n與\t
print(re.findall(r'\n','hello egon \n123')) #['\n']
print(re.findall(r'\t','hello egon\t123')) #['\n']

#\d與\D
print(re.findall('\d','hello egon 123')) #['1', '2', '3']
print(re.findall('\D','hello egon 123')) #['h', 'e', 'l', 'l', 'o', ' ', 'e', 'g', 'o', 'n', ' ']

#\A與\Z
print(re.findall('\Ahe','hello egon 123')) #['he'],\A==>^
print(re.findall('123\Z','hello egon 123')) #['he'],\Z==>$

#^與$
print(re.findall('^h','hello egon 123')) #['h']
print(re.findall('3$','hello egon 123')) #['3']

# 重復匹配:| . | * | ? | .* | .*? | + | {n,m} |
#.
print(re.findall('a.b','a1b')) #['a1b']
print(re.findall('a.b','a1b a*b a b aaab')) #['a1b', 'a*b', 'a b', 'aab']
print(re.findall('a.b','a\nb')) #[]
print(re.findall('a.b','a\nb',re.S)) #['a\nb']
print(re.findall('a.b','a\nb',re.DOTALL)) #['a\nb']同上一條意思一樣

#*
print(re.findall('ab*','bbbbbbb')) #[]
print(re.findall('ab*','a')) #['a']
print(re.findall('ab*','abbbb')) #['abbbb']

#?
print(re.findall('ab?','a')) #['a']
print(re.findall('ab?','abbb')) #['ab']
#匹配所有包含小數在內的數字
print(re.findall('\d+\.?\d*',"asdfasdf123as1.13dfa12adsf1asdf3")) #['123', '1.13', '12', '1', '3']

#.*默認為貪婪匹配
print(re.findall('a.*b','a1b22222222b')) #['a1b22222222b']

#.*?為非貪婪匹配:推薦使用
print(re.findall('a.*?b','a1b22222222b')) #['a1b']

#+
print(re.findall('ab+','a')) #[]
print(re.findall('ab+','abbb')) #['abbb']

#{n,m}
print(re.findall('ab{2}','abbb')) #['abb']
print(re.findall('ab{2,4}','abbb')) #['abb']
print(re.findall('ab{1,}','abbb')) #'ab{1,}' ===> 'ab+'
print(re.findall('ab{0,}','abbb')) #'ab{0,}' ===> 'ab*'

#[]
print(re.findall('a[1*-]b','a1b a*b a-b')) #[]內的都為普通字符了,且如果-沒有被轉意的話,應該放到[]的開頭或結尾
print(re.findall('a[^1*-]b','a1b a*b a-b a=b')) #[]內的^代表的意思是取反,所以結果為['a=b']
print(re.findall('a[0-9]b','a1b a*b a-b a=b')) #[]內的^代表的意思是取反,所以結果為['a=b']
print(re.findall('a[a-z]b','a1b a*b a-b a=b aeb')) #[]內的^代表的意思是取反,所以結果為['a=b']
print(re.findall('a[a-zA-Z]b','a1b a*b a-b a=b aeb aEb')) #[]內的^代表的意思是取反,所以結果為['a=b']

#\# print(re.findall('a\\c','a\c')) #對於正則來說a\\c確實可以匹配到a\c,但是在python解釋器讀取a\\c時,會發生轉義,然后交給re去執行,所以拋出異常
print(re.findall(r'a\\c','a\c')) #r代表告訴解釋器使用rawstring,即原生字符串,把我們正則內的所有符號都當普通字符處理,不要轉義
print(re.findall('a\\\\c','a\c')) #同上面的意思一樣,和上面的結果一樣都是['a\\c']

#():分組
print(re.findall('ab+','ababab123')) #['ab', 'ab', 'ab']
print(re.findall('(ab)+123','ababab123')) #['ab'],匹配到末尾的ab123中的ab
print(re.findall('(?:ab)+123','ababab123')) #findall的結果不是匹配的全部內容,而是組內的內容,?:可以讓結果為匹配的全部內容
print(re.findall('href="(.*?)"','<a href="http://www.baidu.com">點擊</a>'))#['http://www.baidu.com']
print(re.findall('href="(?:.*?)"','<a href="http://www.baidu.com">點擊</a>'))#['href="http://www.baidu.com"']

#|
print(re.findall('compan(?:y|ies)','Too many companies have gone bankrupt, and the next one is my company'))
View Code


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM