python應用(4):變量與流程
程序是什麼?就是一堆代碼啰。但是代碼是有組織而來的,不是憑空堆砌出來的。有一個「古老」的說法:程序=數據結構+算法,意思是,程序是由一些數據結構(數據的組織結構)加上某些算法而形成的。從這個角度,算法才是主驅動力,而數據結構是服務於算法的(當然你可能因為有了某個很好用的數據結構而設計了某個算法,但算法仍然是主角)。那算法又是什麼?算法就是設計好的,達成某個事情的步驟。所以,從這個角度,程序只是某些步驟的表現,這些步驟也叫流程,而程序就是流程表現。
我贊成這個「古老」說法(或者是我對它的解讀),程序只是封裝流程的外殼,因而,程序跟算法是兩碼事,雖然它們是有關聯的。程序只是算法的一種表現,但不是唯一的表現,算法還可以用筆寫到紙上,還可以用算盤表現出來,還可以通過一些對答、比喻或類比表達出來,還可以通過實際操作表現出來。算法可以是通用的設計步驟,也可以是某個領域的特有的設計步驟。算法有專門的設計與分析,它並不需要程序來支撐。算法是魂,程序是殼,存在這些情況:「算法很強,但程序很爛」(殼寫不好)、「程序很強,但算法很爛」(魂設計不好,但很會封裝)。
如果程序只是一個殼,那是不是就不重要了呢?肯定不是了,寫殼,也是技術活,也要設計,也講經驗,也要學習。而且,程序能手是可以通過程序去設計算法的,比如他們可以熟悉地通過if/while這些結構去設計算法,當然,這不是必須的,也未必是好的設計算法的辦法。特別是,對於程序開發,比如前後端、客戶端等開發,你不熟悉掌握寫程序(寫殼)的技能與知識,你是站不住腳的,但未必要求你要有很強的算法設計能力。
好了,說了一堆廢話。其實我是想說python的語言特性,掌握這些特性才能更快更好地把殼寫好。跟練習打籃球一樣,一開始先把分解動作做好,之後再連貫起來–那如果不練分解而直接連貫,行不行?也行,練分解不是必須的,特別是對工具的使用,邊用邊搜索也是個好辦法,但本文的介紹,是從分解開始。
python的語言特性可以分:變量、數據類型(數據結構)、語句、代碼組織等。
(1)變量
變量,就是值可以改變的量,所以變量是用來存放值的。在python中定義一個變量,就是把一個值給這個變量,所以你想忘記初始化都不行,你一定要把值給變量的,而在給值時,這個變量的類型就確定下來了,是的,變量都有類型。python內置了不少好用的類型(也可以叫數據結構),這個後續再詳細介紹。
需要什麼變量?這個跟流程有關,比如,假設流程是把輸入的兩個數相加,那就可以考慮使用兩個變量,用於保存輸入的值,比如這樣:
最簡單的想法,就是流程中需要保存(臨時或長期保存)什麼值,就設計什麼變量。
(2)流程
流程是主角。
如果說一個程序的邏輯不行,一般是說程序在流程處理上不行,而經常說的「程序算法」,說的就是流程的設計。程序是對流程的封裝,前提是,這個流程要想好,要設計好,當然,流程(或算法)也不一定要你來設計,別人設計你來翻譯也是可以的。
程序就是對流程的翻譯。所以,以前有一段時間,部門主管教我寫代碼,是要我先用注釋把流程的每一步寫好,然後再寫代碼翻譯。當然由於注釋可能是不必要的負擔,才慢慢地不寫步驟上的注釋,但意思就是要形成習慣:先設計好流程,再來寫代碼。
不管流程的具體內容是什麼,從結構來看,流程可以區分成三種:順序流程、分支流程、循環流程。
順序流程,就是從上到下一句一句地執行的流程,這樣的流程必然會存在。分支流程(if/else),就是根據不同的條件,選擇執行的操作。循環流程,就是重複地執行某些操作。
這三種流程,基本上都是混合使用,以組合拳的方式出現,比如下面的「猜數字」:
# -*- coding: utf-8 -*-
import random
secret=random.randint(0,100)
temp=input("請說出我想的數字:");
guess=int(temp)
while guess!=secret:
if guess>secret:
print("沒有這麼大,說個小的!")
else:
print("太小了,說個大的!")
temp=input("猜錯了,再來一次吧:")
guess=int(temp)
print("厲害,猜對了!")
上面這個「猜數字」遊戲,用到了循環(while)與分支(if..else)的流程。
具體上,對於分支流程,一般有兩種表達形式:
if … else
if … elif … else
對於循環流程,一般有兩種表達形式:
while xx:
for xx in []:
再寫兩個程序,一個打印「鑽石」,一個打印九九乘法表:
i=1
while i<=17:
cnt = i
if i>9:
cnt = 18-i
starcnt = (cnt-1)//2
spacecnt = 4-starcnt
print(" "*spacecnt, end="")
print("*"*starcnt,end="")
print("*", end="")
print("*" * starcnt, end="")
print(" " * spacecnt)
i+=2
j=1
while j<=9:
i=1
while i<=j:
print("%d * %d = %d"%(i,j,i*j), end="\t")
i+=1
print("")
j+=1
發現規律並設計,是得到流程的重要辦法。
打印效果如下:
好了,以上介紹了變量跟流程,特別是對流程的翻譯即語句的使用。一門語言是一種工具,你要學着去用,邊用邊試錯,才能更好更快地掌握它,不要拘泥於細節,除非細節影響到你解決問題了。
有緣再見,see you。