====== Python 研究 ======
==== 直接執行時與被引用的判斷機制 ====
你就可以看到 __name__ 的值在檔案被直接執行時與被引用時是不同的。
所以回到上面的問題:要怎麼讓檔案在被引用時,不該執行的程式碼不被執行?
當然就是靠 __name__ == '__main__'
做判斷!
# cool.py
defcool_func():
print('cool_func(): Super Cool!')
if__name__=='__main__':
print('Call it locally')
cool_func()
* 註解符號為 #
* 對 python 來說,開頭是底線的變數通常用來宣告建構子用
* 在 python 中,雙引號和單引號的意義是一樣的
若要 \n 等保持原形(例如想直接印出字串內容,不想要讓 \n 變成換行)
可以在字串前加上 r (=raw)
y = r"World\n"
===== 語法 =====
import 模組名稱
def 函式名稱():
程式碼....
程式碼開始執行.....
範例:
#匯入模組
import random
import math
#定義函式
def rand_num():
num = random.randint(1,5)
return num
def sqrt_num(number):
ans = math.sqrt(number)
returnans
#程式開始執行的地方
print(rand_num())
print(sqrt_num(9))
程式的最小執行單位為敘句(statement),同等於文章的句子
運算式述句~ 算數運算子:+, -, *, /, %, //, **
比較運算子: >, <, ==, !=, >=,<=
布林邏輯運算子: and, or, not
指派述句~ 使用" = "作變數指派
輸出:print()
輸入: input()
條件判斷述句~ if , if....else, if...elif....elif...elif...else, while
迴圈述句~ for ....in...., while, 使用break , continue 控制迴圈
述句中的物件~整數(integer), 浮點(float), 字串(string),元組(tuple),清單(list),字典(dictionary)
程式的三種控制結構\\
什麼是控制結構?\\
程式有三種基本結構組成:順序結構、分支結構、迴圈結構。任何程式都是由這三種基本結構組成。\\
順序結構是程式按照線性順序依次執行的一種執行方式。\\
分支結構是程式根據條件判斷結果而選擇不同向前執行路徑的一種執行方式。\\
迴圈結構是程式根據條件判斷結果向後執行的一種執行方式。\\
程式的分支結構
==== 單分支結構 if ====
python中分支結構使用if保留字對條件進行判斷,使用方法:
if <條件>:
<語句塊>
其中,if、:、<語句塊>、前的縮排都是語法的一部分
例如:判斷一個數字的大小
a = 1
b = 2
if a < b:
print("True")
<條件>可以是一個或者多個條件,多個條件間採用and或or進行邏輯組合。and表示多個條件“與”的關係,or表示多個條件“或”的關係。
例如:判斷使用者輸入數字的特性
a = eval(input("請輸入一個數字:"))
if a % 3 == 0 and a% 5 == 0:
print("這個數字既能被3整除,也可以被5整除")
print("輸入的數字是:",s)
請輸入一個數字: 10
輸入的數字是: 10
請輸入一個數字:15
這個數字既能被3整除,也可以被5整除
輸入的數字是: 15
==== 二分支結構:if-else ====
python的二分支結構使用if-else保留字對條件進行判斷,語法格式如下:
if <條件>:
<語句塊1>
else:
<語句塊2>
<語句塊1>在if<條件>中滿足即為True時執行,<語句塊2>在if<條件>中不滿足即為False時執行,簡單來說,二分支結構根據條件True或False結果產生兩條路徑。
例如:
a = eval(input("請輸入一個數字:"))
if a % 3 == 0 and a% 5 == 0:
print("這個數字既能被3整除,也可以被5整除")
else:
print("這個數字既不能被3整除,也不可以被5整除")
print("輸入的數字是:",s)
請輸入一個數字:15
這個數字既能被3整除,也可以被5整除
輸入的數字是: 15
請輸入一個數字:11
這個數字既不能被3整除,也不可以被5整除
輸入的數字是: 11
==== 三分支結構:if-elif-else ====
python的三分支結構使用if-elif-else保留字對條件進行判斷,語法格式如下:
if <條件1>:
<語句塊1>
elif <條件2>:
<語句塊2>
elif <條件3>:
<語句塊3>
.
.
else:
<語句塊n>
多分支結構通常用於判斷同一個條件或者一類條件的多個執行路徑。
例如:
a = eval(input("請輸入你的成績:"))
if a > 90:
print("優秀")
elif a > 80:
print("良好")
elif a >= 60:
print("及格")
else:
print("不及格")
請輸入你的成績:100
優秀
請輸入你的成績:85
良好
請輸入你的成績:60
及格
請輸入你的成績:50
不及格
==== 遍歷迴圈:for ====
python語言中的迴圈結構分為:遍歷迴圈和無限迴圈兩種,遍歷迴圈使用保留字for依次提取遍歷結構各元素進行處理,無限迴圈使用保留字while根據判斷條件執行程式。
在學習for迴圈時我們要理解,什麼是for迴圈,迴圈就是重複做某件事,for迴圈時python提供第二種迴圈機制,為何要有for迴圈,理論上for迴圈能做的事,while迴圈都可以做,之所以要有for迴圈,是因為for迴圈在迴圈取值(遍歷取值)比while迴圈更簡潔。
for 變數名 in 可迭代物件:
可迭代物件可以是:列表、字典、字串、元組、集合
遍歷迴圈:for
遍歷迴圈可以理解為從遍歷結構中逐一提取元素,放在迴圈變數中,對於每個所提取的元素執行一次語句塊。
for <迴圈變數> in <遍歷結構>:
<語句塊>
例如:
for a in "python":
print(a)
p
y
t
h
o
n
或者:
for a in range(3):
print(a)
0
1
2
'遍歷結構還有一種擴充套件結構
for <> in <>:
<語句塊1>
else:
<語句塊2>
當for迴圈正常執行之後,程式會繼續執行else語句中內容,else語句只在迴圈正常執行之後才執行並結束,所以,\\
可以在<語句塊2>中放置評價迴圈執行情況的語句\\
==== for迴圈和if結構連用: ====
使用者登入:當名字輸入錯誤或密碼輸入錯誤時,重新輸入,當名字以及密碼輸入錯誤達到三次,程式結束
name = "佩奇"
password = "123"
for i in range(3):
id_name = input("請輸入你的名字:")
id_password = input("請輸入你的密碼:")
if id_name == name and id_password == password:
print("登入成功")
break
else:
print("輸入次數三次,程式結束")
結果:
請輸入你的名字:aa
請輸入你的密碼:123
請輸入你的名字:bb
請輸入你的密碼:123
請輸入你的名字:cc
請輸入你的密碼:123
輸入次數三次,程式結束
Process finished with exit code 0
無限迴圈:while
python通過保留字while實現無限迴圈,基本使用方法如下:
while <條件>:
<語句塊>
例如:
n = 0
while n <10:
print(n)
n = n + 3
結果:
0
3
6
9
當程式執行到while語句時,判斷條件如果為True,執行迴圈體語句,語句結束後返回再次判斷while語句的條件,當條件為False時,迴圈終止,執行與while同級別縮排的後續語句。
無限迴圈也有一種使用保留字else的擴充套件模式:
while <條件>:
<語句塊1>
else:
<語句塊2>
迴圈控制有兩個輔助迴圈控制的保留字:break和continue
break用來跳出最內層for或while迴圈,脫離該迴圈後程式繼續執行迴圈後續程式碼。
例如:
while True:
s = input("請輸入姓名:")
if s == "q":
break
print("輸入的名字是" ,s)
print("程式退出")
結果:
請輸入姓名:佩奇
輸入的名字是 佩奇
請輸入姓名:喬治
輸入的名字是 喬治
請輸入姓名:q
程式退出
如果有2層或多層迴圈,break退出最內層迴圈。
而continue用來結束當前當次迴圈,即跳出迴圈體中,執行下面尚未執行的語句,但不跳出當前迴圈。
例如:
for s in 'python':
if s == 'y':
continue
print(s,end='')
結果:pthon
總結:continue語句和break語句的區別是:continue語句只結束本次迴圈,不終止下面程式的執行,而break語句直接結束整個當前迴圈。
強調:在continue之後新增同級程式碼毫無意義,因為永遠無法執行
while死迴圈與效率問題:
count = 0
while count < 5:
print(count)
會一直0迴圈下去
while True:
input("輸入姓名:")
不會終止,但是不會引發效率問題
while True:
1 + 1
一直不停的工作,純計算無io的死迴圈會導致致命的效率問題,瞭解即可,不要實驗(費電腦)
while迴圈巢狀,每一層都必須配一個break
例如:
while True:
while True:
while True:
break
break
break
==== while迴圈和if結構連用: ====
使用者登入:當名字輸入錯誤或密碼輸入錯誤時,重新輸入,當名字以及密碼輸入成功時,登入成功那個
name = "佩奇"
password = "123"
while True:
id_name = input("請輸入你的名字:")
id_password = input("請輸入你的密碼:")
if id_name == name and id_password == password:
print("登入成功")
break
else:
print("重新輸入")
請輸入你的名字:喬治
請輸入你的密碼:123
重新輸入
請輸入你的名字:佩奇
請輸入你的密碼:123
登入成功
==== 使用模組 ====
Python 模組 (module) 是一種非常方便的設計;適當地利用模組可以在不汙染命名空間的情況下獲得最多的額外功能。模組的匯入是利用 import 敘述:
import sys
它匯入了最常用的 sys 內建模組。如果我們想處理指令行引數,就要靠 sys 模組裡的變數 argv:
#!/usr/bin/env python
import sys
print sys.argv
把這個程式存為 echoargs.py,然後執行:
$ ./echoargs.py arg1 arg2
['./echoargs.py', 'arg1', 'arg2']
它把所有的指令行引數都印了出來,以列表的形式。sys.argv 這個變數實際上是個列表,它與 C 程式 main() 進入點函式的 argv 參數有異曲同工之妙,連名字都取作一樣;只是更為好用,因為 Python 的列表比 C 陣列自動化得太多,我們不必擔心列表項目的個數問題,Python 會幫我們處理好的。
Python 還有許多其它的模組,基本上都是以相同的方式匯入並使用的,請參閱線上手冊。
縮排、縮排、縮排
Python 程式語言的一個最大的特色就是以縮排定義程式結構。不像 C, C++, Java 等語言用括號定義程式區塊 (類別、函式、條件判斷和迴圈等),在 Python 裡,行首的「空白字元個數」 (即縮排) 就定義了區塊結構。許多會寫像
int main()
{
int i;
double d;
d = 1.d0;
i = 2;
}
這種程式的人一開始會非常不習慣這種作法;但所有程式設計的書都會告訴你程式碼應該要排整齊,亂排只會增加往後維護的困難度而已。Python 強迫程式員把程式寫得漂亮,這不單簡化了往後的維護工作,更去掉了程式裡那些擾人的括號,對減少程式碼長度來說效果良好。
註記
適當地縮短程式碼的行數絕對是好事。一個函式能在一頁裡列完,就能比兩三頁長的函式更易讀易懂,也更不容易寫錯。
在 Python 裡,
print "Hi"
print "hi"
是不合法的,要寫成
print "Hi"
print "hi"
才可以。相對地,
if 1 == 1:
print "1 == 1, of course"
是錯誤的寫法,要寫成像
if 1 == 1:
print "1 == 1, of course"
這樣才對。
至於一次縮排要縮多少個字元,Python 並沒有進行限制,甚至不同的段落空白不一樣長也可以;\\
只要同一個區塊的行首空白數相同即可。然而經驗告訴我們,\\
第一,「絕對不要用跳格鍵」,如果你用 VIM 寫程式,可以用 :\\
set et 打開跳格鍵的空白取代功能 (好一點的編輯器一定都有這種功能,你的編輯器沒有的話,可能該考慮換一個了);\\
第二,縮排字元數要固定。Python 的爸爸 Guido van Rossum 喜歡用 4 個字元進行縮排,許多人都覺得這樣很好。\\