第一問:為什麼學習Python? 虛妖說:為了還債,還技術債,很早接觸編程,卻一直徘徊,也碼了很多代碼,卻從未真真學會編程! 第二問:什麼是Python 是一種以簡潔、優雅著稱的解釋型、動態、強類型的高級編程語言; 簡潔和優雅: 體現在Python的語法風格,最明顯的一點是縮進,其他語言中縮進本來是 ...
第一問:為什麼學習Python?
虛妖說:為了還債,還技術債,很早接觸編程,卻一直徘徊,也碼了很多代碼,卻從未真真學會編程!
第二問:什麼是Python
是一種以簡潔、優雅著稱的解釋型、動態、強類型的高級編程語言;
簡潔和優雅:
體現在Python的語法風格,最明顯的一點是縮進,其他語言中縮進本來是作為使代碼結構條理增加可讀性的約定,而在Python中縮進成了一種強制性要求,同時也成為代碼快的分隔方式,避免使用過多的代碼塊分隔標識,比如VB的Begin和End,shell中的if、fi,java中的{}等等;是不是有一種一箭雙雕的感覺?!這類的編碼風格已經成為Python的基因,也成就了簡潔與優雅的特性。
解釋型與編譯型:
為了更好的理解兩者的區別,我把編程語言與自然語言做一個類比:
使用語言來傳遞信息應該是人類作為智慧生物最大的特性之一。它是信息的在一定範圍內的通用編碼集合,實現了對信息的高級抽象。簡而言之就是構成了溝通和交流的基礎。但語言有適用範圍限制,就像中國不同民族使用不同的語言,即使地理位置相近使用的語言相近也會有不同的表達方式,比如方言等,更不用說國外的其它多種語言了。在這個前提下就需要引入翻譯機制來實現信息不同編碼方式的轉換。那麼如果人要和機器交流怎麼辦?這就需要將自然語言翻譯成機器語言,這裡的翻譯機制就稱為編譯(compile)。但是隨著編譯機制的發展,逐漸演化出兩種編譯方式:編譯型和解釋型。
編譯型是指一次性把全部的自然語言進行翻譯,一起告訴給電腦:你去整吧!現在沒我啥事了。
解釋型是指一段一段的進行翻譯:你整完這塊再找我,我時刻準備著為您服務!
動態與靜態:
區別就是變數是否需要預先定義,需要預先定義的是靜態類型,比如C和Java,需要用的時候再說,這類語言稱為動態語言類型。
強類型與弱類型:
區別在於類型轉換過程,強類型必須使用特定的轉換函數,而弱類型則不用,強類型可以更好的對數據進行約束。
第三問:常用的字元編碼有哪些?區別是什麼?
常聽說的字元編碼有ASCII碼、GB2312、GBK、GB28030、Unicode和UTF-8;
區別是:
ASCII編碼的一個單元占用一個位元組即8位,是較早的編碼規範,不能表示中文或其他國家語言;
GB2312、GBK、GB28030是中國不同時期使用的字元編碼集,一個單元占兩個位元組,用來實現對中文字元的編碼;
Unicode是統一碼或萬國碼,是各種編碼的集大成者,一個單元占兩個位元組,可以對多國文字字元進行編碼;
UTF-8是在Unicode基礎上改良的可變長編碼方式,即單元的長度是不定的,表示ASCII編碼集中的字元時候單元為一個位元組,表示其它複雜字元編碼的時候,單元使用三個位元組來表示,這樣可以適應字元集的不斷擴展,以後還可能加入外星字元集,呵~呵~
第四問:什麼是變數,變數賦值?和記憶體地址或記憶體對象之間有什麼關係?
變數顧名思義就是變化的量,是數據的抽象載體,而數據對象本身是存放在記憶體中的,給變數賦值就是構建變數名與數據對象地址之間的映射關係。變數不是數據,但是通過賦值操作,就可以通過變數名找到對應的數據對象。
而把一個變數賦值給另一個變數的本質是複製映射關係,變數名之間是沒有關聯的。
Python里的賦值還是很容易理解的,相較而言C、C++中的指針以及指針變數的概念就要複雜得多!
第五問:簡單的數據類型有哪些?
幾乎所有語言的基本數據類型都很相似,最簡單的類型無非就是整型(int)、字元串(str)、布爾型(bool)和浮點型(float),當然Python的基本數據類型還包括:列表、字典、元組和集合。
第六問:Python中如何實現交互?
交互的實現是通過輸入輸出機制實現;
最簡單的輸入輸出機制是通過input()與print()函數來實現的。
print()用來列印輸出信息;input()用來實現用戶數據的輸入。
HelloWorld程式就是使用print()函數完成的:
1 output_info=input("Input something:") 2 >>>Hello World! 3 4 print(output_info) 5 >>>Hello World!
第七問:主流的字元串的格式化輸出方式有哪些?
字元串的格式化輸出說白了就是向預先定義好的字元串模板中傳入變數。而變數的傳入有兩種方式:
已有變數:
1 name = input("your name:") 2 age = input("your age:") 3 job = input("your job:") 4 salary = input("your salary:")
第一種是使用%作為占位符,然後按序按量依次傳入:
1 output_info = ''' 2 ---------------%s's RESUME-------------------- 3 -----name :%s 4 -----age :%s 5 -----job :%s 6 -----salary:%s 7 ''' % (name, 8 name, 9 age, 10 job, 11 salary)
如上:在字元串中使用%s、%d、%f(分表示字元串、整型和浮點型變數)表示將要傳入的數據的位置,在字元串結束後通過“ % (變數名1,變數名2,...)”實現變數的導入。當然導入的變數個數與順序要與字元串中占位符一 一對應!
第二種是使用字元串的內置函數format()來實現:
1 output_info = ''' 2 ---------------{0}'s RESUME-------------------- 3 -----name :{0} 4 -----age :{1} 5 -----job :{2} 6 -----salary:{3} 7 '''.format(name, 8 age, 9 job, 10 salary) 11 12 13 output_info = ''' 14 ---------------{_name}'s RESUME-------------------- 15 -----name :{_name} 16 -----age :{_age} 17 -----job :{_job} 18 -----salary:{_salary} 19 '''.format(_name=name, 20 _age=age, 21 _job=job, 22 _salary=salary)
這裡其實就是調用了字元串類中的format()方法將變數傳入,常用的有通過索引位置傳入和通過label插入,不再過多贅述!
第八問:如何實現選擇分支與迴圈?
選擇分支是通過if語句來實現的,迴圈通過while語句與for語句實現,細節不再贅述,用兩小段代碼來說明:
1 import random 2 # 生成100以內的隨機數來猜 3 true_age = random.randrange(100) 4 # print(true_age) 5 count = 5 6 7 while count > 0: 8 print("You only have %d chances to guess!" % count) 9 guess_age = int(input("guess a number between 1 and 100:")) 10 count -= 1 11 12 if guess_age == true_age: 13 print("Bingo!") 14 break 15 elif guess_age > true_age: 16 print("Just smaller try again!") 17 continue 18 else guess_age < true_age: 19 print("Just bigger try again!") 20 continue 21 else: 22 print("Unluckly!")
上面代碼的功能是實現猜年齡,年齡是隨機生成的100以內隨機整數,而且只有5次機會,每次輸入一個猜測值,根據與真實值的比較結果反饋,如果五次都沒有猜對就退出迴圈,猜對則立刻退出迴圈。
1 import random 2 3 true_age = random.randrange(100) 4 times = 3 5 6 for count in range(10): 7 guess_age = int(input("guess a number between 1 and 100:")) 8 # 超過三次後提示是否繼續 9 if count >= times - 1: 10 response = input("Do you want to continue?") 11 if response != 'y': 12 print("Unlucky!") 13 break 14 15 if guess_age == true_age: 16 print("Bingo!") 17 break 18 elif guess_age > true_age: 19 print("Just smaller try again!") 20 else guess_age < true_age: 21 print("Just bigger try again!") 22 else: 23 print("Unlucky!")
與上一段代碼相比,這裡使用了for語句實現迴圈,超過三次猜不對,就會提醒用戶是否繼續;
range()的功能很強大,可以設置步長也可以倒序,比如:
1 for i in range(100,0,-1): 2 pass 3 4 for i in range(0,10,2): 5 pass
第一個for語句可實現i從100到0的變化,第二個語句可以實現10以內的偶數輸出,顧名思義!
第九問:編程的好習慣有哪些?
首先,寫博客就是一個很好的回顧和梳理知識的手段;
其次,設計的重要性遠遠高於編碼過程,因此為了更好地將頭腦中的概念具現化就需要使用工具來輔助我們,使用流程圖來固化設計方案可以使得編碼更有條理與針對性,對設計過程中存在的重大問題也有很好的反饋作用!
最後,書讀百遍其義自見,想磨練編程技能,寫代碼做練習是無可厚非的,孰能生巧,很有道理!
第一次編寫博客,內容和排版可能都有欠缺,望大家多多體諒,如果發現文中有錯誤或是歧義,請多多指教,都是凡人,難得不犯錯!