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語句這個代碼塊,意思就是我還沒想好要干啥,但什么都不寫程序不完整,無法執行,