天天看點

Python自用記錄1、python規範2、time子產品3、等待4、 print格式化輸出(%占位)5、子產品導入6、類6、logging子產品報錯7、open() 函數:打開檔案,并傳回檔案對象8、format():字元串格式化填充9、美化json10、range():産生一個正整數清單11、random():産生随機資料12、assert、isinstance()666、常用

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
           

注意:

  1. __init__方法的第一參數永遠是self,表示建立的類執行個體本身,是以,在__init__方法内部,就可以把各種屬性綁定到self,因為self就指向建立的執行個體本身。
  2. 有了__init__方法,在建立執行個體的時候,就不能傳入空的參數了,必須傳入與__init__方法比對的參數,但self不需要傳,Python解釋器會自己把執行個體變量傳進去。
  3. 在Python中,變量名類似__xxx__的,也就是以雙下劃線開頭,并且以雙下劃線結尾的,是特殊變量,特殊變量是可以直接通路的,不是private變量,是以,不能用__name__、__score__這樣的變量名。
  4. 以一個下劃線開頭的執行個體變量名,比如_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