pythonempty
A. python如何創建空數組
Python創建空數組的三種方式:
1、numpy指定形狀為0
實際上,empty生成的數組當然可以為空,只要我們指定了相應的形狀。例如,如果我們傳入數組的形狀參數為(0,3),則可以生成目標空數組:
所以,生成的數組是否為空,不在於你用的是不是empty,而在於傳入的形狀參數。當然, 這里的empty換成ones或者zeros也都可以,只要形狀是(0, 3)即可。
2、利用空列表創建
初始化numpy數組的一種方式是由列表創建,那麼當我們傳入的列表是空列表時即可創建空數組。特別的,為了創建指定列數的空列表,我們需要傳入指定個數的嵌套空列表,然後轉置即可。
3、利用pandas轉換生成
numpy和pandas是一對好搭檔,常常需要對二者數據進行轉換,在創建空數組時自然也可以。為了創建一個空數組,我們可以首先考慮先創建一個空的DataFrame,然後由其轉換為numpy對象即實現了創建空數組。
首先,我們創建一個僅有列名、而沒有索引和值的空DataFrame:
進而,可由該DataFrame對象轉化為空數組:
B. python反向解析 reverse出現pop from empty list錯誤
答: 從提示pop from the empty list可以得知,在訪問列表時出現了列表為空,然後還試圖將其彈出的情況,你可以看看在你的代碼中中,是不是有刪除列表元素的操作,那麼在刪除之前可以先判斷一下列表是否為空,為空的話,則不進行操作。希望可以幫助到你。
C. python 錯誤:empty separator ,急求解!!!
在Python錯誤代碼中,空分隔符表示缺少字元,此時,只需找到指定的位置並添加字元即可解決錯誤,因為在程序執行期間,pyton解釋器將檢查程序中是否存在語法錯誤,例如,當出現程序錯誤P時,Python解釋器將指出錯誤的行。
(3)pythonempty擴展閱讀:
Python使用動態類型系統,在編譯時,python不檢查對象是否具有要調用的方法或屬性,但在運行時才檢查,因此,在操作對象時可能會引發帶纖異常,然而,盡管Python使用動態類型系統,但它也是強類型的,Python禁止未顯式定義的操作,例如數字加字元串。
與其它面向對象語言一樣,python允許程序員定義類型要構造對象,只需像調用函數一樣調用類型。例如,對於先前定義的fish類型,使用fish(蠢敗仿)。類型本身也是一個特殊類型的對象(類型本身也是一個類型對象),它允許類型的反射編程。
Python具有豐富的內置數據類型。與Java和C++相比,這些數據類型有效地減少了代碼枯培的長度。下面的列表簡要描述了python內置的數據類型(對於python 3)。十)。
Python使用與C、Java類似的運算符,支持整數與浮點數的數學運算,同時還支持復數運算與無窮位數(實際受限於計算機的能力)的整數運算,除了求絕對值函數abs()外,大多數數學函數處於math和cmath模塊內。前者用於實數運算,而後者用於復數運算。
D. python多進程中隊列不空時阻塞,求解為什麼
最近接觸一個項目,要在多個虛擬機中運行任務,參考別人之前項目的代碼,採用了多進程來處理,於是上網查了查python中的多進程
一、先說說Queue(隊列對象)
Queue是python中的標准庫,可以直接import 引用,之前學習的時候有聽過著名的「先吃先拉」與「後吃先吐」,其實就是這里說的隊列,隊列的構造的時候可以定義它的容量,別吃撐了,吃多了,就會報錯,構造的時候不寫或者寫個小於1的數則表示無限多
import Queue
q = Queue.Queue(10)
向隊列中放值(put)
q.put(『yang')
q.put(4)
q.put([『yan','xing'])
在隊列中取值get()
默認的隊列是先進先出的
>>> q.get()
『yang'
>>> q.get()
4
>>> q.get()
[『yan', 『xing']
當一個隊列為空的時候如果再用get取則會堵塞,所以取隊列的時候一般是用到
get_nowait()方法,這種方法在向一個空隊列取值的時候會拋一個Empty異常
所以更常用的方法是先判斷一個隊列是否為空,如果不為空則取值
隊列中常用的方法
Queue.qsize() 返回隊列的大小
Queue.empty() 如果隊列為空,返回True,反之False
Queue.full() 如果隊列滿了,返回True,反之False
Queue.get([block[, timeout]]) 獲取隊列,timeout等待時間
Queue.get_nowait() 相當Queue.get(False)
非阻塞 Queue.put(item) 寫入隊列,timeout等待時間
Queue.put_nowait(item) 相當Queue.put(item, False)
二、multiprocessing中使用子進程概念
from multiprocessing import Process
可以通過Process來構造一個子進程
p = Process(target=fun,args=(args))
再通過p.start()來啟動子進程
再通過p.join()方法來使得子進程運行結束後再執行父進程
from multiprocessing import Process
import os
# 子進程要執行的代碼
def run_proc(name):
print 'Run child process %s (%s)...' % (name, os.getpid())
if __name__=='__main__':
print 'Parent process %s.' % os.getpid()
p = Process(target=run_proc, args=('test',))
print 'Process will start.'
p.start()
p.join()
print 'Process end.'
上面的程序運行後的結果其實是按照上圖中1,2,3分開進行的,先列印1,3秒後列印2,再3秒後列印3
代碼中的p.close()是關掉進程池子,是不再向裡面添加進程了,對Pool對象調用join()方法會等待所有子進程執行完畢,調用join()之前必須先調用close(),調用close()之後就不能繼續添加新的Process了。
當時也可以是實例pool的時候給它定義一個進程的多少
如果上面的代碼中p=Pool(5)那麼所有的子進程就可以同時進行
三、多個子進程間的通信
多個子進程間的通信就要採用第一步中說到的Queue,比如有以下的需求,一個子進程向隊列中寫數據,另外一個進程從隊列中取數據,
#coding:gbk
from multiprocessing import Process, Queue
import os, time, random
# 寫數據進程執行的代碼:
def write(q):
for value in ['A', 'B', 'C']:
print 'Put %s to queue...' % value
q.put(value)
time.sleep(random.random())
# 讀數據進程執行的代碼:
def read(q):
while True:
if not q.empty():
value = q.get(True)
print 'Get %s from queue.' % value
time.sleep(random.random())
else:
break
if __name__=='__main__':
# 父進程創建Queue,並傳給各個子進程:
q = Queue()
pw = Process(target=write, args=(q,))
pr = Process(target=read, args=(q,))
# 啟動子進程pw,寫入:
pw.start()
# 等待pw結束:
pw.join()
# 啟動子進程pr,讀取:
pr.start()
pr.join()
# pr進程里是死循環,無法等待其結束,只能強行終止:
print
print '所有數據都寫入並且讀完'
四、關於上面代碼的幾個有趣的問題
if __name__=='__main__':
# 父進程創建Queue,並傳給各個子進程:
q = Queue()
p = Pool()
pw = p.apply_async(write,args=(q,))
pr = p.apply_async(read,args=(q,))
p.close()
p.join()
print
print '所有數據都寫入並且讀完'
如果main函數寫成上面的樣本,本來我想要的是將會得到一個隊列,將其作為參數傳入進程池子里的每個子進程,但是卻得到
RuntimeError: Queue objects should only be shared between processes through inheritance
的錯誤,查了下,大意是隊列對象不能在父進程與子進程間通信,這個如果想要使用進程池中使用隊列則要使用multiprocess的Manager類
if __name__=='__main__':
manager = multiprocessing.Manager()
# 父進程創建Queue,並傳給各個子進程:
q = manager.Queue()
p = Pool()
pw = p.apply_async(write,args=(q,))
time.sleep(0.5)
pr = p.apply_async(read,args=(q,))
p.close()
p.join()
print
print '所有數據都寫入並且讀完'
這樣這個隊列對象就可以在父進程與子進程間通信,不用池則不需要Manager,以後再擴展multiprocess中的Manager類吧
關於鎖的應用,在不同程序間如果有同時對同一個隊列操作的時候,為了避免錯誤,可以在某個函數操作隊列的時候給它加把鎖,這樣在同一個時間內則只能有一個子進程對隊列進行操作,鎖也要在manager對象中的鎖
#coding:gbk
from multiprocessing import Process,Queue,Pool
import multiprocessing
import os, time, random
# 寫數據進程執行的代碼:
def write(q,lock):
lock.acquire() #加上鎖
for value in ['A', 'B', 'C']:
print 'Put %s to queue...' % value
q.put(value)
lock.release() #釋放鎖
# 讀數據進程執行的代碼:
def read(q):
while True:
if not q.empty():
value = q.get(False)
print 'Get %s from queue.' % value
time.sleep(random.random())
else:
break
if __name__=='__main__':
manager = multiprocessing.Manager()
# 父進程創建Queue,並傳給各個子進程:
q = manager.Queue()
lock = manager.Lock() #初始化一把鎖
p = Pool()
pw = p.apply_async(write,args=(q,lock))
pr = p.apply_async(read,args=(q,))
p.close()
p.join()
print
print '所有數據都寫入並且讀完'
E. python必背入門代碼是什麼
python必背代碼是:
defnot_empty(s):
returnsandlen(s。strip())>0
#returnsands。strip()
#如果直接單寫s。strip()那麼s如果是None,會報錯,因為None沒有strip方法。
#如果s是None,那麼Noneand任何值都是False,直接返回false
#如果s非None,那麼判定s。trip()是否為空。
這樣子filter能過濾到None,"",""這樣的值。
分成兩部分看。第一部分是對長度進行序列。相當於就是range(5)他的結果就是。01234。第二部分就是具體的排序規則。排序規則是用nums的值進行排序,reverse沒申明就是默認升序。就是用nums(0到4)的值進行排序,根據這個結果返回的一個range(5)的數組。
python必背內容:
1、變數。指在程序執行過程中,可變的量。定義一個變數,就會伴隨有3個特徵,分別是內存ID,數據類型和變數值。常量,指在程序執行過程中,不可變的量。一般都用大寫字母定義常量。
2、與程序交互。古時候,我們去銀行取錢,需要有一個銀行業務員等著我們把自己的賬號密碼輸入給他,然後他去進行驗證等成功後,我們再將取款金額輸入,告訴他。
驕傲的現代人,會為客戶提供一台ATM機,讓ATM機跟用戶交互,從而取代人力。然而機器是死的,我們必須為其編寫程序來運行,這就要求我們的編程語言中能夠有一種能與用戶交互,接收用戶輸入數據的機制。
F. 如何編寫高質量的python程序
寫出規范的代碼是寫出高質量代碼的第一步,並且有助於培養仔細的習慣。
為了培養規范寫代碼的習慣,可以安裝flake8這個工具,它不僅可以檢查代碼風格是否符合官方建議(PEP8),而且還能找出潛在的隱患(用Pyflakes做語法分析),更逆天的是還能檢測到你有些函數寫的太復雜(代碼圈復雜度)了,更更逆天的是可以設置git commit之前必須通過這些檢查。
當然具體操作需要根據自己的項目進行一些定製,比如可以忽略E501,W293。
空白項目模版
好的開始是成功的一半,寫python代碼就從pyempty開始吧。
在github上看一下那些經典的項目,web.py,flask, pep8,他們的項目目錄都很規范,綜合借鑒了一些項目的特點,我寫了這個pyempty項目。
1.README.md 這里寫你項目的簡介,quick start等信息,雖然distutils要求這個文件沒有後綴名,但github上如果後綴是.md的話可以直接轉換成html顯示。
2.ChangeLog.txt 該文件存放程序各版本的變更信息,也有一定的格式,參考web.py的ChangeLog.txt
3.LICENES.txt 這里存放你項目使用的協議,不要編寫自己的協議。
4.requirements.txt 如果你的項目需要依賴其它的python第三方庫,在這里一行一個寫出來,可能pip install的時候能自動幫你安裝
5.setup.py 安裝腳本,後面詳細介紹
6.docs 裡面存放你的項目文檔,如概要設計,詳細設計,維護文檔,pydoc自動生成的文檔等,強烈推薦大家使用MarkDown格式編寫文檔
7.src 這個目錄里存放項目模塊的主要代碼,盡量不要把模塊目錄直接放到根目錄,模塊代碼目錄可以在setup.py里指定的
8.tests 這個目錄存放所有單元測試,性能測試腳本,單元測試的文件確保以test_做前綴,這樣distutils會自動打包這些文件,並且用python -m unittest discover -s ./ -p 'test_*.py' -v 可以直接執行這些測試
單元測試
Martin Fowler:"在你不知道如何測試代碼之前,就不該編寫程序。而一旦你完成了程序,測試代碼也應該完成。除非測試成功,你不能認為你編寫出了可以工作的程序。"
我們有很多理由不寫單元測試,歸根結底是懶,雖然代碼大全上說:
大部分研究都發現,檢測比測試的成本更小。NASA軟體工程實驗室的一項研究發現,閱讀代碼每小時能夠檢測出來的缺陷要比測試高出80%左右(Basili and Selby 1987)。後來,IBM的一項研究又發現,檢查發現的一個錯誤只需要3.5個工作時,而測試則需要花費15-25個工作時(Kaplan 1995)。
但是單元測試還是讓別人相信你的代碼有很高質量的最有力證據。
好了,請詳細閱讀:
深入python3.0: 單元測試-2.x也適用
Unit testing framework 不完整中文版
文檔
敏捷開發不是提倡什麼文檔也不寫,沒有文檔就沒有傳承和積累,輪崗或新人接手任務就會遇到很大的麻煩,所以我決定每個項目最少要寫以下文檔:
1.nalysis.model.md 概要設計文檔,不同於README.md文件,該文檔應該寫於項目開發之前,把項目有哪些功能,大概分幾個模塊等項目整體概述信息寫一下。
2.design.model.md 詳細設計文檔,不用太詳細,至少把項目依賴哪些東西,誰依賴這個項目,重要演算法流程描述,代碼整體結構等寫出來。
3.maintain.md 維護文檔,這個我覺得最重要,你的服務都記錄哪些日誌,需要監控哪些業務指標,如何重啟,有哪些配置項等,沒這些東西,你的項目很難運維。
上面這些文檔都是項目全局性的文檔,不適合寫在docstring或注視里,所以要有單獨的文檔。
打包
python有專門的模塊打包系統distutils,你可以用這套機制把你的代碼打包並分發到Pypi上,這樣任何人都可以用pip或easy_install安裝你的模塊。
如果你開發的是內部項目,還可以用mypypi架設私有的pypi,然後把項目的大的版本更新發布到內部的pypi上,配置管理人員和運維人員可以很方便的從pypi上拉取代碼安裝到測試環境或生產環境。
發布大版本的時候要給版本命名及編寫ChangeList,可以參考Git Pro的相關章節,主要記住以下幾個命令。
git tag -a v0.1 -m 'my test tag' #給大版本命名,打Tag
git describe master #給小版本命名,Git將會返回一個字元串,由三部分組成:最近一次標定的版本號,加上自那次標定之後的提交次數,再加上一段SHA-1值
git shortlog --no-merges master --not v0.1 #生成版本簡報,ChangeList
python有自己的打包機制,所以一般不要用git archive命令。
當然大版本管理用pypi管理比較合適,小的bug fix,緊急上線等好多公司都是用git直接從生產環境拉代碼更新,因為git,svn等可以很方便的撤銷某次更新,回滾到某個位置。
如何管理好大版本上線和小的緊急上線,我還沒理清思路,歡迎大家參與討論。
關於打包,請閱讀如下鏈接:
Python 打包指南
深入Python3.0:打包 Python 類庫
python打包:分發指定文件
出自:http://developer.51cto.com/art/201209/356603.htm