Python學習筆記二
參考教程:廖雪峰官網https://www.liaoxuefeng.com/wiki/0014316089557264a6b348958f449949df42a6d3a2e542c000
一、輸入和輸出
通過“print()"函數可以向屏幕輸出指定文字:
print("Hello World!")
這裏通過雙引號加入要輸出的字符串,也可以通過單引號。該函數也接受多個字符串,之間用逗號”,"分隔,要註意的是這裏解釋器遇到分隔符逗號時會自動輸出一個空格:
print("Hello","World","!")
通過input()函數可以讓用戶輸入字符串:
name=input()
當上行代碼運行後,系統就等待用戶的輸入了,輸入完成後按回車鍵結束輸入。輸入的內容被存儲到name這個變量中了。
一次完整、友好的輸入輸出程序如下:
print("Please enter your name:") name = input() print("Hello,",name)
上述的提示信息也可以直接用input()實現,input()的參數會先被系統打印出來,然後再等待用戶輸入:
name = input("Please enter your name: ") print("Hello,",name)
二、Python基礎
*Python程序是大小寫敏感的;
*以“#"開頭的語句是註釋;
*作為良好的編程習慣,縮進建議使用4個空格符;
(一)數據類型
Python中的數據類型包括:整數、浮點數、字符串、布爾值、空值。
*字符串:通過單引號或雙引號括起來的任意文本即是字符串,如"abc"、"k"、”123“等。某些情況下需要通過轉義字符\來標識,對於字符串I‘m "OK"!,在Python中需要如下表示:‘I\‘m \"OK\"‘。
轉義字符中\n表示換行,\t表示制表符,\\表示字符‘\‘本身。有一種情況Python可以通過r‘‘(字母r+兩個單引號)表示其內部的字符串默認不進行轉義:
print(‘\\\t\\‘) #輸出\ \ print(r‘\\\t\\‘) #輸出\\\t\\
*空值在Python中用None表示,並不能理解為0。
*變量:對於變量的數據類型不固定的程序語言稱為動態語言,與之對應的是靜態語言。Python即是一種動態語言,所以在實際使用中,並不需要聲明這個過程就可以直接使用,在賦值後也可以再次賦予不同類型的值:
k=10 k="you" k=True
對於下列代碼的理解:
a="ABC" #1、內存中創建一個“ABC”的字符串 #2、內存中創建一個名為a的變量,並把他指向上述“ABC" b=a #把a的指向賦值給b,即指向上述”ABC" a="XYZ" #1、內存中創建一個“XYZ”的字符串 #2、把a指向上述“XYZ" print(b) #輸出"ABC",因為b的指向仍然為”ABC“
(二)字符編碼
因為計算機是美國人發明的,所以最早只有127個字符(26個大小寫字母加一些符號)被編碼到計算機裏,這個對應的編碼表被稱為ASCII編碼,比如A對應的ASCII碼是65(2進制為0100 0001),“z”對應編碼為122(2進制為0111 1010);ASCII碼長度為一字節,無法處理中文等其他符號,Unicode把所有語言都統一到一套編碼中,通常用兩個字節表示一個字符(除非特別生僻的會用到4個字節),字母A對應的Unicode編碼為00000000 01000001;比ASCII碼多出一倍的存儲空間,因此又出現了可變長的UTF-8編碼。UTF-8編碼把Unicode字符根據不同的大小編碼成1-6個字節,英文字母為1字節,中文漢字字符通常為3字節,很生僻的字符4-6字節,這樣如果要處理的字符包含大量英文字母,那使用UTF-8編碼就可以方便存儲和傳輸。
目前計算機系統通用的字符編碼工作方式:在計算機內存中統一使用Unicode編碼,當需要保存到硬盤或者需要傳輸時就使用UTF-8。比如用記事本編輯的時候,從文件讀取的UTF-8字符被轉換為Unicode字符到內存中,編輯完成後再轉換成UTF-8進行保存到文件裏。
在最新的Python3中,字符串是以Unicode進行編碼的,對於單個字符的編碼,Python提供了ord()函數獲取其整數編碼值,chr()函數則反向把編碼值轉換成字符。
由於Python中字符串類型是str,在內存中用Unicode表示,一個字符對應若幹字節,如果要在網絡上傳輸或者保存到硬盤裏,就需要把str變為以字節為單位的bytes:
x=b‘ABC‘
需要區分‘ABC‘和b‘ABC‘,前者是字符串,後者雖然內容和前者一樣,但是bytes的每個字符只占用一個字節,字符串可以通過encode()函數編碼為指定的bytes:
>>>‘ABC‘.encode(‘ascii‘) b‘ABC‘ >>>‘中文‘.encode(‘utf-8‘) b‘\xe4\xb8\xad\xe6\x96\x87‘ >>>‘中文‘.encode(‘ascii‘) TraceBack(most recent call last): ....
反過來,如果在硬盤或網絡上讀取了字節流,即數據為bytes,需要把bytes變為str,要用到decode()方法:
>>>b‘\xe4\xb8\xad\xe6\x96\x87‘.decode(‘utf-8‘) ‘中文‘ >>>b‘ABC‘.decode(‘ascii‘) ‘ABC‘
要計算str中包含多少個字符,可以使用len()函數,如果換成bytes,len()函數就計算字節數:
>>> len(‘ABC‘) 3 >>> len(‘中文‘) 2 >>> len(b‘ABC‘) 3 >>> len(b‘\xe4\xb8\xad\xe6\x96\x87‘) 6 >>> len(‘中文‘.encode(‘utf-8‘)) 6
在操作字符串時,經常遇到str和bytes的互相轉換,為了避免亂碼,應堅持utf-8編碼對str和bytes進行轉換,由於Python源代碼也是一個文本文件,所以,當你的源代碼中包含中文的時候,在保存源代碼時,就需要務必指定保存為UTF-8編碼。當Python解釋器讀取源代碼時,為了讓它按UTF-8編碼讀取,我們通常在文件開頭寫上這兩行:
#!/usr/bin/env python3 # -*- coding: utf-8 -*-
第一行註釋是為了告訴Linux/OS X系統,這是一個Python可執行程序,Windows系統會忽略這個註釋;
第二行註釋是為了告訴Python解釋器,按照UTF-8編碼讀取源代碼,否則,你在源代碼中寫的中文輸出可能會有亂碼。
三、list、tuple、dict和set
(一)list
list是一種有序的集合,可以添加和刪除元素。
classmates=[‘Michael‘,‘Bob‘,‘Tracy‘] #輸出列表長度3 len(classmates) #各個元素的訪問 classmates[0] classmates[1] classmates[2] classmates[-1] classmates[-2] classmates[-3] #在列表尾部添加元素 classmates.append[‘Adam‘] #指定位置插入元素 #插入後列表為:‘Michael‘ ‘Bob‘ ‘Jenny‘ ‘Tracy‘ ‘Adam‘ classmates.insert(2,‘Jenny‘) #刪除列表尾部元素並返回 classmates.pop() #刪除指定位置的元素並返回 #刪除後列表為:‘Michael‘ ‘Jenny‘ ‘Tracy‘ ‘Adam‘ classmates.pop(1) #列表內的元素的數據類型可以不相同 Lista=[‘123‘,88,‘abc‘,True,[1,2,‘12‘]] #返回‘12‘ Lista[4][2]
(二)tuple
tuple是另外一種有序的列表,但其一旦初始化就不能進行修改,也沒有insert、append這些方法,所以代碼更安全。
#定義一個tuple t=(1,2) #定義一個空元素的tuple t1=() #定義一個元素的tuple,元素後必須加一個逗號 t2=(1,)
對於如下代碼:
t=(‘a‘,‘b‘,[‘A‘,‘B‘]) t[2][0]=‘X‘ t[2][1]=‘Y‘
可以發現t改變了,如何在這裏理解tuple元組的不可變呢?元組t在定義時候有三個元素,為兩個字符串和一個列表;要註意這裏第三個元素的指向始終是這個列表,只是這個列表最開始是指向了存儲‘A‘和‘B‘的內存,隨後又指向了新創建的兩個字符串‘X‘和‘Y‘的內存。元組中第三個元素的指向並沒有變,變的是其指向的列表的指向。
(三)dict
Python內置的數據類型字典dict使用鍵:值的方式存儲,具有極快的查詢速度。
d={‘Michael‘:95,‘Bob‘:75,‘Tracy‘:85} #只需要知道鍵就可以直接查詢到值 print(d[‘Tracy‘])
與列表不同,列表是有序的,查詢列表需要從下標0開始逐個查找,直到查找到為止。字典是先直接計算出鍵對應的位置,然後直接取出其值,所以對於這種key:value的存儲方式,在添加元素的時候,必須根據key算出value的存儲位置,這種算法稱為哈希算法。要保證哈希算法的正確性,作為key的對象就不能變,因此key 必須是不可變類型,即整數、字符串、浮點數、元組。也因此字典中一個鍵只能對應一個value。
d={‘Michael‘:95,‘Bob‘:75,‘Tracy‘:85} #直接添加新元素 d[‘Jenny‘]=90 #多次添加同一鍵的值,後面會覆蓋前面的值 d[‘Jenny‘]=96 #如果訪問一個不存在的鍵會報錯 print (d[‘Tom‘]) #可以用in先進行判斷 str=input(‘please enter the name:‘) if str in d: print (d[str]) #通過get()方法返回其值,如果參數鍵不存在返回None #也可以在get(‘key‘,?)中第二個參數自定義如鍵不存在則返回的值 print (d.get(‘Tom‘,‘查詢的鍵不存在‘)) #pop(key)方法可以刪除一個鍵及其值 x=pop(‘Bob‘)
(四)set
set類似於dict,是一組key的集合,所以set的元素必須也為不可變類型,但其不存儲值,因為key不能重復,所以set中也不能有重復的元素。
#set的創建需要通過set()方法,並提供一個列表作為輸入集 #創建後s={1,2,3},重復元素會被過濾掉 s=set([1,2,2,3,1]) #通過add()方法添加元素 s.add(4) s.add(2) #s={1,2,3,4} #通過remove()方法刪除元素 s.remove(4) #s={1,2,3} #兩個set可以做數學意義上的交集合集等操作 s0={[1,3,5]} sn1=s&s0 #sn1={1,3} sn2=s|s0 #sn2={1,2,3,5}
四、循環
Python中的循環有兩種方式:
(一)for/in循環
依次把需要循環的每個元素叠代出來:
names=[‘Michael‘,‘Bob‘,‘Tracy‘] for name in names: print (name)
如果要計算1到10之間的整數和:
t=(1,2,3,4,5,6,7,8,9,10) sum=0 for x in t: sum+=x print (sum)
那麽如果要計算更大區間的整數之和,比如1到100的,就可以用到range()函數,先生成一個整數序列,再通過list()函數將其轉換成list。如range(5)生成的序列從0到小於5的整數:0,1,2,3,4。
list(range(5)) #生成[0,1,2,3,4]
sum=0 for x in range(101): sum+=x print(sum)
(二)while循環
只要條件滿足,就不斷循環,直到條件不滿足時退出。
#計算100以內奇數之和 sum=0 i=0 while (2*i+1<=100): sum+=2*i+1 i++ print(sum)
(三)break
break語句一般用於循環中的提前退出:
n=1 while n<100: if n>10: break print(n) n=n+1 print(‘end‘)
(四)continue
用於循環過程中跳出當前次的循環,直接進入下一次循環:
#continue計算100以內奇數之和 sum=0 i=0 while i<=100: if i%2==0: i++ continue
i++ sum+=i print(sum)
Python學習筆記二