2-Python基礎語法-內存管理-運算符-程序控制

1 Python 基礎語法

        全部語言都有它本身規定的格式,Python也不例外,下面從幾個方面來了解。程序員

1.1 註釋

        在Python中主要的使用的註釋方式是#號,固然在某些狀況下三對單引號也是能夠的,好比在函數中能夠做爲函數的說明。express

num =int(input('>>>: '))    # 輸入一個數字
if num >= 1000:             # 條件判斷
    if num >= 10000:        # 大於10000
        print('5')          # 打印5位
    else:                   '''不然'''
        print('4')          '''打印4'''
else:
    if num >= 100:
        print('3')
    elif num >= 10:
        print('2')
    else:
        print('1')

1.2 縮進

        C語言使用的是花括號來表示層級關係,可是看起來不簡潔,挺難看,而Python使用的是縮進的方式表示層級關係,而且約定4個空格爲一個層級。編程

1.3 續行

        當咱們一行的代碼超過了一屏顯示的長度之後,多數狀況下爲了直觀,咱們會另起一行,接着些,在Python中在行尾使用 \ 標識續行,但若是在表達式或者某一段代碼中使用了括號,那麼Python認爲括號內是一個總體,內部跨行不須要使用\bash

1.4 標識符

        不少時候,咱們寫代碼的過程當中會對咱們須要的數據進行存儲並命名,方便後續使用,這個命名被稱爲標識符,針對標識符Python進行了以下要求:函數

  1. 一個名字,用來指代一個值
  2. 只能是字母、數字下劃線的組合
  3. 只能以字母或者下劃線開頭
  4. 不能是Python的關鍵字,例如def、class就不能做爲標識符
  5. Python是大小寫敏感的

        在咱們寫代碼的過程當中最好遵循下列約定:性能

  1. 不容許使用中文
  2. 不容許使用歧義單詞,例如class_
  3. 在Python中不要隨便使用下劃線開頭的標識符

1.5 轉義序列

        python中內置了不少特殊的符號,好比換行、製表符什麼的,部分含義以下:測試

  • \\:單個\表示轉義,\\ 就指代 \ 這個符號。表示把\後面的字符進行轉義,不用特殊方式進行轉換。
  • \t:製表符,通常用來進行輸出格式調整,好比對齊等
  • \r:回車符
  • \n: 換行符

1.6 數字

        在Python中數字主要分爲三種類型:整型浮點數,複數ui

  • 整型:在Python3中,不區分long和int,全部整型均爲int類型,固然還包括了不一樣進制,好比2進制,8進制,16進制等,都爲int類型。須要注意的是Python中的bool型屬於整型的子類,因此bool的兩個值,用整型能夠表示爲,0:False,非0:True
  • 浮點數:即帶小數點的float型
  • 複數:用於科學計算,好比1+2j等

1.7 字符串

        在Python中,使用'(單引號),"(雙引號)括起來表示引用字符的序列,使用'''""",則能夠跨行,而且自由的使用單雙引號。除此以外還能夠在字符串前加必定的符號來確切的表示字符串。code

  • r: 字符串前加r或者R,表示該字符串不作任何處理,所見即所得
  • f: 3.6版本開始新增的前綴,表示格式化字符串,例如變量引用
str1 = r'hello\nworld'   # 因爲使用了r前綴,因此並不會把\n解釋爲換行
str2 = f'nihao {str1}'   # 相似於 'nihao{}'.format(str1)
print(str1)   # hello\nworld
print(str2)   # nihao hello\nworld

1.8 其餘

        在Python中還有一些地方和其餘語言有很大區別,好比:

  1. 常量:自己指代一旦賦值就不能被改變的標識符,可是Python中是沒有這個概念的,換句話說就是,Python中,只要你看的到的東西,是均可以進行修改的。
  2. 字面常量:一個單獨的量,看字面意思就知其含義,好比12,就表示數字12
  3. 變量:賦值後,能夠改變值的標識符。

注意:在Python中是不須要提早申明變量的類型的,因此變量的賦值即定義

total = 2500   # 定義了一個total變量,它的值是2500。 賦值即定義

2 Python 運算符

        在Python中,運算符是比較重要的知識了,由於不少地方都須要知道多個數據的大小關係、邏輯關係,固然賦值也是須要用到運算符的,根據類型的不一樣,主要分爲賦值運算符算數運算符關係運算符邏輯運算符以及位運算符

2.1 賦值運算符

        咱們平常使用的=號就屬於賦值運算符的一種,在Python還有以下算數運算符:

  • =:賦值,例如:x=3,y='abc'
  • += :自加,例如:x+=2,則表示x=x+2
  • -=:自減,例如:x-=2,表示x=x-2
  • *=:自乘,例如:x=2,表示x=x2
  • /=:自除,例如:x/=2,表示x=x/2
  • %=:自取餘,例如:x%=2,表示x=x%2。 x對2取餘數,假如x=6,那麼取餘爲0

當把數字賦值給一個變量的時候不用加引號,而賦值字符串給變量的時候就須要加引號了,不然python認爲你賦值的是另外一個變量。

2.2 算數運算符

        數學計算中的+,-,* 等都屬於算數運算符的一種,其餘的運算符以下:

  • +:加,用來計算數字,若是字符串、列表等相加,等因而把兩個對象拼到一塊兒
  • -:減,同數學減
  • *:乘,同數學乘
  • /:除,4/3,默認是整除,爲了獲得小數,能夠把其中一個變量變成浮點型,4.0/3或4/3.0
  • //:表示只取整數,4.0/3 答案是1.33333,若是用4.0//,由於取整則,答案是1
  • %:表示取餘數,10%2餘0,10%3餘1
  • **:表示乘方 2**3 表示2的3次方

2.3 關係運算符

        關係運算符顧名思義就是判斷關係的,好比大於,小於啊,等等,須要注意的是返回值爲布爾值:即True或者False。更多的符號有:

  • >:大於,例如1>2,值是False
  • <:小於,例如1<2,值是True
  • >=:大於等於,例如1>=2,值是False
  • <=: 小於等於,例如1<=2,值是True
  • ==:是否等於,例如1==2,值是False
  • !=:不等於,例如 1!=2,值是True

2.4 邏輯運算符

        邏輯運算符主要包含了三個:and,or,not

  • and:邏輯與,只要有1個是false那麼值就是False,1==2 and 1<2 ,值是False,1!=2 and 1<2,值是Frue
  • or:邏輯或,只要有一個是true那麼值就是true,1=2 and 1<2 ,值是true
  • not:邏輯非,取反 not 1<2,值是true

邏輯運算符又被稱爲短路運算符:

  1. and 若是第一個表達式爲False,後面就不必計算了,這個邏輯表達式必定爲False
  2. or若是第一個表達式爲True,後面就不必計算了,這個邏輯表達式必定爲True

2.5 位運算符

        故名思議,位運算符主要是針對位進行的計算的,它比加減運算略快,一般也比乘除法運算要快不少。說到位就不得不提補碼了,由於計算機存儲負數時使用的都是補碼。

2.5.1 原碼、反碼、補碼、負數表示法

        計算機當初由於成本、複雜等各類緣由,在進行加減法計算的時候,會把減法變爲加法進行計算,如何理解呢?例如5-1,在計算機中進行計算的時候實際上用的是5+(-1),而負數在內存中並不會直接寫個-0b1,負數在計算機中使用的是補碼進行存儲和運算的,計算機中有關數字的都有什麼瑪?什麼是補碼?

  • 原碼:即人類可讀的二進制位(0b101,0b1)
  • 反碼:正數的反碼與原碼相同;負數的反碼符號位不變其他按位取反
  • 補碼:正數的補碼與原碼相同;負數的補碼符號位不變其他按位取反後+1

須要注意的是:負數在計算機中使用補碼進行存儲,好比-1在計算機存儲的是1111 1111,負數補碼的補碼就表示負數自己。正數的原碼反碼補碼都是相同的,計算機存儲內存中的數字都爲二進制位,當咱們想要查看具體表明的值時,計算機會轉換爲人類可讀的原碼進行顯示,即:若是最高的符號位是0,那麼認爲它是正數,不進行去補,而最高的符號位若是是1,那麼它會認爲它是負數,會按照負數的取補的規則進行計算後展現。

例題:計算機,計算 5 - 1 的過程

# 計算機中計算的是
5 + -1

# 推導方法:

 0000 0101   # 5的原碼
 1111 1110   # -1的補碼
 1111 1111   # -1的反碼   
10000 0100   # 溢出位捨去
 0000 0100   # 5-1 的結果爲 4

例題:計算~12

# ~12 表示取反
# 先將初始數轉換爲二進制,取反,的道德是補碼,再對補碼去補碼纔是取反的結果

0000 1100 # 12的原碼
1111 0011 # 取反,獲得補碼
1000 1100 # 再次取反,獲得反碼
1000 1101 # +1 獲得原碼

轉換爲10進制就是-13了

2.5.2 位運算符

        針對位的運算符主要有:& | ~ ^ << >>.

  • &:按位與,即按位相乘(1101 & 0001 , 與出來是0001)
  • |:按位或,即按位相加,不進位(1101 | 0001,或出來是1101) 0乘任何數是0,1+任何數是1
  • ^:按位異或
  • ~:取反
  • <<:左移(位)
  • >>:右移(位),例如32 >> 3 等於32//8 , 結果是4

位運算符,平常使用的很少,可是若是你想作一個高級程序員,那麼位運算是你必備的技能哦

2.6 成員、身份運算符

  • in/not in 成員測試,測試一個元素是否在一個序列中
  • is /is not 統一性的測試

2.7 運算符優先級

運算符 描述
** 指數 (最高優先級)
~ + - 按位翻轉, 一元加號和減號 (最後兩個的方法名爲 +@ 和 -@)
* / % //
+ - 加法減法
>> << 右移,左移運算符
& 位 'AND'
^ | 位運算符
<= < > >= 比較運算符
<> == != 等於運算符
= %= /= //= -= += *= **= 賦值運算符
is is not 身份運算符
in not in 成員運算符
not and or 邏輯運算符

小結:

  1. 算數運算符 > 位運算符 > 身份運算符 > 成員運算符 > 邏輯運算符
  2. 記不住的話,記得用括號
  3. 長表達式,多用括號。

注意:在Python中,賦值即定義,若是一個變量已經定義,賦值至關於從新定義

3 Python 內存管理

        計算機的內存大可能是線性編址的(1001,1002,1003門牌號,挨着排列的),如今有一個變量var1須要1001~1007空間,var2須要1008~1012空間,以下圖
memory1
        過了一段時間之後,var1中的1002,和1005不用了,var2的1010也不用了,內存就變成了以下的狀況:
memory2
        這時又來了一個 var3 須要申請 3個空間,在當前狀況下就沒辦法進行分配了
memory3
        這種狀況就是咱們常說的內存空洞了,也叫內存碎片化,若是沒辦法進行碎片整理,那麼這些分散的內存空間將沒有辦法被從新使用

3.1 Python的內存特性

  1. 變量無需事先聲明,也不須要指定類型,這是動態語言的特性
  2. Python使用引用計數記錄全部對象的引用數。
  3. 當對象的引用數變爲0,它就能夠被垃圾回收GC
    • 當對變量進行賦值時,同時會增長該對象的引用計數
    • 函數或代碼塊運行完畢,變量會消亡,那麼引用計數會減小

3.2 Python的GC管理

        Python在對內存進行管理時會像Java那樣對內存進行分類,Java中將內存分爲了老生代,新生代,持久化代,而Python中則分紅了0,1,2三代,其中0代能夠理解爲臨時存儲,1代爲短時間存儲,2代爲長期存儲,當應用申請內存時,會根據內存狀況先分配0帶給程序使用,而後按期檢查各個區的使用狀況,若是某個程序在0區待的夠久,那麼在 Python 啓動GC的時候,就會把它從0區移動到1區,同理在1區時間夠久的,移動到2區。固然在啓動GC的時候還會檢查引用計數爲0的對象,而後清理掉。
        須要注意的是,Python啓動GC的同時,不能進行其它的任務。頻繁的垃圾回收將大大下降Python的工做效率。若是內存中的對象很少,就沒有必要總啓動垃圾回收。因此,Python只會在特定條件下,自動啓動垃圾回收。當Python運行時,會記錄其中分配對象(object allocation)和取消分配對象(object deallocation)的次數。當二者的差值高於某個閾值時,垃圾回收纔會啓動。
memeory4
因此:

  1. Python編程中通常無需關心變量的存亡,通常也不用關心內存的管理,由Python的GC統一進行垃圾回收
  2. 當有關Python性能問題的時候,就須要考慮變量引用的問題,儘可能不要釋放內存,交由Python GC來操做,除非你更懂它。
# 查看引用計數
# 因爲1,2,15等這種常數,同時被Python語言解釋器自己等引用,因此直接打印計數器它的引用計數並不會是1。
>>> import sys
>>> x = []
>>> print(sys.getrefcount(x))    # 函數在執行時會進行參數傳遞操做,會使引用計數+1
2
>>> print(sys.getrefcount([])) 
1
>>>

4 程序控制

        Python的程序控制主要分爲順序,分支,循環,這也和大多數語言是相同的。

  • 順序結構:按照前後順序一條一條執行,好比:先起牀,再刷牙,再吃飯
  • 分支結構:根據不一樣的狀況判斷,條件知足後執行相應的操做,好比你去買個西紅柿,若是看見西瓜,就買兩個(真正的程序員會買回來兩個西紅柿的,別問我爲何,哈哈)
  • 循環結構:條件知足就反覆執行,不知足就不執行或者再也不執行(循環完畢)

4.1 分支結構

        計算機之因此能作不少自動化的任務,由於它能夠本身作條件判斷。在Python中主要經過if以及else的搭配來完成條件判斷的工做。條件判斷主要有三種基本用法。

4.1.1 單分支

        顧名思義即若是怎麼樣,就怎麼樣。(if)

if expression:
    statement(s)
 
注意:python使用縮進做爲其語句分組的方法,請使用4個空格
expression 表示條件表達式(好比:a>b)
statement 表示要執行的代碼

表達式:是將不一樣的數據(包括變量、函數)用運算符號按必定規則鏈接起來的一種式子。

4.1.2 多分支

多分支有分爲兩種狀況:

  1. 若是怎麼樣,就怎麼樣,不然,怎麼樣。(if、else)
  2. 若是1怎麼樣,就怎麼樣,若是2怎麼樣,就怎麼樣...,不然,怎麼樣(if、elif、else)
if expression:
    statement(s)
else:
    statement(s)
 
# else、elif,if都屬於同級
  
if expression:
    statement(s)
elif expression:
    statement(s)
else:
    statement(s)

注意:python使用縮進做爲其語句分組的方法,請使用4個空格
expression 表示條件表達式,必須是一個bool類型,由於這裏會隱式的使用bool(expression)進行轉換
statement 表示要執行的代碼

4.1.3 分支嵌套

        分支嵌套,就是將多個兩個或多個if判斷進行層級嵌套,完成更精確的判斷。

if expression:
    statement(s)           # 非必須,看狀況
    if expression:
        statement(s)
    else:                  # 非必須,看狀況
        statement(s)       # 非必須,看狀況
else:
    statement(s)

4.1.4 小結

  1. 條件的寫法很是多,能夠寫一個表達式或者多個表達式均可以,表達式的值爲0,就表示false。
  2. if就是判斷,主要就是對錶達式的邏輯值進行判斷
  3. 邏輯值(bool)包含了兩個值:
    • True表示非空的量(好比:string、tuple、list、set、dictionary),全部非零數。  
    • False表示0,None,空的量(空字符串,空字典,空列表,空便可,空元祖)等。這些對象又能夠成爲False等價

4.2 循環

        爲了讓計算機能反覆執行某一操做,咱們須要循環語句來完成。Python中的循環主要有兩種:for循環和while循環。

4.2.1 for 循環

        基本全部語言都有for關鍵字,它的曝光率遠遠超過其它關鍵字,但每一個語言有它本身的格式,在Python中它的格式爲

for element in iteratable:
    statemen(s)
 
# element 在循環時表示元素的變量(自行指定)
# iteratable:這裏表示一個可迭代對象,好比字符串,列表
# statemen(s) 表示要執行的代碼段

        在不少狀況下,咱們須要循環必定次數,咱們通常使用range函數來構建可迭代對象。

# range 用法說明:
range(stop) -> range object
range(start, stop[, step]) -> range object

# stop:表示中止位,默認從0開始
# start:起始位置
# step:步長(間隔)
# range(1,10,2) --> 1,3,4,5,7,9

        range是一個函數,接受1個或三個變量用於生成可迭代對象,能夠理解它是一個生成器,若是不對range進行迭代,那麼它就是一個生成器對象,不會直接計算數據,只有迭代,或者使用list函數才能夠獲取其生成的值,通常稱這種方式爲惰性求值。在Python2.x中是會直接生成列表的

4.2.2 for循環的else語句

        else語句是for循環正常結束後要執行的語句,若是for循環被終止(好比知足某條件跳出循環,break等),那麼就不會執行else後面的語句,它的格式爲:

for iterating_var in sequence:
  statemen(s)
else:
  statemen(s)

例子:

for i in range(0,10,2):
    if not i % 2 == 0:
        print('發現奇數')
        break
else:                   # 當循環執行完畢,沒有發現奇數,就會執行else語句
    print('沒有奇數')

4.2.3 while循環

        for 循環主要去對列表、字符串、文件的行數等有次數的循環上,while 通常在無限循環,或者在某些有條件的控制上,直到表達式變爲假(或者有一個break),才退會出while循環,表達式是一個邏輯表達式,必須返回一個True或False。

# 語法格式
while expression:
    statement(s)
 
#注意:避免寫成死循環

練習:判斷輸入的時候是空字符,是的話,就退出循環

while True:
    user_info = input('>>>: ')
    if not user_info:
        break
    print('Good,None to Quit')

while循環和for循環同樣都含有else語句,當while循環正常執行完畢,就會被觸發執行。

flag = 1
while flag < 10:
    if not flag % 2:
        print('發現偶數')
        break              # 若是發現偶數會直接跳出循環,不會執行else語句
    flag += 2 
else:                      # 若是沒有發現偶數,循環正常執行完畢,會執行else語句
    print('沒有發現偶數')

4.2.4 Python循環控制

        Python中的循環控制主要有三種方式,即:continuebreakpass

  • continue:繼續,當知足條件後,跳過本次循環。  
  • break:退出,當知足某一個條件後,終止循環。  
  • pass:佔位符,僅僅起到佔位的左右,沒有其餘效果。

須要注意的是:

  1. continue和break是循環的控制語句,隻影響當前循環,包括while、for循環
  2. 若是循環嵌套,continue和break也隻影響語句所在的那一層循環
  3. continue和break不是跳出語句塊,因此if exp: break 不是跳出if,而是終止if外的break的所在的循環

練習:給定一個不超過5位數的正整數,判斷該數的位數,一次打印出萬位,千位,百位,十位,個位的數字

num = 54321
weight = 10000
for i in range(5):
    c = num // weight
    print(c)
    num = num % weight
    weight //= 10
相關文章
相關標籤/搜索