編程基礎
一組能讓計算機識別和執行的指令
電子計算機
能夠執行程序的機器
現代計算機
英國數學家、邏輯學家,艾倫.麥席森.圖靈被稱為計算機科學之父,人工智能之父。圖靈提出的著名的圖靈模型為現代計算機的邏輯工作方式奠定了基礎
圖靈機,又稱圖靈計算機、圖靈計算機,由圖靈提出的一種抽象計算機模型,即將人們使用紙筆進行數學運算的過程進行抽象,由一個虛擬的機器替代人們進行數學運算。
所謂的圖靈機就是指一個抽象的機器,它有一條無限長的紙帶,紙帶分成一個一個的小方格,每個方格都有不同的顏色。有一個機器頭在紙帶上移來移去。機器頭有一組內部狀態,還有一些固定的程序。在每個時刻,機器頭都要從當前紙帶上讀入一個方格信息,然后結合自己的內部狀態查找程序表,根據程序輸出信息到紙帶方格上,并轉換自己的內部狀態,然后進行移動。
馮.諾依曼著名匈牙利美籍猶太人,數學家、計算機科學家、物理學家和化學家,數字計算機之父。他提出了以二進制作為數字計算機的數制基礎,計算機按照程序順序執行,應有五大部件。
1、CPU由運算器和控制器組成
2、運算器,完成各種算數運算、邏輯運算、數據傳輸等數據加工處理
3、控制器,控制程序的執行
4、存儲器,用于記憶程序和數據,例如內存
5、輸入設備,將數據或者程序輸入到計算機中,例如鍵盤、鼠標
6、輸出設備,將數據或程序的處理結果展示給用戶,例如顯示器、打印機
7、CPU中還有寄存器和多級緩存Cache
寄存器:寄存器是中央處理器內的組成部分。寄存器是有限存貯容量的高速存貯部件,它們可用來暫存指令、數據和地址。在中央處理器的控制部件中,包含的寄存器有指令寄存器(IR)和程序計數器(PC)。在中央處理器的算術及邏輯部件中,存器有累加器(ACC)。—可以不用過多了解。
緩存就是數據交換的緩沖區(稱作Cache),當某一硬件要讀取數據時,會首先從緩存中查找需要的數據,如果找到了則直接執行,找不到的話則從內存中找。由于緩存的運行速度比內存快得多,故緩存的作用就是幫助硬件更快地運行。
工作原理
1、讀取順序
CPU要讀取一個數據時,首先從Cache中查找,如果找到就立即讀取并送給CPU處理;如果沒有找到,就用相對慢的速度從內存中讀取并送給CPU處理,同時把這個數據所在的數據塊調入Cache中,可以使得以后對整塊數據的讀取都從Cache中進行,不必再調用內存。
正是這樣的讀取機制使CPU讀取Cache的命中率非常高(大多數CPU可達90%左右),也就是說CPU下一次要讀取的數據90%都在Cache中,只有大約10%需要從內存讀取。這大大節省了CPU直接讀取內存的時間,也使CPU讀取數據時基本無需等待??偟膩碚f,CPU讀取數據的順序是先Cache后內存。
2、緩存分類
Intel從Pentium開始將Cache分開,通常分為一級高速緩存L1和二級高速緩存L2。在以往的觀念中,L1 Cache是集成在CPU中的,被稱為片內Cache。在L1中還分數據Cache(D-Cache)和指令Cache(I-Cache)。它們分別用來存放數據和執行這些數據的指令,而且兩個Cache可以同時被CPU訪問,減少了爭用Cache所造成的沖突,提高了處理器效能。
3、讀取命中率
CPU在Cache中找到有用的數據被稱為命中,當Cache中沒有CPU所需的數據時(這時稱為未命中),CPU才訪問內存。從理論上講,在一顆擁有2級Cache的CPU中,讀取L1 Cache的命中率為80%。也就是說CPU從L1 Cache中找到的有用數據占數據總量的80%,剩下的20%從L2 Cache讀取。由于不能準確預測將要執行的數據,讀取L2的命中率也在80%左右(從L2讀到有用的數據占總數據的16%)。那么還有的數據就不得不從內存調用,但這已經是一個相當小的比例了。在一些高端領域的CPU(像Intel的Itanium)中,我們常聽到L3 Cache,它是為讀取L2 Cache后未命中的數據設計的—種Cache,在擁有L3 Cache的CPU中,只有約5%的數據需要從內存中調用,這進一步提高了CPU的效率。
編程基礎
計算機語言
人與計算機之間交互的語言
機器語言
1、一定位數組成二進制的0和1的序列,成為機器指令。機器指令的集合就是機器語言
2、與自然語言差異太大,難學、難懂、難寫、難記、難查錯
匯編語言
1、用一些助記符號代替機器指令,稱為匯編語言。ADD A,B指的是將寄存器A的數與寄存器B的數相加得到的數放到寄存器A中
2、匯編語言寫好的程序需要匯編程序轉換成機器指令
3、匯編語言只是稍微好記了些,可認為就是機器指令對應的助記符,只是符號本身接近自然語言
語言分類
低級語言
1、面向機器的語言,包括機器語言、匯編語言
2、不同的機器不能通用,不同的機器需要不同的機器指令或者匯編程序
高級語言
1、接近自然語言和數學語言的計算機語言
2、高級語言首先要書寫源程序,通過編譯程序把源程序轉換成機器指令的程序
3、1954年正事發布的Fortran語言是最早的高級語言,本意是公式翻譯
4、人們只需要關心怎么書寫源程序,針對不同機器的編譯的事交給編譯器關心處理
二者對比:
1、語言越高級,越接近人類的自然語言和數學語言
2、語言越低級,越能讓機器理解
3、高級語言和低級語言之間需要一個轉換的工具:編譯器、解釋器
4、C、C++等語言的源代碼需要本地編譯
5、Java、Python、C#的源代碼需要被解釋器編譯成中間代碼(Bytecode),在虛擬機上運行
6、編譯語言,把源代碼轉換成目標機器的CPU指令
7、解釋語言,解釋后轉換成字節碼,運行在虛擬機上,解釋器執行中間代碼
程序:
1、算法+數據結構=程序
2、數據一切程序的核心
3、數據結構是數據在計算機中的類型和組織方式
4、算法是處理數據的方式,算法有優劣之分
寫程序的難點:
1、理不清數據
2、搞不清處理方法
3、無法把數據設計轉換成數據結構、無法把處理方法轉換成算法
4、無法用設計范式來進行程序設計
5、世間程序皆有bug,但不會debug
Python解釋器:
1、官方CPython
C語言開發,最廣泛的Python解釋器
2、IPython
一個交互式、功能增強的Cpython
3、PyPy
Python語言寫的Python解釋器,JIT技術,動態編碼
JIT技術,動態編碼
4、Jython
Python的源代碼變成Java的字節碼,跑在JVM上
5、IronPython
與Jython類似,運行在.Net平臺上的解釋器,Python代碼被編譯成.Net的字節碼
# Python基礎語法
注釋 #
數字
整數,不區分long(長整數)和int(整數)
進制0XA,0O10,0B10
bool,2個值True、False
int:(符號整數)通常被稱為是整數或整數,沒有小數點的正數或負數
long:(長整數)或渴望,無限大小的整數,這樣寫整數和一個大寫或小寫的L
Python允許你使用長L的小寫,但建議您只使用一個大寫字母L,以避免與數字1混淆。python長整數顯示一個大寫字母L。
浮點數
1.2、3.1415、-0.12、1.46e9等價于1.46*10*9
float:(浮點實際值)彩車,代表實數,小數除以整數部分和小數部分的書面?;ㄜ囈部赡苁窃诳茖W記數法與E或指示的10次方(2.5e2 = 2.5 x 10*2 = 250)
復數,1+2j
complex:(復數)+BJ的形式,其中a、b是彩車和J(或j)表示-1的平方根(這是一個虛數)。a是真正的數字部分,b是虛部。復數不使用Python編程。
一個復雜的數字組成的有序對一個真正的浮點數字+ BJ,其中a是實部和b是復數的虛部表示
字符串
1、使用'”單雙引號引用的字符的序列
2、”’ “””單雙三引號,可以跨行,可以在其中自由的使用單雙引號
3、在字符串前面加上R或者r前綴,表示該字符串不做特殊處理
數字轉換類型
Python的數字轉換內部包含一個共同的評價類型的混合型的表達。但有時,你需要明確強迫一個數字從一個類型到另一個運算符或函數的參數,以滿足要求。
int類型(X)轉換X到一個普通整數。
long(X)轉換X到一個長整數。
float類型(X)轉換X到浮點數字。
complex (x)的轉換與真正的第X部和虛部為零的x到一個復雜的數量。 類型復雜(X,Y)轉換x和y的第X部和虛部?復數。 x和y是數值表達式 內置數功能
數值類型實例:
int? ??? ??long ???????????? ????????float????? ????? ?complex
10?? ??? ?51924361L????? ???????? ???????0.0 ?????? ???????3.14j
100 ??? ?-0x19323L????? ???????? ???????15.20???? ?????? 45.j
-786??? 0122L? ?????? ????????????? ???????-21.9???? ?????? 9.322e-36j
080 ??? ?0xDEFABCECBDAECBFBAEl ??32.3e+18???? ?.876j
-0490?? 535633629843L? ????????? ???????-90.?????? ?????? -.6545+0J
-0x260? -052318172735L ????????? ???????-32.54e100?? ?3e+26J
0x69??? -4721885298529L????????? ? ?????70.2E-12???? ?4.53e-7j
Python 保留字符
下面的列表顯示了在Python中的保留字。這些保留字不能用作常數或變數,或任何其他標識符名稱。
所有 Python 的關鍵字只包含小寫字母。
and ????? exec? ????? not
assert??? ? finally????? ? ????or
break??? ? for???? ????? pass
class????? ? from? ????? print
continue? global???? ? ?raise
def ????? if?????? ????? return
del? ????? import??? ? ?try
elif? ? ????in????? ????? while
else ? ????is????? ????? with
except?? ? lambda??? ? ?yield
基礎語法
轉義序列:
\\ \t \r \n \’ \”
model:
print(“I\’m OK.”)
I’m OK.
print(“I\’m \\OK.”)
I’m \OK.
print(“I\’m \tOK.”)
I’m???? OK.制表
print(“I\’m \nOK.”)
I’m 換行
OK.
print(r”I\’m OK.”)
I\’m OK. r”:”內的字符串默認不轉義
print(‘\\\t\\’)
\?????? \
print(‘\\\n\\’)
\
\
縮進:
1、未使用C等語言的花括號,而是采用縮進的方式表示層次關系
2、約定使用4個空格縮進
續行:
1、在行尾使用\
2、如果使用各種括號,認為括號內是一個整體,內部跨行不用\
變量賦值:
counter = 100 # 賦值整型變量
miles = 1000.0 # 浮點型
name = “John” # 字符串
print counter
print miles
print name
標準數據類型
Numbers(數字)
String(字符串)
List(列表)
Tuple(元組)
Dicionary(字典)
標識符:
1、一個名字,用來指代一個值
2、只能字母、下劃線和數字
3、只能以字母或下劃線開頭
4、不能是python的關鍵字,例如def、class不能作為標識符
5、python是大小寫敏感的
約定:
不允許使用中文
不允許使用歧義單詞,例如class_
在python中不要隨便使用下劃線開頭的表示符
常量:
一旦賦值就不能改變值的標識符
python中無法定義常量
字面常量:
一個單獨的量,例如12、“ABC”、‘2341.09e-9’
變量:
賦值后,可以改變值的標識符
# python語言類型
1、python是動態語言、強類型語言
動態編譯語言:
不用事先聲明類型,隨時可以賦值為其他類型
編程時不知道是什么類型,很難推斷
強類型語言
不同類型之間操作,必須先強制類型轉換為同一類型
運算符:
+:加,兩個對象相加
-:得到負數或是一個數減去另一個數
*:兩個數相乘或是返回一個被重復若干次的字符串
/:x除以y
%:取模,返回除法的余數
**:冪,返回x的y次冪
//:取整除,返回商的整數部分
備注:開篇就說過2.x和3.x區別
自然除/結果是浮點數,整除//
位運算符:
&:按位與運算符:參與運算的兩個值,如果兩個相應位都為1,則該位的結果為1,否則為0
例如:a = 20 b =10
a&b即為:
20用二進制表示:0001 0100
10用二進制表示:0000 1010
這樣得出a&b的值就為0
In [11]: a = 20
In [12]: b = 10
In [13]: print(a&b)
0
|:按位或運算符:只要對應的二個二進位有一個為1時,結果位就為1
a|b二進制結果為:0001 1110即為30
In [14]: print(a|b)
30
^:按位異或運算符:當兩個對應的二進位相異時,結果為1
In [15]: print(a^b)
30
這個剛好和a|b結果一樣
假如:a = 5 b = 3
0000 0101
0000 0011
0000 0110 結果為6,而a|b為7
~:按位取反運算符:對數據的每個二進制位取反,即把1變為0,把0變為1
例如:~8
即:???? 0000 1000
按位取反:1111 0111
補位取反:0000 1001 得出值為-9
例如:60
0011 1100
1100 0011
0011 1101 得值-61
<<:左移動運算符:運算數的各二進位全部左移若干位,由”<<“右邊的數指定移動的位數,高位丟棄,低位補0
In [24]: 2<<3
Out[24]: 16
值的由來:0000 0010 向左移動兩位:0001 0000得值16
In [25]: 100<<2
Out[25]: 400
0110 0100
移動: 1 1001 0000 即2*8 + 2*7 + 2*4 = 400
>>:右移動運算符:把”>>”左邊的運算數的各二進位全部右移若干位,”>>”右邊的數指定移動的位數
In [29]: 2 >> 2
Out[29]: 0
0000 0010 移動:0000 0000
In [30]: 200 >> 3
Out[30]: 25
1100 1000 移動 0001 1001 = 25
10^9=3 10^-9=-3
比較運算符:
== != > < >= <=
返回一個bool值
1 < ‘1’ 1 == ‘1’
==如果兩個操作數的值相等,則條件為真。
!= 如果兩個操作數的值不相等,則條件為真。
>如果左操作數的值大于右操作數的值,則條件成真
<如果左操作數的值小于右操作數,則條件為真
>=如果左操作數的值大于或等于右操作數的值,則成為真
<=如果左操作數的值小于或等于右操作數的值,則條件為真
邏輯運算符:
與或非 and or not
and:如果兩個操作數都為真,則條件成立
or:如果兩個操作數中的任何一個非零,則條件成為真
not:用于反轉操作數的邏輯狀態
短路運算符
and 如果第一個表達式為False,后面就沒用必要計算了,這個邏輯表達式一定是False
or 如果第一個表達式True,后面沒有必要計算了,這個邏輯表達式一定是True
賦值運算符:
a = min(3,5)
+= -= *= /= %=
=:將右側操作數的值分配給左側操作數
+=:將右側操作數相加到左操作數,并將結果分配給左操作數
-=:從左操作數中減去右操作數,并將結果分配給左操作數
*=:將右側操作數與左側操作數相乘,并將結果分配給左操作數
/=:將左側的操作數除以右操作數,并將結果分配給左操作數
%=:將左操作數除以右操作數的模數,并將結果分配給左操作數
**=:執行指數(冪)計算,并將值分配給左操作數
//=:取整除 – 返回商的整數部分
成員運算符:
in、not in
身份運算符:
is、is not
運算符優先級:
運算符? ??? ?????????????????????????? ??描述
** ???? ?????????????????????????????? 指數(最高優先級)
~ + – ????????????????????????????????? 按位翻轉, 一元加號和減號 (最后兩個的方法名為 +@ 和 -@)
* / % // ?????????????????????????????? 乘,除,取模和取整除
+ – ? ?????????????????????????????? 加法減法
>> << ?????????????????????????????? 右移,左移運算符
& ???? ?????????????????????????????? 位 ‘AND’
^ | ?? ?????????????????????????????? 位運算符
<= < > >= ??????????????????????? 比較運算符
<> == != ????????????????????????????????? 等于運算符
= %= /= //= -= += *= **= ???? 賦值運算符
is is not ?????????????????????? 身份運算符
in not in ???????????????????? 成員運算符
not or and ???????????????????????? 邏輯運算符
表達數:
由數字、符號、括號、變量等的組合
1、算數表達式
2、邏輯表達式
3、賦值表達式
python中,賦值即定義,如果一個變量已經定義,賦值相當于重新定義
內存管理
變量無須事先聲明,也不需要指定類型
動態語言的特性
編程中一般無須關心變量的存亡,也不用關心內存的管理
python使用引用計數記錄所有變量的引用數
當變量引用數變為0時,它可以被垃圾回收gc
計數增加:賦值給其它變量就增加引用計數,例如x=3;y=x
計數減少:
函數運行結束時,局部變量會自動銷毀,對象引用計數減少
變量被賦值給其它對象。例如x=3;y=x;x=4
有關性能的時候,就需要考慮變量的引用問題,但是該釋放內存,還是盡量不釋放內存,看需求
程序控制
順序:
按照先后循序一條條執行
分支:
根據不同的情況判斷,條件滿足執行某條件下的語句
循環:
條件滿足就反復執行,不滿足就不執行或不再執行
單分支結構:
if語句
if condition:
代碼塊
condition必須是一個bool類型,這個地方有一個隱式轉換
if 1<2:
print(‘1 less than 2’)
代碼塊:
類似于if語句的冒號后面的就是一個語句塊
在if、for、def、class等
多分支結構:
if…elif…else語句
if condition1:
代碼塊1
elif condition2:
代碼塊2
elif condition3:
代碼塊3
…
else:
代碼塊
分支嵌套:
score = 80
if score<0:
print(‘wrong’)
else:
if score == 0:
print(‘egg’)
elif score <= 100:
print(‘right’)
else:
print(‘too big’)
分支嵌套:
嵌套結構,可以是分支、循環的嵌套
可以互相嵌套多層
model:
score = 80
if score < 0:
print(‘wrong’)
else:
if score == 0:
print(‘egg’)
else score <= 100:
print(‘right’)
else:
print(‘too big’)
循環–while語句:
語法:
while condition:
block
當條件滿足即condition為True,進入循環體,執行block
model:
flag = 10
while flag:
print(flag)
flag -= -1
循環continue語句:
中斷當前循環的當次執行,繼續下一次循環
model:計算10以內的偶數(for循環)
for i in range(10):
if not i%2:
print(i)
循環break語句
終止當前循環
model:
計算1000以內的被7整除的前20個數(for循環)
count = 0
for i in range(0,1000,7):
print(i)
count += 1
if count >= 20:
break
循環else子句:
語句:
while condition:
block
else:
block
for elemen in iteratable:
block
else:
block
如果循環正常的執行結束,就執行else子句;如果使用break終止,else子句不會執行
幾個語句的詳細解析如下:
程序控制:
if語句:
if condition?? condition:[k?n?d??n]
代碼塊
condition必須是一個bool類型,這個地方有一個隱式轉換bool(condition)
bool:是Boolean縮寫,只有真(True)和假(False)兩種取值。
bool函數只有一個參數,并根據這個參數的值返回真或者假
“”,0,(),[],{},None:值都為假
空集合:
空字符串
空字典
空列表
空元組
model:
In [21]: bool(1)
Out[21]: True
In [22]: bool(0)
Out[22]: False
In [23]: if 1<2:
…:???? print(‘1 less than 2’)
…:
1 less than 2
代碼塊:
類似于if語句的冒號后面就是一個語句塊
在if、for、def、class等。
Python 編程中 if 語句用于控制程序的執行,基本形式為:
if 判斷條件:
執行語句……
else:
執行語句……
model:
num = 3
name = ‘Eric’
if name == ‘Eric’:
print(‘Welcome Eric’)
else:
print(num)
結果是:Welcome Eric
if 語句的判斷條件可以用>(大于)、<(小于)、==(等于)、>=(大于等于)、<=(小于等于)來表示其關系。
當判斷條件為多個值時,可以使用以下形式:
if 判斷條件1:
執行語句1……
elif 判斷條件2:
執行語句2……
elif 判斷條件3:
執行語句3……
else:
執行語句4……
model:
name = input(“Please enter a name: “)
if name == ‘Eric’:
print(‘Welcome 魏都酒狂泰谷子‘)
elif name == ‘zhangsan’:
print(‘old man’)
elif name == ‘lisi’:
print(‘young’)
else:
print(‘child’)
分支嵌套:
由于 python 并不支持 switch 語句,所以多個條件判斷,只能用 elif 來實現,如果判斷需要多個條件需同時判斷時,可以使用 or (或),表示兩個條件有一個成立時判斷條件成功;使用 and (與)時,表示只有兩個條件同時成立的情況下,判斷條件才成功。
num = 9
if num >= 0 and num <= 10:? # 判斷值是否在0~10之間
print(‘hello’)
# 輸出結果: hello
num = 10
if num < 0 or num > 10:? # 判斷值是否在小于0或大于10
print(‘hello’)
else:
print(‘undefine’)
# 輸出結果: undefine
num = 8
# 判斷值是否在0~5或者10~15之間
if (num >= 0 and num <= 5) or (num >= 10 and num <= 15):
print(‘hello’)
else:
print(‘undefine’)
# 輸出結果: undefine
練習:給定一個不超過5位的正整數,判斷其有幾位。
num = 13468
if num >= 1000:
if num >= 10000:
print(“5”)
else:
print(‘4’)
else:
if num >= 1000:
print(‘3’)
elif num >= 100:
print(‘2’)
else:
print(‘1’)
方法較多,不一一列舉,發散思維。例如,可以使用if…elif…elif…
循環:
上面的打印出來是偶數,下面為奇數
多種實現:
那么上面的相反,把==0換成==1,打印出來的就是偶數了。
while語句:
while condition:
block #:當條件滿足即condition為True,進入循環體,執行block。
num = 1
while num <9:
print(num)
num += 1 #不限定此條件的話,num從1開始,小于9,會一直循環下去,進入死循環。
while 語句時還有另外兩個重要的命令 continue,break 來跳過循環,continue 用于跳過該次循環,break 則是用于退出循環,此外”判斷條件”還可以是個常值,表示循環必定成立,具體用法如下:
model:
num = int(input(‘>>>’))
while num < 100:
num += 1
if num > 50:
continue
print(‘ok’)
model1:
# continue 和 break 用法
i = 1
while i < 10:
i += 1
if i % 2 > 0:? # 非雙數時跳過輸出
continue
print(i)? # 輸出雙數2、4、6、8、10
i = 1
while 1:? # 循環條件為1必定成立
print(i)? # 輸出1~10
i += 1
if i > 10:? # 當i大于10時跳出循環
break
從上面就可看出continue和break的區別,一個是跳出該次循環,一個是退出循環。
逆序排列:
flag=10
while flag:
print(flag)
flag -= 1
正序排列:
for i in range(10):
print(i)
加:
for i in range(10):
i+=1
print(i)
或者:
for i in range(10):
print(i+1)
count = 0
for i in range(0,10000,7):
print(i)
count += 1
if count < 4:
print(‘ok’)
else:
break
給定一個5位的正整數,判斷其有幾位,依次打印出個位,十位,百位,千位,萬位的數字。
val = input(‘>>>’)
val = int(val)
if val >= 1000: #
if val>=10000: num = 5
else:
num = 4
else:
if val>=100:
num = 3
elif val >= 10:
num = 2
else:
num = 1
print(num)
pre = 0
for i in range(num,0,-1): #從上面的出的num值進行循環,步長-1
cur = val//(10**(i-1)) #cur的值為:輸入的5位數整除10**(5-1),第一次循環得出萬位數,依次類推
print(cur – pre*10) #如當num為4時,pre為1
循環else子句:
while condition:
block
else:
block
for element in iteratable:
block
else: block
練習,打印一個邊長為n的正方形:
實心:
for i in range(4):
for i in range(4):
print(‘*’,end=‘? ‘)
print(‘\t‘)
空心的屬于網絡摘抄:
rows = int(input(‘輸入列數: ‘))
for i in range(0, rows):
for k in range(0, rows):
if i != 0 and i != rows – 1:
if k == 0 or k == rows – 1:
print(” * ” ,end=“”)#由于視覺效果看起來更像正方形,所以這里*兩側加了空格,增大距離
else:
print(”?? “,end=“”) #該處有三個空格
else:
print(” * “,end=“”) #這里*兩側加了空格
k += 1
i += 1
print(“\t“)
2、求100以內所有奇數的和。
sum = 0
for i in range(1,100,2):
sum += i
print(sum)
本文來自投稿,不代表Linux運維部落立場,如若轉載,請注明出處:http://www.www58058.com/87287