python還有一個(gè)標(biāo)準(zhǔn)庫math庫,用來進(jìn)行常用的數(shù)據(jù)計(jì)算。
創(chuàng)新互聯(lián)公司始終堅(jiān)持【策劃先行,效果至上】的經(jīng)營理念,通過多達(dá)十載累計(jì)超上千家客戶的網(wǎng)站建設(shè)總結(jié)了一套系統(tǒng)有效的營銷推廣解決方案,現(xiàn)已廣泛運(yùn)用于各行各業(yè)的客戶,其中包括:混凝土攪拌站等企業(yè),備受客戶贊美。
python math模塊:
我引用別人的文章來回答:
python-科學(xué)計(jì)算1:兩個(gè)基本的模塊的安裝與測試
在網(wǎng)上看到了一本《用Python做科學(xué)計(jì)算的》的書,感覺挺有趣的,就下載下來學(xué)習(xí)了一下。
但這本書一開始就講配置環(huán)境,Python(X,Y)等東西,我覺得這個(gè)反而增加了入門的難度,倒不如一開始就用一些原始的python IDE介紹,
使讀者不覺得那么的難。我現(xiàn)在讀了25頁,要用到本書的例子,就安裝兩個(gè)模塊:NumPy,Scipy可以在 找到他倆。
「 生命完美的答案,無非走過沒有遺憾 ---《天藍(lán)》」
「如何能夠解析腳本運(yùn)行命令行選項(xiàng)(位于 sys.argv 中)」
argparse 模塊可被用來解析命令行選項(xiàng)
常用來定義一個(gè)腳本的說明文檔,一般我們寫python腳本會通過 if..else 的方式來提供一個(gè)腳本說明文檔,python不支持switch。所以很麻煩,其實(shí),我們可以通過 argparse 來編寫說明文檔。
我們來看看怎么執(zhí)行一個(gè)python腳本
對于熟悉Linux的小伙伴下面的文檔在熟悉不過了,這個(gè)一個(gè)標(biāo)準(zhǔn)Linxu軟件包的說明文檔,文檔中定義是軟件包的說明
來看看這個(gè)腳本是如何編寫的
為了解析命令行選項(xiàng), 首先要?jiǎng)?chuàng)建一個(gè) ArgumentParser 實(shí)例, 使用 add_argument() 方法聲明你想要支持的選項(xiàng)。在每個(gè) add-argument() 調(diào)用中:
dest 參數(shù)指定解析結(jié)果被指派給屬性的名字。 metavar 參數(shù)被用來生成幫助信息。
action 參數(shù) 指定跟屬性對應(yīng)的處理邏輯,通常的 值為 store , 被用來存儲 某個(gè)值 或?qū)?多個(gè)參數(shù)值收集到一個(gè)列表中 。
nargs 參數(shù)收集 所有剩余的命令行參數(shù)到一個(gè)列表中。在本例中它被用來構(gòu)造一個(gè)文件名列表
action='store_true' 根據(jù)參數(shù)是否存在來設(shè)置一個(gè)位置 Boolean 標(biāo)志:
action='store' 參數(shù)接受一個(gè)單獨(dú)值并將其存儲為一個(gè)字符串
如果一個(gè)都沒有,會提示缺少參數(shù) -p/--pat
choices={'slow', 'fast'}, 參數(shù)說明接受一個(gè)值,但是會將其和可能的選擇值做比較,以檢測其合法性:
一旦參數(shù)選項(xiàng)被指定,你就可以執(zhí)行 parser.parse() 方法了。它會處理 sys.argv 的值并返回一個(gè)結(jié)果實(shí)例。每個(gè)參數(shù)值會被設(shè)置成該實(shí)例中 add_argument() 方法的 dest 參數(shù)指定的屬性值。
還很多種其他方法解析命令行選項(xiàng)??梢詴謩拥靥幚? sys.argv 或者使用 getopt 模塊 。但是,如果你采用本節(jié)的方式,將會減少很多冗余代碼,底層細(xì)節(jié) argparse 模塊 已經(jīng)幫你處理好了。你可能還會碰到使用 optparse 庫解析選項(xiàng)的代碼。盡管 optparse 和 argparse 很像 ,但是后者更先進(jìn),因此在新的程序中你應(yīng)該使用它。
「你寫了個(gè)腳本,運(yùn)行時(shí)需要一個(gè)密碼。此腳本是交互式的,因此不能將密碼在腳本中硬編碼,而是需要彈出一個(gè)密碼輸入提示,讓用戶自己輸入?!?/p>
Python 的 getpass 模塊 正是你所需要的。你可以讓你很輕松地彈出密碼輸入提示,并且不會在用戶終端顯示密碼。
代碼中 getpass.getuser() 不會彈出用戶名的輸入提示。它會根據(jù)該 用戶的 shell 環(huán)境 或者會依據(jù) 本地系統(tǒng)的密碼庫 (支持 pwd 模塊的平臺)來使用 當(dāng)前用戶的登錄名
在bash中編寫pytohn腳本接收外部數(shù)據(jù)的方式,一般情況下,對于一般變量,我們用命令行變量的方式比較多(手動的處理 sys.argv ),對于 文件內(nèi)容或者bash命令輸出 直接通過腳本內(nèi)部獲取需要的數(shù)據(jù)。
其實(shí)python 腳本也可以用其他方式來接收 傳遞給他的 文件數(shù)據(jù)或者bash命令輸出 ,包括將 命令行的輸出 通過 管道傳遞 給該腳本、 重定向文件到該腳本 ,或在 命令行中傳遞一個(gè)文件名 或 文件名列表 給該腳本。
這里通過 Python 內(nèi)置的 fileinput 模塊 ,可以實(shí)現(xiàn)重 定向,管道,以文佳輸出 的方式傳遞數(shù)據(jù)到腳本內(nèi)部
使用 fileinput.input() 方法可以獲取當(dāng)前輸入腳本的數(shù)據(jù),腳本里面用一個(gè) FileInput 迭代器接收
文件直接接收
重定向接收
管道方式接收
fileinput.input() 創(chuàng)建并返回一個(gè) FileInput 類的實(shí)例,該實(shí)例可以被當(dāng)做一個(gè) 上下文管理器 使用。因此,整合起來,如果我們要寫一個(gè)打印多個(gè)文件輸出的腳本,那么我們需要在輸出中包含文件名和行號
「你想執(zhí)行一個(gè)外部命令并以 Python 字符串的形式獲取執(zhí)行結(jié)果?!?/p>
使用 subprocess.check_output() 函數(shù)。
執(zhí)行下試試
如果被執(zhí)行的命令以非零碼返回,就會拋出異常。下面的例子捕獲到錯(cuò)誤并獲取返回碼:
默認(rèn)情況下, check_output() 僅僅返回輸入到標(biāo)準(zhǔn)輸出的值。如果你需要 同時(shí)收集標(biāo)準(zhǔn)輸出和錯(cuò)誤輸出 ,使用 stderr 參數(shù):
如果你需要用一個(gè)超時(shí)機(jī)制來執(zhí)行命令,使用 timeout 參數(shù):
通常來講,命令的執(zhí)行 不需要 使用到 底層 shell 環(huán)境(比如 sh、bash) 。一個(gè)字符串列表會被傳遞給一個(gè) 低級系統(tǒng)命令 ,比如 os.execve() 。
如果你想讓 命令被一個(gè)shell 執(zhí)行 ,傳遞一個(gè)字符串參數(shù),并設(shè)置參數(shù) shell=True . 有時(shí)候你想要 Python 去執(zhí)行一個(gè)復(fù)雜的 shell 命令 的時(shí)候這個(gè)就很有用了,比如管道流、I/O 重定向和其他特性。例如:
是在 shell 中執(zhí)行命令會存在一定的安全風(fēng)險(xiǎn),特別是當(dāng)參數(shù)來自于用戶輸入時(shí)。這時(shí)候可以使用 shlex.quote() 函數(shù) 來將參數(shù)正確的用雙引用引起來。
使用 check_output() 函數(shù) 是執(zhí)行 外部命令 并獲取其 返回值 的最簡單方式。但是,如果你需要對 子進(jìn)程做更復(fù)雜的交互 ,比如給它發(fā)送輸入,你得采用另外一種方法。這時(shí)候可直接使用 subprocess.Popen 類。
關(guān)于子進(jìn)程,簡單來看下
也可以進(jìn)程列表同協(xié)程結(jié)合的方式。你既可以在子shell中 進(jìn)行繁重的處理工作,同時(shí)也不會讓子shell的I/O受制于終端。
如果直接丟到后臺會自動在終端輸出IO
subprocess 模塊對于依賴 TTY 的外部命令不合適用 。例如,你不能使用它來自動化一個(gè)用戶輸入密碼的任務(wù)(比如一個(gè) ssh 會話)。這時(shí)候,你需要使用到第三方模塊了,比如基于著名的 expect 家族的工具(pexpect 或類似的)(pexpect可以理解為Linux下的expect的Python封裝、通過pexpect可以實(shí)現(xiàn)對ssh、ftp、passwd、telnet等命令行進(jìn)行自動交互,而無需人工干涉來達(dá)到自動化的目的。比如我們可以模擬一個(gè)FTP登錄時(shí)所有交互,包括輸入主機(jī)地址、用戶名、密碼、上傳文件等,待出現(xiàn)異常還可以進(jìn)行嘗試自動處理。)
「你想向標(biāo)準(zhǔn)錯(cuò)誤打印一條消息并返回某個(gè)非零狀態(tài)碼來終止程序運(yùn)行」
通過 python 的 raise SystemExit(3) 命令可以主動拋出一個(gè)錯(cuò)誤,通過 sys.stderr.write 將命令寫到標(biāo)準(zhǔn)的輸出端
直接將消息作為參數(shù)傳給 SystemExit() ,那么你可以省略其他步驟
拋出一個(gè) SystemExit 異常,使用錯(cuò)誤消息作為參數(shù),它會將消息在 sys.stderr 中打印,然后程序以狀態(tài)碼 1 退出
「你需要知道當(dāng)前終端的大小以便正確的格式化輸出?!?/p>
使用 os.get terminal size() 函數(shù) 來做到這一點(diǎn)。
「復(fù)制或移動文件和目錄,但是又不想調(diào)用 shell 命令?!?/p>
shutil 模塊 有很多便捷的函數(shù)可以復(fù)制文件和目錄。使用起來非常簡單
這里不多講,熟悉Linux的小伙伴應(yīng)該不陌生。
默認(rèn)情況下,對于 符號鏈接 這些命令處理的是它指向的東西文件。例如,如果 源文件 是一個(gè) 符號鏈接 ,那么目標(biāo)文件將會是 符號鏈接 指向的文件。如果你只想 復(fù)制符號鏈接本身 ,那么需要指定 關(guān)鍵字 參數(shù) follow_symlinks
copytree() 可以讓你在復(fù)制過程中選擇性的忽略某些文件或目錄。你可以提供一個(gè)忽略函數(shù),接受一個(gè)目錄名和文件名列表作為輸入,返回一個(gè)忽略的名稱列表。例如:
對于文件元數(shù)據(jù)信息, copy2() 這樣的函數(shù)只能盡自己最大能力來保留它。 訪問時(shí)間、創(chuàng)建時(shí)間和權(quán)限 這些基本信息會被保留,但是 對于所有者、ACLs、資源 fork 和其他更深層次的文件元信息就說不準(zhǔn)了
通常不會去使用 shutil.copytree() 函數(shù) 來執(zhí)行 系統(tǒng)備份 。當(dāng)處理文件名的時(shí)候,最好使用 os.path 中的函數(shù)來確保最大的可移植性
使用 copytree() 復(fù)制文件夾的一個(gè)棘手的問題是對于錯(cuò)誤的處理,可以使用異常塊處理,或者通過 參數(shù) ignore dangling symlinks=True 忽略掉無效符號鏈接。
「創(chuàng)建或解壓常見格式的歸檔文件(比如.tar, .tgz 或.zip)」
shutil 模塊擁有兩個(gè)函數(shù)—— make archive() 和 unpack archive() 可派上用場,
make archive() 的第二個(gè)參數(shù)是期望的輸出格式??梢允褂?get archive formats() 獲取所有支持的歸檔格式列表。
「你需要寫一個(gè)涉及到文件查找操作的腳本,比如對日志歸檔文件的重命名工具,你不想在 Python 腳本中調(diào)用 shell,或者你要實(shí)現(xiàn)一些 shell 不能做的功能?!?/p>
查找文件,可使用 os.walk() 函數(shù) ,傳一個(gè)頂級目錄名給它
os.walk() 方法 為我們 遍歷目錄樹 ,每次進(jìn)入一個(gè)目錄,它會返回一個(gè) 三元組 ,包含 相對于查找目錄的相對路徑,一個(gè)該目錄下的目錄名列表,以及那個(gè)目錄下面的文件名列表。
對于每個(gè)元組,只需檢測一下目標(biāo)文件名是否在文件列表中。如果是就使用 os.path.join() 合并路徑。為了避免奇怪的路徑名比如 ././foo//bar ,使用了另外兩個(gè)函數(shù)來修正結(jié)果
os.walk(start) 還有跨平臺的優(yōu)勢。并且,還能很輕松的加入其他的功能。我們再演示一個(gè)例子,下面的函數(shù)打印所有最近被修改過的文件:
打印10分鐘之前被修改的數(shù)據(jù)
「怎樣讀取普通.ini 格式的配置文件?」
configparser 模塊 能被用來讀取配置文件
編寫配置文件
如果有需要,你還能修改配置并使用 cfg.write() 方法將其寫回到文件中
「你希望在腳本和程序中將診斷信息寫入日志文件。」
python 腳本打印日志最簡單方式是使用 logging 模塊
五個(gè)日志調(diào)用( critical(), error(), warning(), info(), debug() )以降序方式表示不同的嚴(yán)重級別。 basicConfig() 的 level 參數(shù)是一個(gè) 過濾器 。所有級別低于此級別的日志消息都會被忽略掉。每個(gè) logging 操作的參數(shù)是一個(gè)消息字符串,后面再跟一個(gè)或多個(gè)參數(shù)。構(gòu)造最終的日志消息的時(shí)候我們使用了 % 操作符來格式化消息字符串。
如果你想使用配置文件,可以像下面這樣修改 basicConfig() 調(diào)用:
logconfig.ini
在調(diào)用日志操作前先執(zhí)行下 basicConfig() 函數(shù)方法 ,可以找標(biāo)準(zhǔn)輸出或者文件中輸出
basicConfig() 在程序中只能被執(zhí)行一次。如果你稍后想改變?nèi)罩九渲茫托枰全@取 root logger ,然后直接修改它。
更多見日志模塊文檔
「你想給某個(gè)函數(shù)庫增加日志功能,但是又不能影響到那些不使用日志功能的程序?!?/p>
對于想要執(zhí)行日志操作的函數(shù)庫,你應(yīng)該創(chuàng)建一個(gè)專屬的 logger 對象,并且像下面這樣初始化配置:
使用這個(gè)配置,默認(rèn)情況下不會打印日志,只有配置過日志系統(tǒng),那么日志消息打印就開始生效
通常來講,不應(yīng)該在函數(shù)庫代碼中 自己配置日志系統(tǒng) ,或者是已經(jīng)有個(gè)已經(jīng)存在的日志配置了。調(diào)用 getLogger( name ) 創(chuàng)建一個(gè)和調(diào)用模塊同名的 logger 模塊 。由于 模塊 都是唯一的,因此創(chuàng)建的 logger 也將是唯一 的。所以當(dāng)前進(jìn)程中只有一個(gè)logging會生效。
log.addHandler(logging.NullHandler()) 操作將一個(gè) 空處理器 綁定到剛剛已經(jīng)創(chuàng)建好的 logger 對象 上。一個(gè)空處理器默認(rèn)會忽略調(diào)用所有的日志消息。因此,如果使用該函數(shù)庫的時(shí)候還沒有配置日志,那么將不會有消息或警告出現(xiàn)。
在這里,根日志被配置成僅僅 輸出 ERROR 或更高級別的消息 。不過, somelib 的日志級別被單獨(dú)配置成可以輸出 debug 級別的消息, 它的優(yōu)先級比全局配置高。像這樣更改單獨(dú)模塊的日志配置對于調(diào)試來講是很方便的,因?yàn)槟銦o需去更改任何的全局日志配置——只需要修改你想要更多輸出的模塊的日志等級。(這個(gè)還有待研究)
「你想記錄程序執(zhí)行多個(gè)任務(wù)所花費(fèi)的時(shí)間」
time 模塊 包含很多函數(shù)來執(zhí)行跟時(shí)間有關(guān)的函數(shù)。盡管如此,通常我們會在此基礎(chǔ)之上構(gòu)造一個(gè)更高級的接口來模擬一個(gè)計(jì)時(shí)器。
這個(gè)類定義了一個(gè)可以被用戶根據(jù)需要啟動、停止和重置的計(jì)時(shí)器。它會在elapsed 屬性中記錄整個(gè)消耗時(shí)間。下面是一個(gè)例子來演示怎樣使用它:
這里通過 __enter__,__exit__ ,使用 with 語句 以及上下文管理器協(xié)議可以省略計(jì)時(shí)器打開和關(guān)閉操作。(關(guān)于上下文管理協(xié)議,即with語句,為了讓一個(gè)對象兼容with語句,必須在這個(gè)對象的類中聲明 __enter__和__exit__方法, , __enter__ 在出現(xiàn)with語句被調(diào)用, __exit__ 在代碼執(zhí)行完畢被調(diào)用,可以參考o(jì)pen()方法)
在計(jì)時(shí)中要考慮一個(gè) 底層的時(shí)間函數(shù)問題 。 一般來說, 使用 time.time() 或 time.clock() 計(jì)算的時(shí)間精度因操作系統(tǒng)的不同會有所不同。而使用 time.perf_counter() 函數(shù)可以確保使用系統(tǒng)上面 最精確的計(jì)時(shí)器 。
「你想對在 Unix 系統(tǒng)上面運(yùn)行的程序設(shè)置內(nèi)存或 CPU 的使用限制。」
resource 模塊 能同時(shí)執(zhí)行這兩個(gè)任務(wù)。例如,要限制 CPU 時(shí)間,下面的代碼在windows平臺執(zhí)行不了,但是Linux是可以的。
程序運(yùn)行時(shí), SIGXCPU 信號 在時(shí)間過期時(shí)被生成,然后執(zhí)行清理并退出。
這暫時(shí)沒有好的Demo...
程序運(yùn)行到?jīng)]有多余內(nèi)存時(shí)會拋出 MemoryError 異常。
setrlimit() 函數(shù) 被用來設(shè)置特定資源上面的 軟限制和硬限制 。
setrlimit() 函數(shù) 還能被用來設(shè)置 子進(jìn)程數(shù)量、打開文件數(shù)以及類似系統(tǒng)資源的限制(cgroup) 。
「通過腳本啟動瀏覽器并打開指定的 URL 網(wǎng)頁」
webbrowser 模塊 能被用來啟動一個(gè)瀏覽器,并且與平臺無關(guān)
新窗口打卡網(wǎng)站
當(dāng)前窗口打開一個(gè)tab頁
指定瀏覽器類型,可以使用 webbrowser.get() 函數(shù)
from functools import reduce
def mycos(x, n = 10):
s = 0
for i in range(n):
s += (-1) ** i * x ** (2 * i) / fac(2 * i)
return s
def fac(n):
if n == 0:
return 1
else:
return reduce((lambda x, y: x * y), range(1, n + 1))
程序縮進(jìn)如圖所示
學(xué)習(xí)Python庫,首先要知道Python庫有哪些功能與作用,再了解如何去使用,掌握使用語法,然后再實(shí)踐,多多使用就可以掌握了,以下是十大比較受歡迎的機(jī)器學(xué)習(xí)庫:
1. Pipenv
Pipenv 是 Kenneth Reitz 的業(yè)余項(xiàng)目,旨在將其他軟件包(例如 npm 和 yarn)整合到 Python 里。它不需要安裝 virtualenv, virtualenvwrapper,不用管理 requirements.txt 文件,并且不用確保依賴版本的可復(fù)現(xiàn)性。通過 Pipenv,你可以在 Pipfile 中指定依賴項(xiàng)。該工具可生成一個(gè) Pipfile.lock 文件,使你的構(gòu)建更具確定性,避免產(chǎn)生難以查找的 Bug。
2.PyTorch
PyTorch是Facebook深度學(xué)習(xí)框架,源于 Torch 框架,同時(shí)改善了 Torch 框架,基于ython 語言,由于實(shí)現(xiàn)了動態(tài)計(jì)算圖范式, PyTorch 已經(jīng)成為眾多研究人員的首選框架之一,可以計(jì)算梯度,而且非???,可擴(kuò)展性強(qiáng)。
3. Caffe2
Caffe2 支持分布式訓(xùn)練、部署(即使是在移動平臺上),新的 CPU 和支持 CUDA 的硬件。PyTorch 可能更適合做研究,而 Caffe2 更加適合大規(guī)模部署,就像在 Facebook 上看到的那樣。另外,你可以在 PyTorch 里構(gòu)建并訓(xùn)練模型,同時(shí)用 Caffe2 部署。
4. Pendulum
Pendulum 的優(yōu)勢之一在于,它是 Python 標(biāo)準(zhǔn) datetime 替代品,因此你可以輕松地將其與現(xiàn)有的代碼集成,并且在你需要的時(shí)候才使用它的功能。Pendulum 的作者特別注意時(shí)間分區(qū)的處理,默認(rèn)在每個(gè)實(shí)例中時(shí)間分區(qū)是可用的,并且以 UTC 計(jì)時(shí)。你也可以獲得擴(kuò)展 timedelta 來簡化 datetime 的計(jì)算。
5. Dash
Dash 是一個(gè)可構(gòu)建 Web 應(yīng)用,尤其是數(shù)據(jù)可視化 Web 應(yīng)用的純 Python 開源庫。它建立在 Flask、Plotly 和 React 之上,并提供這幾個(gè)框架的函數(shù)抽象接口,從而開發(fā)者不必學(xué)習(xí)這些框架,高效開發(fā)。這些應(yīng)用程序可在瀏覽器和移動設(shè)備中使用。
6. PyFlux
PyFlux 是專門針對時(shí)間序列開發(fā)的 Python 開源庫。時(shí)間序列研究是統(tǒng)計(jì)學(xué)和經(jīng)濟(jì)學(xué)的子領(lǐng)域,其目的是用于描述時(shí)間序列的行為,同時(shí)也預(yù)測時(shí)序未來的行為狀態(tài)。
7. Fire
Fire 是一個(gè)開源庫,可以為任何 Python 項(xiàng)目自動生成一個(gè)命令行界面。你幾乎不需要編寫任何代碼或者文檔,你只需要調(diào)用一個(gè) Fire 方法并把它傳遞給你想要的命令行界面:一個(gè)函數(shù)、一個(gè)對象、一個(gè)類、一個(gè)庫,甚至不傳遞任何參數(shù)。
8. imbalanced-learn
imbalanced-learn 是一個(gè) Python 庫,它提供了相關(guān)的技術(shù)來解決數(shù)據(jù)不平衡的問題。另外,它和 scikit-learn 兼容,并且是 scikit-learn-contrib 項(xiàng)目的一部分,非常有用。
9. FlashText
FlashText 證明了算法和數(shù)據(jù)結(jié)構(gòu)設(shè)計(jì)的重要性,即使對于簡單的問題,更好的算法也能夠輕松超越在快 CPU 上運(yùn)行的樸素實(shí)現(xiàn)。
10. Luminoth
Luminoth 是一個(gè)用 TensorFlow 和 Sonnet 構(gòu)建的開源的計(jì)算機(jī)視覺 Python 工具包。它可直接支持物體檢測,背后支持的模型是 Faster R-CNN。
也可以用python自帶的安裝工具,pip install numpy scipy 等。如果沒有pip的話,可以試試easy-install numpy scipy。打開cmd,在里面輸入這些命令。 不想自己一個(gè)一個(gè)裝的話,最簡單的方法是安裝python(x,y)套裝,也可以考慮enthought套裝
這個(gè)名稱聽起來很奇怪,但是在字符串匹配方面,F(xiàn)uzzyWuzzy是一個(gè)非常有用的庫。
它可以方便地實(shí)現(xiàn)字符串匹配率等操作。
它還可以方便地匹配保存在不同數(shù)據(jù)庫中的記錄。