寫python碰到的一些小細(xì)節(jié)沉衣,總結(jié)一下:
1.pip install太慢
pip install xlrd -i http://pypi.douban.com/simple --trusted-host pypi.douban.com
其中xlrd
為需要下載的包
2.代碼過長,一行寫不下
self.indexcol=['項(xiàng)目', '文件夾名', '報(bào)表job', '圖表名稱', '圖表內(nèi)指標(biāo)數(shù)量', '圖表類型', '描述', \
'指標(biāo)名稱', '指標(biāo)名稱是否使用正則表達(dá)式', '函數(shù)名稱', '函數(shù)區(qū)分選項(xiàng)', '時(shí)間間隔', 'label1是否使用正則表達(dá)式', \
'label1', 'label2是否使用正則表達(dá)式', 'label2', 'label3是否使用正則表達(dá)式', 'label3', \
'instance是否使用正則表達(dá)式', 'instance' ,'hostname是否使用正則表達(dá)式', 'hostname','手工輸入表達(dá)式']
使用\
換行
3. 關(guān)于python形參和實(shí)參蹲姐,淺拷貝和深拷貝
因?yàn)樵谕瑫r(shí)用C++和python,習(xí)慣了C++的使用方式方灾,python的函數(shù)調(diào)用可把我害慘了滤祖,不過也沒有調(diào)太久就發(fā)現(xiàn)了這個bug,還是比較有意思棍潘,寫出來看看恃鞋,順便查查官方的東西看看自己的理解對不對啊。
先說說我自己的理解:
我的使用場景是這樣的:
我需要將一個模板復(fù)制出來亦歉,然后每一次的循環(huán)就只對這個模板的copy修改特定的內(nèi)容恤浪,其余的內(nèi)容不變。然后把修改后的東西放入一個list中肴楷。
第一個需要注意的地方是水由,python的賦值操作 = 有點(diǎn)類似于,C++中的引用赛蔫。
就是對同一塊內(nèi)存重命名砂客,若直接
panel_new=kee
panel["a"]=x
那么對panel修改后泥张,kee對應(yīng)的a下內(nèi)容也會更改。
但實(shí)際上我們想要的結(jié)果是鞭盟,以kee為模板拷貝出一份panel_new圾结,修改對應(yīng)內(nèi)容,對kee不造成改變齿诉,這時(shí)我們就需要使用:
import copy
panel_new=copy.deepcopy(kee)
這才是類似C里面的賦值(即 int a =b;a 和 b對應(yīng)不同的內(nèi)存空間)
第二個需要注意的地方是筝野,Python形參就是實(shí)參,和C++完全不一樣粤剧!
因?yàn)橄葘W(xué)的C歇竟,python全是自學(xué)的,不會才查抵恋,寫代碼的時(shí)候完全沒有意識到這個問題
PANEL=self.jsonbase["panels"]
label=0
for kee in PANEL:
if "targets" not in kee:
continue
if "content" not in kee:
panel_new=copy.deepcopy(kee)
label+=1
if label==num:
break
由于我在調(diào)試時(shí)焕议,覺得把這一段放到了這個函數(shù)里面每一次都copy一次好麻煩鴨,不如把拷貝后的結(jié)果作為參數(shù)傳入弧关,然后每次修改就是了盅安。這樣,在C里面是完全正確的世囊,因?yàn)镃每次函數(shù)的形參都是會重新分配空間别瞭,然后再把實(shí)參賦給形參,但是python顯然不是這樣株憾,你對函數(shù)內(nèi)的形參做了改變蝙寨,實(shí)參也會跟著變化!
所以實(shí)際上這里我就把全部圖改成了一張圖嗤瞎。墙歪。。贝奇。虹菲。
所以還是得自己手動copy一下然后插入。
def add_a_panel(self,target_dict,num):
PANEL=self.jsonbase["panels"]
label=0
for kee in PANEL:
if "targets" not in kee:
continue
if "content" not in kee:
panel_new=copy.deepcopy(kee)
label+=1
if label==num:
break
if "alert" in panel_new:
panel_new.pop("alert")
target_num=target_dict["num"]
target_copy=copy.deepcopy(panel_new["targets"][0])
panel_new["targets"]=[]
for n in range(0,int(target_num)):
target_new=copy.deepcopy(target_copy)
target_new["expr"]=target_dict["expr"][n]
target_new["refId"]=chr(ord('A')+n)
#legendFormat沒有實(shí)現(xiàn)
target_new["legendFormat"]=target_dict["legendFormat"][n]
panel_new["targets"].append(target_new)
panel_new["id"]=11+num*2
panel_new["title"]=target_dict["title"]
panel_new["description"]=target_dict["description"]
panel_new["type"]=target_dict["type"]
self.dict["panels"].append(panel_new)
return
第三個有意思的技巧是弃秆,默認(rèn)參數(shù)
有的時(shí)候我們的類初始化時(shí)需要傳入有這個屬性届惋,有的時(shí)候可以沒有,那么我們可以使用默認(rèn)參數(shù)菠赚。
def __init__(self,targetnum,title,discription,stype=0):
self.dict={}
self.dict["type"] = stype
self.dict["num"] = int(targetnum)
self.dict["title"] = title
self.dict["description"] = discription
例如這個stype就是默認(rèn)參數(shù)為0,如果你在調(diào)用的時(shí)候沒有填type脑豹,那么就默認(rèn)為0 ,填了就是你填入的數(shù)
需要注意的是:默認(rèn)參數(shù)需要寫在最后衡查,不然編譯器怎么知道你有沒有使用默認(rèn)參數(shù)呢瘩欺?
4.正則表達(dá)式
哇這個可以說的東西可太多了,是一個完整的知識點(diǎn),實(shí)際上我自己也沒有完完全全的學(xué)完了所有的表達(dá)(只是這里會用了俱饿,嘿嘿)
列下提綱吧歌粥,反正我會了,這篇文章只是幫助我回憶起知識點(diǎn)的拍埠。
1.字符匹配表
只列舉我認(rèn)為比較常見的
字符 | 描述 |
---|---|
^ | 匹配輸入字符串的開始位置失驶。 |
$ | 匹配輸入字符串的結(jié)束位置。 \d$表示必定以數(shù)字結(jié)尾 |
\d | 匹配一個數(shù)字 |
\w | 匹配一個字符 |
. | 匹配除“\n”之外的任意一個字符 |
* | 匹配0個或多個*前面的字符(經(jīng)常這么用: .* ) |
+ | 匹配1個或多個前面的字符(經(jīng)常這么用: .+ ) |
? | 匹配前面的子表達(dá)式零次或一次枣购。例如嬉探,“do(es)?”可以匹配“does”或“does”中的“do”。?等價(jià)于{0,1}棉圈。 |
{n} | n是一個非負(fù)整數(shù)涩堤。匹配確定的n次。例如分瘾,“o{2}”不能匹配“Bob”中的“o”胎围,但是能匹配“food”中的兩個o。 |
{n,} | n是一個非負(fù)整數(shù)德召。至少匹配n次白魂。例如,“o{2,}”不能匹配“Bob”中的“o”上岗,但能匹配“foooood”中的所有o碧聪。“o{1,}”等價(jià)于“o+”液茎。“o{0,}”則等價(jià)于“o*”辞嗡。 |
{n,m} | m和n均為非負(fù)整數(shù)捆等,其中n<=m。最少匹配n次且最多匹配m次续室。例如栋烤,“o{1,3}”將匹配“fooooood”中的前三個o⊥φ“o{0,1}”等價(jià)于“o?”明郭。請注意在逗號和兩個數(shù)之間不能有空格。 |
2.python正則表達(dá)式函數(shù)
re.search(匹配內(nèi)容丰泊,表達(dá)式)
self.medium.group() 顯示第一個匹配到的內(nèi)容
def pre_decon(self):
#{}解構(gòu)預(yù)處理薯定,先將[]去掉
#將[]的內(nèi)容存在self.medium內(nèi)
self.medium=re.search('\[.+\]',self.expr)
if self.medium == None:
return
else:
self.medium=self.medium.group()
start_loc = self.expr.find(self.medium)
len_substr = len(self.medium)
self.expr = self.expr[:start_loc] + self.expr[start_loc + len_substr:]
start = self.medium.find('[')
end = self.medium.find(']')
self.medium = self.medium[start+1:end]
print(self.medium)
零寬斷言匹配:匹配內(nèi)容不反悔斷言本身
向前斷言:(?=patter)
向后斷言:(?<=patter)
re.compile(pattern)
find=re.findall(p,self.expr)在expr中找到所有匹配上patter編譯后的內(nèi)容的字符串,輸出為列表
import re
def pre_decon(self):
#函數(shù)解構(gòu)預(yù)處理瞳购,先將by()去掉
#hardcode 匹配by的內(nèi)容只能在3-9之間
pattern='(?<=by\\().+?(?=\\))'
p=re.compile(pattern)
find=re.findall(p,self.expr)
if len(find)==0:
self.by ==None
return
else:
self.by=find[0]
start_loc = self.expr.find(self.by)
len_substr = len(self.by)
self.expr = self.expr[:start_loc-3] + self.expr[start_loc + len_substr+1:]