一.靜態語言和腳本語言
高級語言根據計算機執行機制的不同分為兩類:靜態語言和腳本語言
靜態語言的核心特征:
- 變量的類型在編譯時(寫代碼時)就必須確定并固定下來,即在使用一個變量前必須顯式地聲明它地類型
- 一旦聲明,這個變量的類型就不能再改變
- 執行方式為編譯
- 性能通常較高
- 可靠性和可維護性方面更優:編譯器像一個嚴格的代碼審查員,能在編譯的過程中就捕捉大量的類型錯誤、接口不匹配等問題,將很多Bug扼殺在搖籃里
腳本語言:
- 變量無需聲明類型
- 通常不需要顯式的編譯步驟,一般都是采用解釋作為執行方式
- 性能通常較低,因為邊解釋邊執行,運行時需要額外的時間來運行語法、推斷類型,動態分配內存等。不過通過即時編譯技術(如V8引擎for JavaScript,PyPy for Python),這個性能差距在逐漸縮小
- 更靈活:無需關注類型細節,代碼更短,開發速度更快
- 運行時錯誤風險:一個拼寫錯誤或類型錯誤可能直到運行到那一行代碼時才會暴露,對于大型復雜項目,維護和重構的難度更高
兩種將高級語言代碼轉換成計算機能讀懂的指令的過程:
編譯:是一次性轉換的過程 (好比把一本中文書翻譯成英文,才能讓完全不懂中文的人看懂) ?? ? ?? ? ? ? ?技術過程如下:
- 輸入:全部的源代碼文件
- 處理:編譯器會讀通所有代碼,進行詞法分析,語法分析,優化等一系列操作、
- 輸出:生成一個獨立的,全新的可執行文件(如Windows中的.exe文件)。這個文件里是純粹的機器指令
- 執行:此后,源代碼就和執行無關了。可以直接運行這個可執行文件,即使源代碼被刪除,程序照樣可以運行
? ? ?2.解釋:是一個邊轉換邊執行的過程(好比同聲傳譯)
? ? ? ? ? ? ? ? 技術過程如下:
- 輸入:源代碼文件
- 處理:解釋器讀取原代碼的第一行,立即轉換成機器指令并讓CPU執行;然后讀取第二行,轉換成機器指令并讓CPU執行;如此重復直到結束
- 輸出:沒有獨立的可執行文件生成(輸出的是程序的運行結果,如屏幕顯示,文件修改等)
- 執行:程序的每次執行都離不開源代碼和解釋器,必須同時擁有兩者
編譯器和解釋器是執行上述編譯和解釋過程的軟件
編譯器如GCC(c\cpp編譯器),javac(java編譯器)
特點:
- 速度快:程序運行時已經是機器碼,直接由CPU執行,效率高
- 需額外步驟:修改代碼后,必須重新編譯才能看到變化
- 跨平臺性差:編譯產生的可執行文件通常只適用于特定的操作系統和CPU架構(例如為Windows編譯的程序無法在Mac上運行)
解釋器如python解釋器,JavaScript引擎(如V8),Ruby解釋器
特點:
- 靈活性高:修改代碼后,直接就可以再次運行,無需等待編譯
- 跨平臺性好:只要有對應平臺的解釋器,同一份代碼就可以在任何平臺上運行,實現了“一次編寫,到處運行”
- 速度相對慢:因為邊翻譯邊執行,每次運行都包含翻譯的開銷
注:現在純粹的編譯和解釋比較少了,很多語言采用混合模式,最典型的是Java和JavaScript
二.程序設計的統一模式(IPO)
Input:輸入
Process:處理
Output:輸出
三.基本語法格式
python采用嚴格的縮進(一般為4個空格)來表明程序的格式框架(代碼的層次和包含關系),但并不是所有的python代碼都需要縮進
四.Python中的轉義字符
轉義字符是一個以反斜杠\開頭的特殊字符序列,用于表示那些在字符串中難以直接表示或具有特殊含義的字符。
例如換行,引號,制表符等
下面是一些常見的轉義字符的形式和作用:
- \\: 表示反斜杠\
- \': 表示單引號? ?如 ' it\'s good '
- \n :換行符
- \t : 水平制表符? 一個\t表示4個空格
- \r : 回車符
- \b : 退格符
五.變量命名規定
分為硬性規則(必須遵守)和軟性規則(建議遵守)
1.硬性規則
只能包含以下字符:
- 大小寫英文字母
- 數字0~9
- 下劃線
不能以數字開頭
不能是python的保留字(也稱關鍵字)
區分大小寫
2.命名約定(軟性規則)
變量名應該清晰地表明意圖
python3可以適用漢字以及大多數Unicode字符作為變量名,但是不推薦這么做,¥,$ 都不能做變量名,所以盡量不要用英文和數字及下劃線以外的作為變量名
六.重要的代碼知識
1.print()函數中的end參數
控制print()函數在輸出完后要以什么字符結尾,end參數的默認值為'\n',即默認輸出完會換行,end參數取值為空字符串或者空格的時候可以讓多次輸出打印在同一行,即取消換行
2.復數
形如a+bj的形式,其中a,b都是浮點數。
注意在數學中一般用i表示復數,但是在工程和python中都用j表示
在python中直接在數字后面加j或J就能表示復數,或者使用complex()函數
complex(4,5) # (4+5j)
3+4j # 3+4j
每個復數都有.real和.imag兩個屬性,用來獲取復數的實部和虛部
(3+4j).real # 3.0
(3+4j).imag # 4.0
同時python支持復數的所有運算,+-*/ **
3.divmod()函數
divmod(a,b)返回一個包含兩個元素的元組,第一個元素為a//b,即在a除以b的基礎上向下取整,第二個元素為a%b ,即a與b的模運算(求余數)
divmod(11,3) # (3,2)
4.%模運算
模運算是一種求余運算,基本概念是:對于兩個整數a和b(b為不為零),存在唯一的整數q(商)和r(余數),使得:
a = b * q + r, 并且0 <= r < |b|
其中,r就是a對b取模的結果,在python中表示為a % b
需要注意的是,python的模運算結果的符號始終與除數(第二個操作數)的符號相同
7 % 3 # 1
7 % -3 # -2
-7 % 3 # 2
分析:
對于 7 % -3? ? 我們要找到一個r,范圍為0<= r < |-3| = 3, 使得7 = (-3) * 某個整數 + r
這要求 -3? * 這個整數 的 值 不能和 7 相差 太大,差在[0,3)之間,
所以考慮這個整數為-3或者-2? 但r要和-3符號相同,因此這個整數只能是-3,r的值容易得出為-2
或者還可以這樣分析,r要為負數,說明-3和商要比7大,所以商只能是-3
同理對于-7 % 3,商為-3 余數為2 所以r=2
4.pow()函數
也是python的內置函數,用于計算冪運算(指數運算)
語法:pow(base,exp[,mod])
base:底數,必須要有的參數
exp:指數,必須要有的參數
mod:模數,可選,如果提供,將返回 base ** exp % mod
pow(2,3) # 8
pow(2,3,5) # 3
pow(-2,3,5) # 2
5.字符串格式化format方法
基本語法:"字符串{占位符}".format(值)
print("小明今年{}歲".format(18)) # 小明今年18歲
print("{1}喜歡{0}".format('蘋果','小紅')) # 小紅喜歡蘋果# 使用關鍵字參數
print("{name} 今年 {age} 歲,喜歡 {hobby}".format(name="小紅", age=20, hobby="讀書"
))
# 輸出:小紅 今年 20 歲,喜歡 讀書# 可以重復使用
print("{fruit} 很甜,我喜歡吃 {fruit}".format(fruit="西瓜"))
# 輸出:西瓜 很甜,我喜歡吃 西瓜print("{0} 買了 {1} 個 {fruit}".format("小李", 3, fruit="蘋果"))
# 輸出:小李 買了 3 個 蘋果# 右對齊,寬度10,用空格填充
print("|{:>10}|".format("hello")) # 輸出:| hello|# 左對齊,寬度10
print("|{:<10}|".format("hello")) # 輸出:|hello |# 居中對齊,寬度10
print("|{:^10}|".format("hello")) # 輸出:| hello |# 指定填充字符
print("|{:*^10}|".format("hello")) # 輸出:|**hello***|
print("|{:=^10}|".format("hello")) # 輸出:|==hello===|# 十進制
print("{:d}".format(42)) # 輸出:42# 二進制
print("{:b}".format(42)) # 輸出:101010# 八進制
print("{:o}".format(42)) # 輸出:52# 十六進制(小寫)
print("{:x}".format(255)) # 輸出:ff# 十六進制(大寫)
print("{:X}".format(255)) # 輸出:FF# 帶前綴的十六進制
print("{:#x}".format(255)) # 輸出:0xff
print("{:#X}".format(255)) # 輸出:0XFF# 顯示正負號
print("{:+d}".format(42)) # 輸出:+42
print("{:+d}".format(-42)) # 輸出:-42# 只顯示負號(默認)
print("{:d}".format(42)) # 輸出:42
print("{:d}".format(-42)) # 輸出:-42# 正數前加空格
print("{: d}".format(42)) # 輸出: 42
print("{: d}".format(-42)) # 輸出:-42# 千位分隔符
print("{:,}".format(123456789)) # 輸出:123,456,789
print("{:_}".format(123456789)) # 輸出:123_456_789# 復雜的數字格式化
num = 1234.5678
print("|{:>15,.2f}|".format(num)) # 輸出:| 1,234.57|
print("|{:0>15,.2f}|".format(num)) # 輸出:|00000001,234.57|