【python 4】python 模块
文章目錄
- 一、模塊
- 二、自定義模塊
- 三、包
- 四、sys模塊
- 五、time 模塊
- 六、datetime 模塊
- 七、random 模塊
- 八、hashlib
- 九、第三方模塊
一、模塊
python 中,模塊是代碼組織的一種方式,把功能相近的函數放到一個文件中,一個文件(.py)就是一個模塊(module),模塊名就是文件名去掉后綴 py,這樣做的好處是:
- 提高代碼的可復用,可維護性,一個模塊編寫完畢后,可以很方便的在其他項目中導入
- 解決了命名沖突的問題,不同模塊中相同的命名不會沖突
1、如何自定義模塊
2、使用系統的模塊
二、自定義模塊
import 模塊名 s = 模塊名.方法導入模塊方式:
- import 模塊名
- 模塊名.變量 模塊名.函數 模塊名.類
- from 模塊名 import 變量/函數/類
- 在代碼中可以直接使用
- from 模塊名 import *
- 全部導入,也可以在模塊中使用__all__=[]來限制可以訪問的內容
- 所有import 的形式,所有的內容都會加載,包括模塊里邊執行的方法,但我們不希望這個方法永遠都被執行,就會加一個 if __name__ == '__main__'。在自己的模塊里邊__name__==_ main _ ,如果在其他模塊調用自己,則_ name _就是自己模塊的名字。
1、import 模塊名
# calculate 模塊 # * --utf--8 # 變量 number = 100 name = 'calculate' # 函數 def add(*args):if len(args)>1:sum = 0for i in args:sum += ireturn sumelse:print('至少傳入兩個參數') def minus(*args):if len(args)>1:m = 0for i in args:m -= ireturn melse:print('至少傳入兩個參數') def multiple(*args):pass def divece(*args):pass # 類 class Calculate:def __init__(self,num):self.num = numdef test(self):print('正在進行計算...')@classmethoddef test1(cls):print('----------> calculate 的類方法') 調用的腳本 # 導入模塊 import calculate list1 = [4,7,8] # 使用模塊中的函數 模塊名.變量 模塊名.函數 模塊名.類 result = calculate.add(*list1) print(result) # 使用模塊變量 print(calculate.number) # 使用模塊中的類 cal = calculate.Calculate(80) cal.test() calculate.Calculate.test1() >>> 19 100 正在進行計算... ----------> calculate 的類方法2、from 模塊名 import 函數/變量/類
from calculate import add result = add(*list1) print(result) >>> 193、from 模塊名 import *
from calculate import * result = add(*list1) print(result) >>> 19有時候不希望 * 拿到所有,也可以限制能找到的方法,把希望找到的方法放到__all__ 里邊就好啦。
# calculate.py 里邊加 __all__ = ['add', 'number']4、模塊里邊有自身調用的函數
# calculate.py 里邊的函數,并且調用了 def test():print('我是測試...') test()執行調用的時候:
from calculate import * result = add(*list1) print(result) >>> 我是測試... 19如果不希望加載調用,則解決方法是:
if __name__ == '__main__':test()運行 calculate.py :
if __name__ == '__main__':print(__name__)test() >>> 我是測試... __main__ 我是測試...也就是說:__name__ 的值就是 __main__
運行 part5.py:
把 print(__name__) 方法 外層,用 part5.py 調用后,運行 part5.py:
def test():print('我是測試...') test() print(__name__) if __name__ == '__main__':test() >>> 我是測試... calculate 19也就是說 if __name__ == __main__ 只有在本類里邊才成立,才會執行里邊的內容。別的模塊調我的時候,__name__== 模塊名,所以不會執行的。
三、包
文件夾(Directory):存放非 .py 文件
包(Python Package):存放 .py 文件
包下面的模塊中的類的調用:
from user.models import User u = User('admin', '123456') u.show() >>> admin 123456 from article.models import Article a = Article('個人凍結','nana') a.show() >>> 發表文章的名字:個人凍結,作者是:nana article|--models.py|--__init__.py|--... user|--models.py|--__init__.py|--test.py|--... part5.py calculate.py1、導入方式:
from 包 import 模塊 from 包.模塊 import 類|函數|變量 from 包.模塊 import * from .模塊 import 類(.表示當前目錄下的)注意:所有的 from 都是在項目的基礎上導入的,所以從 test.py 里邊調用 calculate.py 的時候,直接 from calculate import * 就好啦。
# test.py from user.models import User from article.models import Article u = User('admin','123456') a = Article('個人總結','nana') u.publish_article(a) >>> admin 發表了文章: 個人總結 from calculate import add list1 = [1,2,3] result = add(*list1) print(result) >>> admin 發表了文章: 個人總結 62、__init__.py 的作用
__init__.py 文件的作用:當導入包的時候,系統會默認先執行這個文件里邊的東西。
- 有這個文件就相當于包
- 沒有這個文件就相當于文件夾
__init__ 的作用:
- 當包被導入的時候,把一些初始化的函數,變量,類定義在 init.py 中,只要調用包,這些動作就會被執行。
- 此文件中的函數、變量等的訪問,只需要通過 包名.函數名就可以訪問。
from 模塊 import *:默認所有的函數都可以調用,不定義 __all__ 的時候,所有的東西都可以訪問,如果定義了 __all__ ,則在 __all__ 里邊的可以訪問。
from 包 import *:默認所有的模塊都不能訪問,如果需要方法,則需要在 __init__.py 里邊加上__all__=['model','...']
包:user
# user/__init__.py print('--------> user的__init__') # 調用 user 這個包 import user >>> --------> user的__init__也就是說,只要調用了這個包,就會執行 __init__.py里邊的內容。當導入包的時候,系統會默認先執行這個文件里邊的東西。
3、循環導入
循環導入是一種錯誤的方式,可能出現模塊間相互引用的情況,應該避免這種情況。
# A 模塊里邊調用了 B 的函數,B里邊也調用了 A 的函數 A:def test():f() B:def f():test()解決方法:
1、重新架構
2、把 import 放到代碼中間,不要放在開頭
四、sys模塊
當你導入一個模塊,python 解析器對模塊位置的搜索順序是:
1、當前目錄
2、如果不在當前目錄,python則搜索在 shell 變量 PYTHONPATH 下的每個目錄
3、如果都找不到,python 會查看默認路徑,unix 下的默認路徑為 /usr/local/lib/python/。模塊搜索路徑保存在 system 模塊的 sys.path 變量中,變量包含當前目錄。
pycharm 傳參:
五、time 模塊
%Y Year with century as a decimal number.%m Month as a decimal number [01,12].%d Day of the month as a decimal number [01,31].%H Hour (24-hour clock) as a decimal number [00,23].%M Minute as a decimal number [00,59].%S Second as a decimal number [00,61].%z Time zone offset from UTC.%a Locale's abbreviated weekday name.%A Locale's full weekday name.%b Locale's abbreviated month name.%B Locale's full month name.%c Locale's appropriate date and time representation.%I Hour (12-hour clock) as a decimal number [01,12].%p Locale's equivalent of either AM or PM.1、時間戳:time.time()
import time t = time.time() t1 = time.time() print(t) print(t1) >>> 1589196425.641966 (s) 1589196425.641966 (s)2、延遲執行time.sleep()
import time t = time.time() print(t) time.sleep(3) t1 = time.time() print(t1) >>> 1589196500.979713 1589196503.98046283、將時間戳轉化為字符串 time.ctime(t)
s = time.ctime(t) print(s) >>> Mon May 11 19:32:30 20204、將時間戳轉化為元組 time.localtime(t),可以利用 . 來調用里邊的值
s = time.localtime(t) print(s) print(s.tm_yday) >>> time.struct_time(tm_year=2020, tm_mon=5, tm_mday=11, tm_hour=19, tm_min=34, tm_sec=3, tm_wday=0, tm_yday=132, tm_isdst=0) 132 195、將時間戳的形式轉化為字符串
t2 = time.strftime('%Y-%m-%d %H:%M:%S') print(t2) >>> 2020-05-11 19:47:086、把元組的時間轉化為時間戳time.mktime(t)
s = time.localtime(t) t1 = time.mktime(s) print(t1) >>> # 只是取到秒級別 1589196947.07、將字符串轉化為元組的方式
t3 = time.strptime('2020/05/11','%Y/%m/%d') print(t3) >>> time.struct_time(tm_year=2020, tm_mon=5, tm_mday=11, tm_hour=0, tm_min=0, tm_sec=0, tm_wday=0, tm_yday=132, tm_isdst=-1)time 模塊重點:
- time()
- sleep()
- strftime('格式')
六、datetime 模塊
datetime 模塊:time 時間date 日期datetime 日期時間timedelta 時間差 import datetime print(datetime.date.today()) >>> 2020-05-11時間插值的獲取:timedelta(hours = N),N 表示N個小時前
t0 = datetime.timedelta(hours=2) print(t0) t1 = datetime.datetime.now() # 得到當前的日期和時間 print(t1) # 時間差 t = t1-t0 print(t) t = t1+t0 print(t >>> 2:00:00 2020-05-11 20:00:04.238013 2020-05-11 18:00:04.238013 2020-05-11 22:00:04.238013七、random 模塊
# 1、產生0~1間的隨機數 import random ran = random.random() print(ran) >>> 0.5145308460653738 # 2、random.randrange(start, end, steps) 在范圍內產生一個隨機數,不包含start和end ran = random.randrange(1,10,2) print(ran) >>> 5 # 3、在范圍內產生一個隨機數,包含 start 和 end ran = random.randint(1, 10) print(ran) >>> 1 # 3、隨機選擇人名,隨機選擇列表的內容 list1 = ['nini','nana','lili'] ran = random.choice(list1) print(ran) >>> nana 4、打亂列表的順序 shuffle pai = ['紅桃A','方片K','梅花J'] result = random.shuffle(pai) print(result) print(pai) >>> None ['方片K', '紅桃A', '梅花J']練習:
def func():code = ''for i in range(4):ran1 = str(random.randint(0,9))ran2 = chr(random.randint(65, 90))ran3 = chr(random.randint(97,122))r = random.choice([ran1, ran2, ran3])code += rreturn code code = func() print(code) >>> Mru5 3nqNchr 和 ord:
# 1、chr() unicode ——> str print(chr(65)) print(chr(19979)) >>> A 下# 2、ord() str ——> unicode print(ord('A')) print(ord('上')) >>> 65 print(ord('上'))八、hashlib
base64是可以加密解密的,md5是單向的不能解密。
import hashlib msg = '中午一起吃飯!' md5 = hashlib.md5(msg.encode('utf-8')) print(md5.hexdigest()) >>> c13f458695dfb84daa6dadfb8098987a九、第三方模塊
pip install xxx總結
以上是生活随笔為你收集整理的【python 4】python 模块的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: Linux和类Unix系统上5个惊艳的开
- 下一篇: 服务器端 python pdb 调试