1. 程式人生 > 實用技巧 >Python書寫規範

Python書寫規範

Python基礎規範

PEP8程式碼風格

PEP8是Python對於程式碼的風格指南,給出了Python程式碼組成的編碼約定。我們每個人都會形成自己的編碼風格,但我們應儘量的參考此指南來編寫Python程式碼,致力於程式碼更加規範化,這樣才能顯現出上文提到過的Python優點嘛。

簡單說下幾個重要的語法規範吧:

縮排規範:不允許tab和空格混用

Python是一門用空格縮排來區分程式碼層次的語言,其實Python並沒有強制要求你用Tab縮排或者用空格縮排,甚至空格按幾個都沒有強制要求。但PEP8規範建議四個空格為語句的縮排塊。用縮排來控制不同的語句塊是Python的一大特色,縮排也讓Python的程式碼更優美,簡潔。
在日常編輯中,當代碼量增多,邏輯語句複雜時。因為縮排造成的bug層出不窮,比如造成邏輯判斷的報錯,造成程式的異常退出等,都是需要我們注意的。一般的,引起這些錯誤的原因,可能是Tab鍵和空格鍵在不同的編輯環境混用造成的,也可能是你邏輯判斷時忘了縮排,或者多了一個縮排,不過沒關係,只要我們在敲程式碼時,注意點,並且PyCharm

在縮排錯誤時,會有提示的(一般為飄紅)。
這裡需要的注意的是:這個四個空格,可以手動敲4下空格鍵(廢話!),也可以用鍵盤的Tab鍵(別問在哪,Q鍵左邊,Capslock鍵上邊)。但是,千萬不要Tab和空格鍵混用,因為不同的編輯器對Tab鍵的解釋是不同的,有的是預設4個空格,有的是8個。但空格永遠是一致的!Python中不提倡用Tab來處理縮排,但一般編輯器的Tab都是4個空格,我們也能設定嘛!反正要是讓灑家一直咔咔咔咔咔咔敲空格,還不如去搬磚(我擦,貌似暴露了什麼)....
ps:如果要是想讓程式碼往右側縮排4個,就Tab一次就行了;要是讓程式碼往左側縮排4個空格,就Shift + Tab就完了。如果是整個程式碼塊,選中所有即可。

不允許使用";"

不少有別的語言經驗的大佬來學習Python時。每當敲完一行程式碼後。姿態非常優美的敲個分號作為結束!比如:

print('hello world');    # ×
print('hello world')    # √

Python不建議使用分號!除此之外,也不要用分號連線兩條語句:

x = 3;print('hello world')

為了Python程式碼更加優美、簡潔,請忘記分號吧!

不允許兩個邏輯行寫到物理行上

```python
x =5;print(111)    雖然語法正確,但是語法規範上算是錯誤寫法。最好還是每行只寫一句,這樣程式碼更易讀。
```

那麼,你可能會說,這個一行萬一放不下怎麼辦?那就用到了行連線\符號,如:

>>> name =  "I'm oldboy, I love pyt\  
... hon"  
>>> name  
"I'm oldboy, I love python"  

一行不要超過80個字元

一般的,每行不超過80個字元,但也有例外:

  • 長的匯入模組語句
  • 註釋裡的URL
  • 不要使用反斜槓連線行

Python會將 圓括號, 中括號和花括號中的行隱式的連線起來 , 你可以利用這個特點. 如果需要, 你可以在表示式外圍增加一對額外的圓括號:

if (width == 0 and height == 0 and
         color == 'red' and emphasis == 'strong'):pass

如果一個文字字串在一行放不下, 可以使用圓括號來實現隱式行連線:

x = ('This will build a very long long '
     'long long long long long long string')

註釋!很重要,是給人看的,就寫好註釋。你的弱雞程式碼只想給一眼就能望穿程式碼的大佬看,那我服你。。。

在Python中註釋分為兩種方式:

  • 單行註釋(#號表示,快捷鍵為Ctrl+?):一般用來對一行程式碼或者幾行程式碼進行註釋
  • 多行註釋(三對引號表示):一般用與對較多的程式碼行或程式碼塊進行註釋,或者對整個檔案進行描述,下圖演示了單行註釋和多行註釋在實際編寫程式碼中的示例。

別忘了,我們寫的程式碼是給誰看的?你可能會說是給計算機?CPU?是個鬼鬼!是給人看的!

我們要在一些重要的地方加上一些註釋,讓別人一眼就知道是幹啥用的。就像產品的說明書一樣。該有的不能少!

但也不能滿篇都是註釋!這就顯得low了。要顯得恰如其分,起到畫龍點睛的作用!給人一種一看就有一種:我x,大佬啊,這應該裱起來帖床頭,時時瞻仰啊!不能讓人家一看:我x,這是什麼?dogshit

ps :不管是多少個引號,只在一行時只是被當做引號使用,並沒有註釋的用意

關於引號

在Python中,單引號和雙引號都能用來表示一個字串,比如:

str1 = 'oldboy'  
str2 = "oldboy" 

在Python中,str1和str2是沒有區別的,但是在有些情況下,卻要注意的,例如你如何定義:I’m oldboy,這時候就要單雙引號搭配使用了,如:

str3 = "I'm oldboy"  

這也是Python人性化的方面之一,至於複雜的用法,我們後面講字串的時候再說。

空行

頂級定義之間空兩行, 方法定義之間空一行。
頂級定義之間空兩行, 比如函式或者類定義. 方法定義, 類定義與第一個方法之間, 都應該空一行. 函式或方法中, 某些地方要是你覺得合適, 就空一行。

最重要的一點:就算是喝假酒上頭,你也要保證你敲得符號都是英文狀態下的

你敲別的錯誤還能肉眼檢查出來,你敲幾個中文符號.....呵呵,就等著變熊貓吧!!!!!

最後多說一條:在pycharm中,直接如下圖點選,可自動將全文不復返輸入進行規範化較正。

變數與“常量”

簡介:

我們通過一個名字,指向一個人,或者指向一個具體的事物。這在Python中是同樣適用。Python中,這個名字稱為變數,而指向的物件為一串字串,一個具體的數值等等。變數也是可變狀態的、對記憶體地址一種抽象。

變數賦值具體方式可檢視https://www.cnblogs.com/Neeo/articles/10522363.html

我對Python變數的理解就是:它和其他語言例如shell,php等等語言的變數是一樣的,知識書寫方式與呼叫方式有點細微差別。都是給一個可能不斷改變的資料定義一個固定的變數名,以便於調取使用!

但是需要注意的是:Python屬於強型別的語言。如果定義了一個字串型別的a。如果不經過強制轉換,那麼它就永遠是字串型別的了,程式根本不可能把它當做整形來處理。所以,Python也是型別安全的語言。

說到變數,那就不得不說一下常量。一般的來說,變數,就是代指不斷變化的量,而常量指(Python在語法上並沒有定義常量,儘管PEP8規範定義了常量的命名規範為全部大寫字母和下劃線組成),基本上定義了之後不怎麼變化的變數。比如我們儲存一段資訊:

IP = "127.0.0.1"

最後小結一下變數與常量的書寫規範吧:

Python雖然沒有常量,但還是會吧非特殊情況不更改的變數叫做常量。常量用全大寫字母表示

Python變數一般用駝峰或者111_2312格式

變數引用與刪除:

沒有被引用的變數會被自動清理掉

引用變數:直接引用

刪除變數:del x

輸入與輸出

螢幕輸出流:print('ashfqel')

輸入流(但是不列印):input('>>>: ')

輸入後列印到螢幕:

```python
result=input(''>>>: ')
print(result)
```

運算子與表示式

具體可參考https://www.cnblogs.com/Neeo/articles/10522370.html。這裡就不講那麼多啦

表示式

大多數的邏輯行都包含表示式,如計算面積就是一個簡單的表示式,表示式可以分解為運算子(操作符)與運算元,運算子是為了完成某個功能,它們由如+-這樣的符號或者其它特定的關鍵字表示,運算子需要資料來進行計算,這樣的資料被稱為運算元。

主要有:算數運算子,比較運算子,賦值運算子,邏輯運算子,成員運算子,身份運算子,位運算子...

算數運算子

算數運算子和我們數學上計算的符號使用是一致的,Python支援的算數運算子,如下表所示:

運算子描述
+ 加,兩數相加
- 減,得到負數或者一個數減去另一個數
* 乘,兩數相乘或者返回一個被重複若干次的字串
/ 除,兩個數相除
// 取整除
% 取模,返回除法的餘數
** 冪,返回x的y次方

比較運算子

比較運算子通常用來比較兩個變數的關係:

運算子描述
== 等於,比較兩個物件是否相等
!= 不等於,比較兩個數是否不相等
> 大於
< 小於
>= 大於等於
<= 小於等於

賦值運算子

前文中所講賦值操作,如x = 3,即將一個整形數字3賦值給變數x,其中=就是賦值運算子,另外,Python中還有其他的賦值運算子,如下表所示:

運算子描述
= 簡單的賦值運算子
+= 加法賦值運算子
-= 減法賦值運算子
*= 乘法賦值運算子
/= 除法賦值運算子
%= 取模賦值運算子
**= 冪賦值運算子
//= 取整除賦值運算子

邏輯運算子

>>> 2 < 3 and 3 == 3    # 邏輯運算子 and  
True  
>>> 2 < 3 or 3 != 3     # 邏輯運算子 or  
True  
>>> not 1 > 2           # 邏輯運算子 not  
True  

成員運算子

我們很多時候,都會做這樣的判斷,王二狗子在家嗎?小李同學不在班裡嗎?小芳的手機號我存在手機聯絡人中了嗎?等等等等。Python中也存在這種在不在的關係判斷。並由具體的運算子來完成這樣的運算,我們稱這樣的運算子為成員運算子,如下表所示:

運算子描述
in 如果在指定的序列找到值則返回True,否則返回False
not in 如果在指定的序列內沒找到值返回True,否則返回False
>>> 'a' in 'abcd'       # 成員運算子 in  
True  
>>> 'a' not in 'abcd'   # 成員運算子 not in  
False  

身份運算子

身份運算子用於比較兩個物件的儲存關係

>>> a = 'abcd'  
>>> b = a  
>>> c = a  
>>> b is a         # 身份運算子 is  
True  
>>> b is c  
True  
>>> c is not a     # 身份運算子 is not  
False  

運算子的優先順序

那麼,這麼多運算子在參與運算時,誰先參與計算?誰後計算?比如數學運算中先算乘除,後算加減一樣,Python中也有規則,稱之為運算子優先順序。下表總結了Python中的運算子優先順序,從最低優先順序(最少繫結)到最高優先順序(最多繫結)。同一框中的運算子具有相同的優先順序。除非明確給出語法,否則運算子是二進位制的。運算子在同一框中從左到右分組(除從右到左分組的求冪運算外)。
請注意,比較、成員測試和身份測試都具有相同的優先順序,並且具有比較部分中描述的從左到右的連結特性。

具體檢視官網:https://docs.python.org/3/reference/expressions.html#operator-precedence

流程控制語句

和其他語言一樣,流程控制語句在Python中也包括三個部分。順序執行語句、分支執行語句(或稱條件語句if/else)和迴圈語句(for/while),如下圖所示:

簡單的if邏輯語句:

user= input('user: ')
pwd = input('pwd: ')
if user == "dazhu" and pwd == "123":
print('ok')
else:
print('no')

if巢狀語句:

score = int(input("enter score:"))  
  
if score > 100 or score < 0:  
    print('你可能輸入了一個來自火星的成績 %s'%score)  
elif score >= 90:  
    print('成績優秀')  
elif score >= 75:  
    print('成績良好')  
elif score >= 60:  
    print('馬馬虎虎吧')  
else:  
    print('成績不合格')  
num = int(input(">>>"))  
if num < 10:  
    if num == 3:  
        print('輸入正確')  
    else:  
        print('再接再厲')  
else:  
    print('輸入錯誤')  
source = input('輸入成績: ')
if source.isdigit():  # 判斷字串內的字串是否為整形,如果是,則返回true,否則返回false
    source = int(source)  # 將字串轉換為整形術
    if 90 <= source <= 100:
        print('優秀')
    elif 80 <= source < 90:
        print('還行吧')
    elif source > 100 or source < 0:
        print('滾')
    elif 0 <= source < 60:
        print('加油,努力,奮鬥')
else:
        print('輸入的是什麼?心裡沒數嗎??', source)

注意:if語句的巢狀不易過多,這樣會降低程式碼的可讀性。

迴圈語句之while迴圈

先來看while迴圈,其語法基本形式如下。

while 表示式:  
    迴圈體  

例項:

count = 0   # 迴圈中的變數
sum = 0   # 用於求和
while count < 100:  # 當count小於100的時候,while迴圈執行(起到迴圈作用)
    count = count + 1#起到維持和終結迴圈作用
    # print(count)  #每次count值都會加一
    sum = sum + count  # sum都會加上count值
print(sum)
# 或者簡寫為下面這種方式
count = 0
sum = 0
while count < 100:
    count += 1
    sum += count
print(sum)

注意:如果執行下例程式碼,就會發現程式是不是停不下來了?沒錯,這就是死迴圈(因為只有迴圈體呀)。我們在編寫程式碼的時候後,如無必要,應注意避免死迴圈的產生。

while True:  
    print('ok')  

迴圈語句之for迴圈

Python的for迴圈可以遍歷任何序列型別

for迴圈的基本形式為:

for 變數(i) in 可迭代物件:  
    迴圈體  

關鍵點:迴圈次數取決於迭代物件內有多少元素。

有了for迴圈,我們在處理序列型別的資料就方便多了,比如迴圈列印一串字串的每個字元。

str1 = 'dazhuisstrongman'  
for i in str1:  
    print(i)  

迴圈巢狀

在Python中,我們可以在while迴圈中巢狀while迴圈,也可巢狀for迴圈。反之,我們也可以在for迴圈中巢狀for迴圈,也可以巢狀while迴圈。

count = 0
while count < 3:
    num = 0
    while num <= 3:
        print('*' * num)
        num += 1
    count += 1

break語句

break語句用來終止迴圈語句,即使迴圈條件依然成立,碰到break語句也會終止迴圈。

break語句用在for和while迴圈中,如果當前的迴圈是巢狀型別的迴圈,break語句將停止執行包含break語句的迴圈,直接開始執行當前迴圈之外的下個Python語句。

示例,列印字串,遇到h時終止迴圈。

for i in 'python':
    if i == 'h':
        print(i)
        break
    print(i)
count = 0
while count < 3:
    for i in 'python':
        if i == 'h':
            print(i)
            break
        print(i)
    if count == 2:
        break
    count += 1

"""
p
y
t
h
p
y
t
h
p
y
t
h
"""

continue語句

break語句結束所在迴圈,而continue語句則是結束當前迴圈執行的剩下的程式碼,繼續執行下次迴圈。continue語句在for和while迴圈中都適用。

for i in 'python':
    if i == 'h':
        continue
    print(i)

ps:如果continue之前沒有對應的結束條件:x = x + 1。則會進入本次迴圈的死迴圈。

num = 1
while num <= 10:     # 維持迴圈的條件
     if num == 7:
         # num = num + 1
         num += 1
         continue
     else:
         print(num)
         # 結束迴圈的條件
         num = num + 1
 print('迴圈結束,當前的num是: ', num)

pass語句

i = 0  
while i < 10:  
    if i == 3:  
        pass  
    print(i)  
    i += 1  

上面的程式碼示例中,pass語句這個程式碼塊,意思就是我還沒想好要幹啥,但什麼都不寫程式不完整,無法執行,