Python自用記錄
- 1、python規範
- 2、time子產品
- 3、等待
- 4、 print格式化輸出(%占位)
- 5、子產品導入
- 6、類
- 6、logging子產品報錯
- 7、open() 函數:打開檔案,并傳回檔案對象
- 8、format():字元串格式化填充
- 9、美化json
- 10、range():産生一個正整數清單
- 11、random():産生随機資料
- 12、assert、isinstance()
- 666、常用
1、python規範
踩坑記錄:
1: 類或函數定義後,上下應有2空行
2: 運算符兩邊加上空格,比如 “=”
3: l = get_size() 複制時,有提示
ambiguous variable name 'l'
(變量名 'l’不明确)
解決:應避免使用字元l,O,I來作為變量名,因為這些字元容易使人與數字1,0混淆
4: #擷取螢幕尺寸,注釋左邊内容提示:
block comment should start with #
解決:注釋時,#後加空格“# 擷取螢幕尺寸”
5: driver.swipe(x1,y1,x1,y2,1000),代碼提示:
missing whitespace after","
(",“後面缺少空格)
解決:”,"後加空格,driver.swipe(x1, y1, x1, y2, 1000)
6: too many blank lines ( 3 ) ,上下行空行太多,超過2行會有此提示
7: print (‘yes’) ,提示
whitespace before "("
解決:括号前有空格,去掉空格即可
8: 提示
no newline at end of file
,因為檔案結尾沒有換行符,末尾換行即可
9: print(“His height is %f “% 1.833) ,提示:
missing whitespace around operator
(操作符周圍缺少空格)
解決:(”%)改為(” % )即可
10: class test6 建立類是提示
Class names should use Camelcase convention
(類名應使用camelcase約定)
解決:類名首字母大寫,test6 改為 Test6
11: 函數内定義變量Threads = [],提示:
Variable in function should be lowercase
(函數中的變量應為小寫)
解決:變量首字母小寫 threads = []
12:
def t():
函數内有變量為
t
,提示:
Shadows name ' t' from outer scope
(來自外部作用域的陰影名稱“t”),函數内部的變量,如果和函數被調用的外部的變量一樣的話,就被PyCharm中叫做shadows name
這樣的話,容易引發不容易覺察到的,由于函數内部和外部的變量名一緻而引發的一些問題,是以保證確定函數内部和外部的變量名不要重複即可
解決:函數
def t()
改為
def th()
或修改函數内部變量名稱
收集記錄:
¥ 右括号前不要加空格
¥ 逗号、冒号、分号前不要加空格
¥ 函數的左括号前不要加空格。如Func(1)
¥序列的左括号前不要加空格。如list[2]
¥ 操作符左右各加一個空格,不要為了對齊增加空格
¥ 函數預設參數使用的指派符左右省略空格
¥ if/for/while語句中,即使執行語句隻有一句,也必須另起一行
2、time子產品
1、擷取目前時間
from datetime import datetime
print(datetime.utcnow().strftime('%Y-%m-%d %H:%M:%S.%f')[:-3])
datetime.utcnow():目前時間
strftime(’%Y-%m-%d %H:%M:%S.%f’)[:-3]:格式化時間格式,且後三位數字不展示
#輸出:
2019-07-01 06:13:35.306
2、格式化
import datetime
now = datetime.datetime.now()
print(now.strftime('%Y'+'%m'+'%d'+'_'+'%H'+'%M'+'%S'))
#輸出:
20190711_135732
3、補充
import datetime
now = datetime.datetime.now()
#假設時間為:2013年9月17日21點10分6秒
now.strftime('%Y')
'2013'
now.strftime('%y')
'13'
now.strftime('%H')
'21'
now.strftime('%M')
'10'
now.strftime('%S')
'06'
3、等待
# 1
from time import sleep
sleep(0.5) #等待0.5秒
sleep(1) #等待1秒
#2
import time
time.sleep(0.5)
# 還可以把它賦給一個本地的名稱
x = time.sleep
x(1) # 與time.sleep(1)效果一樣
使用時機: 一般等待頁面加載完成時使用
4、 print格式化輸出(%占位)
# %s列印字元串
# %s占位 , % 後面内容輸出在占位%s位置
print("His name is %s, he is boy !" % "Aviad")
name = Aviad
print("His name is %s, he is boy !" % name)
#輸出結果:
His name is Aviad, he is boy !
His name is Aviad, he is boy !
# %d列印整數
print("He is %d years old " % 2)
#輸出結果:
He is 2 years old
# %f列印浮點數
print("His height is %f " % 1.833)
print("His height is %.2f " % 1.833) # %.2f 指定保留小數點後2位數
#輸出結果:
His height is 1.833000
His height is 1.83
#以下方法對%s,%d,%f都有效
#%2s意思是字元串長度為2,當原字元串的長度超過2時,按原長度列印,是以%2s的列印結果還是Aviad
print("His name is %2s, he is boy !" % "Aviad")
#輸出結果:
His name is Aviad, he is boy !
#%7s意思是字元串長度為7,當原字元串的長度小于7時,在原字元串左側補空格
print("His name is %-7s, he is boy !" % "Aviad")
#輸出結果:
His name is Aviad, he is boy !
#%-7s意思是字元串長度為7,當原字元串的長度小于7時,在原字元串右側補空格
print("His name is %-7s, he is boy !" % "Aviad")
#輸出結果:
His name is Aviad , he is boy !
5、子產品導入
test6.py 代碼如下:
x = "tester"
def name():
print("test6")
name()
# 執行檔案本身test6.py 輸出為:
test6
test7.py 代碼如下:
from test6 import x
def boy():
print('he is a ' + x)
boy()
# 執行檔案本身test7.py 輸出為:
test6
he is a tester
結論:可以看到 test7.py 隻調用了 test6.py 中變量x,但是 test7.py 執行時輸出了 test6.py 中
name()
,因為一個子產品被另一個程式第一次引入時,其主程式将運作。如果我們想在子產品被引入時,子產品中的某一程式塊不執行,我們可以用__name__屬性來使該程式塊僅在該子產品自身運作時執行。
test6.py 代碼修改:
x = "tester"
def name():
print("test6")
if __name__ == '__main__':
name()
此時執行 test7.py 輸出如下:
he is a tester
是以,
if __name__ == '__main__'
的意思是:當.py檔案被直接運作時,
if __name__ == '__main__'
之下的代碼塊将被運作;當.py檔案以子產品形式被導入時,
if __name__ == '__main__'
之下的代碼塊不被運作。
6、類
1、 建立Student類,類名首字母大寫,(Object)表示該類從哪個類繼承下來的,Object類是所有類都會繼承的類
class Testers(object):
pass
2、 執行個體:定義好了類,就可以通過Student類建立出Student的執行個體,建立執行個體是通過類名+()實作:
3、 類起模闆的作用,建立的同時可以添加必需的屬性。使用内置方法__init__,比如在建立Testers類時,把name、age屬性綁上去
class Testers(object):
def __init__(self, name, age):
self.name = name
self.age = age
# 上方代碼中,self就是指類本身,self.name就是Testers類的屬性變量,是Testers類所有。
# name是外部傳來的參數,不是Testers類所自帶的。
# self.name = name的意思就是把外部傳來的參數name的值指派給Testers類自己的屬性變量self.name
def hello(self):
print('hello %s ,your age is %s' % (self.name, self.age))
# 在類中定義函數隻有一點不同,就是第一參數永遠是類的本身執行個體變量self,并且調用時,不用傳遞該參數。
# 除此之外,類的方法函數和普通函數沒啥差別,你既可以用預設參數、可變參數或者關鍵字參數
# 這些封裝資料的函數是和Testers類本身是關聯起來的,稱之為類的方法
# 補充:*args是可變參數,args接收的是一個tuple,**kw是關鍵字參數,kw接收的是一個dict
testers = Testers('luye', 18)
print(testers.name)
print(testers.age)
testers.hello()
# 輸出結果:
luye
18
hello luye ,your age is 18
注意:
- __init__方法的第一參數永遠是self,表示建立的類執行個體本身,是以,在__init__方法内部,就可以把各種屬性綁定到self,因為self就指向建立的執行個體本身。
- 有了__init__方法,在建立執行個體的時候,就不能傳入空的參數了,必須傳入與__init__方法比對的參數,但self不需要傳,Python解釋器會自己把執行個體變量傳進去。
- 在Python中,變量名類似__xxx__的,也就是以雙下劃線開頭,并且以雙下劃線結尾的,是特殊變量,特殊變量是可以直接通路的,不是private變量,是以,不能用__name__、__score__這樣的變量名。
- 以一個下劃線開頭的執行個體變量名,比如_name,這樣的執行個體變量外部是可以通路的,但是,按照約定俗成的規定,當你看到這樣的變量時,意思就是,“雖然我可以被通路,但是,請把我視為私有變量,不要随意通路”。
6、logging子產品報錯
報錯資訊:
AttributeError: module 'logging' has no attribute 'basicConfig
導緻原因: 建立的Python檔案取名logging,和系統提供的logging子產品重名導緻了該報錯.
解決方法: 修改.py檔案名
---------------------------------------------------------------------------------------------------------------------
報錯資訊:
TypeError: Level not an integer or a valid string: <function info at 0x0000027613AE1E18>
導緻原因: 代碼中(logging.basicConfig(level=logging.info))關鍵字info應該為大寫
import logging
logging.basicConfig(level=logging.info)
logging.debug('debug info')
logging.info('hello 51zxw !')
logging.warning('warning info')
logging.error('error info')
logging.critical('critical info')
解決方法: info改為INFO
7、open() 函數:打開檔案,并傳回檔案對象
函數說明:
Python open() 函數用于打開一個檔案,并傳回檔案對象,在對檔案進行處理過程都需要使用到這個函數,如果該檔案無法被打開,會抛出 OSError。
注意:使用 open() 函數一定要保證關閉檔案對象,即調用 close() 函數。
open() 函數常用形式是接收兩個參數:檔案名(file)和模式(mode)。
open(file, mode='r')
完整的文法格式為:
open(file, mode='r', buffering=-1, encoding=None, errors=None, newline=None, closefd=True, opener=None)
參數說明:
file
: 必需,檔案路徑(相對或者絕對路徑)。
mode
: 可選,檔案打開模式
buffering
: 設定緩沖
encoding
: 一般使用utf8
errors
: 報錯級别
newline
: 區分換行符
closefd
: 傳入的file參數類型
opener
:
mode 參數有:
模式 | 描述 |
---|---|
t | 文本模式 (預設)。 |
x | 寫模式,建立一個檔案,如果該檔案已存在則會報錯。 |
b | 二進制模式。 |
+ | 打開一個檔案進行更新(可讀可寫)。 |
U | 通用換行模式(不推薦)。 |
r | 以隻讀方式打開檔案。檔案的指針将會放在檔案的開頭。這是預設模式。 |
rb | 以二進制格式打開一個檔案用于隻讀。檔案指針将會放在檔案的開頭。這是預設模式。一般用于非文本檔案如圖檔等。 |
r+ | 打開一個檔案用于讀寫。檔案指針将會放在檔案的開頭。 |
rb+ | 以二進制格式打開一個檔案用于讀寫。檔案指針将會放在檔案的開頭。一般用于非文本檔案如圖檔等。 |
w | 打開一個檔案隻用于寫入。如果該檔案已存在則打開檔案,并從開頭開始編輯,即原有内容會被删除。如果該檔案不存在,建立新檔案。 |
wb | 以二進制格式打開一個檔案隻用于寫入。如果該檔案已存在則打開檔案,并從開頭開始編輯,即原有内容會被删除。如果該檔案不存在,建立新檔案。一般用于非文本檔案如圖檔等。 |
w+ | 打開一個檔案用于讀寫。如果該檔案已存在則打開檔案,并從開頭開始編輯,即原有内容會被删除。如果該檔案不存在,建立新檔案。 |
wb+ | 以二進制格式打開一個檔案用于讀寫。如果該檔案已存在則打開檔案,并從開頭開始編輯,即原有内容會被删除。如果該檔案不存在,建立新檔案。一般用于非文本檔案如圖檔等。 |
a | 打開一個檔案用于追加。如果該檔案已存在,檔案指針将會放在檔案的結尾。也就是說,新的内容将會被寫入到已有内容之後。如果該檔案不存在,建立新檔案進行寫入。 |
ab | 以二進制格式打開一個檔案用于追加。如果該檔案已存在,檔案指針将會放在檔案的結尾。也就是說,新的内容将會被寫入到已有内容之後。如果該檔案不存在,建立新檔案進行寫入。 |
a+ | 打開一個檔案用于讀寫。如果該檔案已存在,檔案指針将會放在檔案的結尾。檔案打開時會是追加模式。如果該檔案不存在,建立新檔案用于讀寫。 |
ab+ | 以二進制格式打開一個檔案用于追加。如果該檔案已存在,檔案指針将會放在檔案的結尾。如果該檔案不存在,建立新檔案用于讀寫。 |
預設為文本模式,如果要以二進制模式打開,加上 b 。
執行個體
測試檔案 test.txt,内容如下:
RUNOOB1
RUNOOB2
f = open('test.txt')
f.read()
# 輸出:
'RUNOOB1\nRUNOOB2\n'
open(“C:\Users\Spirit\Desktop\bc.txt”,‘r’) #會報錯
由于python中的 ‘\’ 是轉義符号,要想輸出\ 的辦法有兩種:
1 、在\後再加\ 就是\ 的形式
把第二行改為infile =open(“C:\Users\Spirit\Desktop\bc.txt”,‘r’) 即可
2、在路徑前加個 r ,意思是按原始字元處理 。
eg: infile =open(r"C:\Users\Spirit\Desktop\bc.txt",‘r’)
好的 檔案就可以讀取了!
8、format():字元串格式化填充
string字元串類型的内建函數,用于對字元串進行格式化填充,并傳回處理後的字元串
# {}中無數字時起占位作用,傳值按順序從0開始升序
str = '一個籃子{}個雞蛋,{}個籃子有{}個雞蛋'
str.format(3,4,3*4)
# {}中有數字時,代表下标
str = '一個籃子{2}個雞蛋,{1}個籃子有{0}個雞蛋'
str.format(3*4,4,3)
# 輸出結果一緻:
一個籃子3個雞蛋,4個籃子有12個雞蛋
9、美化json
import json
yhfc = {"測試": 1, "前端": 1, "後端": 2, "UI": 1}
print(json.dumps(yhfc))
print(json.dumps(yhfc, indent=4)) # indent 美化輸出時縮進占位數
print(json.dumps(yhfc, indent=4, ensure_ascii=False))
# ensure_ascii預設為True,utf-8格式非ASCII編碼内容會被編譯成ASCII編碼輸出,要想得到字元的真實表示,需要設定為False
#輸出:
{"\u6d4b\u8bd5": 1, "\u524d\u7aef": 1, "\u540e\u7aef": 2, "UI": 1}
{
"\u6d4b\u8bd5": 1,
"\u524d\u7aef": 1,
"\u540e\u7aef": 2,
"UI": 1
}
{
"測試": 1,
"前端": 1,
"後端": 2,
"UI": 1
}
10、range():産生一個正整數清單
range(起始值,結束值,低增值)
起始值:可不填寫,預設值為0
低增值:可不填寫,預設值為1
range(100):0~99的整數
range(1,100):1~99的整數
11、random():産生随機資料
import random
random.random() # 0-1的随機浮點數
random.rangint(a,b) # 最小值a-最大值b區間的整數
random.randrange(a,b,c) # 最小值a-最大值b區間按照c遞增的整數
random.choice(a) # 從集合a中随機擷取一個元素,a可以是字元串、元組、清單
12、assert、isinstance()
import time
def i_want_to_sleep(delay):
assert(isinstance(delay, (int,float))), '函數參數必須為整數或浮點數'
print('開始睡覺')
time.sleep(delay)
print('睡醒了')
if __name__ == '__main__':
i_want_to_sleep(1) # True
i_want_to_sleep("666") # False
'''
isinstance() 方法的文法: isinstance(object, classinfo)
參數:
object -- 執行個體對象。
classinfo -- 可以是直接或間接類名、基本類型或者由它們組成的元組。
傳回值:
如果對象的類型與參數二的類型(classinfo)相同則傳回 True,否則傳回 False。
'''
666、常用
s1 = {"1": 1, "2": "c"}
print(len(s1))
# 2