Python基礎-學習筆記
雜
Python中用#
進行註釋。 三單引號既是多行字串,又可以作為註釋。
以0b
或0B
開頭表示二進位制,0o
或0O
表示八進位制,0x
或0X
表示十六進位制。
浮點數的取值範圍約為\(-10^{308}\)至\(10^{308}\),精度數量級為\(10^{-16}\)。浮點數間的運算存在不確定尾數。
複數的定義:直接把j
接在虛部的數字的後面,如:
z = 1e0 + 2e0j
用z.real和z.imag呼叫實部和虛部。
round(f, i)
表示對浮點數\(f\)四捨五入擷取小數點後\(i\)位。(i
可以省略,預設為0)
如果\(a^b\)的結果很大以至於程式不能運算,但是我們只需要對一個數取餘的結果的話,可以用pow(a, b, c)
max(x1, x2, ..., xn)
求最大值,min
同理。
int()
和float()
可以強制轉換字串。
complex()
可以強制轉換為複數。
print
會自動列印一個\n
,如果無需換行,可以用end
來指定結尾:
**
表示乘方,//
表示整除。
Python中沒有自加自減操作。
常用邏輯語句:and
、or
、not
、Ture
、Flase
if
用法:
if Co1:
Ex1
Ex2
elif Co2:
Ex3
else:
Ex4
while
用法:
while Co:
Ex1
else:
Ex2
(如果迴圈沒有因break
退出,則執行else
for
用法:
for i in range(1, 5):
Ex1
else:
Ex2(若從迴圈內部break則不會執行)
此處range(1, 5)
生成的是一個1到 4 的數字列表,而上面for
中的range
可以用其他列表代替。
另外,遍歷字串s
中的每個字元可以用for c in s
。
定義二/多維陣列:
dp = [[0 for i in range(n)] for j in range(m)]
os.sep
:該系統下分隔符是\\
還是/
還是':'。
異常處理:
try: <Block 1> except: <Block 2> else: <Block 3> finally: <Block 4>
如果<Block 1>發生錯誤,則會執行<Block 2>,否則執行<Block 3>;無論如何都會執行<Block 4>。
函式
函式定義方式:
def F(a, b, c):
Ex..;
F(a, b, c)
在函式中呼叫全域性變數需用global
宣告,如:
x = 50
def F():
global x
print(x)
F()
在函式中,如果沒有對某個組合資料型別的變數進行了初始化(比如C=[]
),那麼認為它是全域性變數。
函式的引數可以像C++一樣地賦予一個預設值,如:
def func(a, b=5, c=10):
print('a is', a, 'and b is', b, 'and c is', c)
func(3, 7)
func(25, c=24)
func(c=50, a=100)
輸出結果為:
a is 3 and b is 7 and c is 10
a is 25 and b is 5 and c is 24
a is 100 and b is 5 and c is 50
注意:可選引數必須放在非可選引數後面。
函式引數前加一個星號表示元組,加兩個星號表示字典。
如:
def fact(n, *b):
s = 1
for i in range(1, n + 1):
s *= i
for item in b:
s *= item
return s
print(fact(10, 3, 5, 8))
同一個函式內的return
值的型別可以不一樣。
函式的return值可以有多個、用逗號隔開,此時返回型別為元組。
lambda函式
格式:
<函式名> = lambda <引數> : <表示式>
例如:
f = lambda x, y : x + y
print(f(10, 15))
輸出為25
。
列表(List)
用法:
a.clear() #刪除所有元素
a = [1, 2, 3] #初始化
a.append(4) #在後方插入
n = len(a) #求長度
a.sort() #排序
b = a.copy() #複製
a.insert(1,2) #在位置1插入2
a.pop(1) #將位置1處元素取出並刪除
a.remove(1) #將第一個為1的元素刪除
a.reverse() #反轉
mx = max(a) #最值
cnt = a.count(2) #統計出現次數
for i in a:
print(i)
print(a[0]) #呼叫
del a[0] #刪除
此外,List還支援in
,not in
判斷,用加號連線,用乘號複製。
s.index(x)
或s.index(x,i,j)
返回s
中i
到j
中第一次出現x
的位置。
map(<函式名>,一個或多個序列)
表示對序列中的每一個元素執行函式,python2返回新列表,python3返回新列表的迭代器。
python3例子:
map(lambda x: x ** 2, [1, 2, 3, 4, 5])
map(lambda x, y: x + y, [1, 3, 5, 7, 9], [2, 4, 6, 8, 10])
#結果為[3, 7, 11, 15, 19]
元組(Tuple)
定義時用()
括起來,中間用逗號隔開。(()
可省略但不推薦)
元組和字串一樣不能被修改。
例:
a = (1, 2, 3);
b = (a, 4, 5, 6);
c = (a, b, 7, 8, 9)
print(a[0], a[1], a[2])
print(b[0], b[0][0], b[1], b[2], b[3])
print(c[0], c[0][0], c[1], c[2], c[3], c[4])
輸出結果為:
1 2 3
(1, 2, 3) 1 4 5 6
(1, 2, 3) 1 ((1, 2, 3), 4, 5, 6) 7 8 9
(列表也可以類似地巢狀使用)
元組也可以通過len
來獲取長度,[]
來獲取下標。
字典(Dictionary)
相當於std::map
,但是不會進行排序。用d = {key : value1 , key2 : value2}
的形式定義。
例:
no.clear();
no = {
"Alice" : 1,
"Bob" : 2
}
print(no["Bob"])
del no["Bob"]
print(len(no))
for name, num in no.items():
print(name, num)
no["Cindy"] = 3
if "Cindy" in no:
print(no["Cindy"])
no.keys() #所有鍵資訊
no.values() #所有值資訊(它們不是list型別,但是可以用for遍歷)
no.items() #所有鍵值對資訊
d.get(k,<default>)
:如果鍵k
存在,則返回對應值,否則返回<default>
。
d.pop(k,<default>)
:如果鍵k
存在,則取出對應值,否則返回<default>
。
d.popitem()
:隨機取出一個鍵值對,以元組形式返回。
(對於p = {}
,我們呼叫其型別type(p)
,返回的是dist而不是set)
對於以上的資料型別(包括字串),都可以用[]
進行下標呼叫。
下標0表示第1個元素,下標1表示第二個元素,以此類推。
負下標表示倒數第幾個元素。
[a:b]
表示元素a
到元素b
的前一個元素間的所有元素(切片(Slicing)操作)。
字串進行切片操作得到的還是字串。
若a
省略,則表示從第一個元素開始,若b
省略,則表示一直到最後一個元素。
例:
shoplist = ['apple', 'mango', 'carrot', 'banana']
print('Item 1 to 3 is', shoplist[1:3])
print('Item 2 to end is', shoplist[2:])
print('Item 1 to -1 is', shoplist[1:-1])
print('Item start to end is', shoplist[:])
另外可以在後面再加一個:
和數字表示間隔,比如:
List = [1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19, 20]
print(List[3 : 20 : 2])
輸出:
[4, 6, 8, 10, 12, 14, 16, 18, 20]
如果間隔是負數,則表示倒過來排,比如"abcd"[::-1]
相當於"dcba"
集合(Set)
和STL不同,Python的Set是無序的。
集合用{}
表示,用{}
或set()
建立,用set()
建立空集合。
(定義時集合中元素可以重複,會自動去重)
若定義為B = set("pypy123")
,那麼相當於B = {'1', 'p', '2', '3', 'y'}
運算子|
取並,&
取交,^
取兩集合中的非相同元素,S-T
表示在S
中但不在T
中的元素。
用>
,<
,>=
,<=
判斷子集和包含關係。
S.add(x)
:增加元素
S.discard(x)
:如果x
在S
中則刪除
S.remove(x)
:如果x
在S
中則刪除,如果不在則報錯
S.clear(x)
:移除所有元素
S.pop()
:隨機取出一個元素,若為空則報錯
S.copy()
:返回一個副本
len(S)
:元素個數
x in S
:是否包含
x not in S
:是否不包含
set(p)
:將其它型別變數轉成set
set
可作為for
迴圈的列表。
例:
try:
while True:
print(A.pop(), end = "")
except:
pass
注意:直接用=
將一個物件賦給另一個物件時,只是引用,如果對一個進行修改,那麼另一個也會隨之修改。如果要使該物件可以獨立修改,則需要用切片操作進行賦值。
檔案操作
開啟檔案:<變數名>=open(<檔名>,<開啟模式>)
其中,檔名為路徑(既可以是絕對路徑也可以是相對路徑)和名稱,Windows下路徑用\
隔開,但是\
需要轉義即寫成\\
,為了方便一般寫成/
。
開啟模式:
'r'
:只讀,若不存在則返回FileNotFoundError(預設)
'w'
:檔案不存在則建立,存在則覆蓋
'x'
:檔案不存在則建立,存在則返回FileNotFoundError
'a'
:檔案不存在則建立,存在則在最後追加內容
'b'
:二進位制檔案模式
't'
:文字檔案模式(預設)
'u+'
(u
替換為r
,w
,x
,a
中的一個):在原功能基礎上增加讀寫功能例:
a = open('a.in','rt')
(即預設)
檔案關閉:<變數名>.close()
讀取方式:
<f>.read(size=-1)
:讀入全部內容,如果給出引數size
,則讀入前size
長度。
<f>.readline(size=-1)
:讀入一行內容,如果給出引數size
,則讀入該行前size
長度。
<f>.readlines(hint=-1)
:讀入所有行,以每行內容(包括換行符)為元素形成列表,如果給出引數hint
,則讀入前hint
行。
遍歷行:
fo = open("a.txt", "r");
for line in fo:
print(line);
寫入方式:
<f>.write(s)
:寫入一個字串或位元組流
<f>.writelines(s)
:將s
中的元素無分隔符拼接後輸出
<f>.seek(offset)
:改變指標位置,offset
含義:0——檔案開頭;1——當前位置;2——檔案結尾。
字串
Python中字串是不可修改的。
如果字串中只有單引號,那麼外面用雙引號;如果只有雙引號,那麼外面用單引號;如果都有,那麼就用三個單引號來表示。
用str()
將數字、列表等型別轉化為字串,用len()
求字串長度。
hex(x)
將數字轉化為十六進位制的字串('0x'開頭),oct
轉化為八進位制。
chr(u)
將Unicode碼轉化為對應字元;ord(x)
將字元轉化為Unicode編碼。
用eval()
將表示式的字串轉化為計算結果。
s.input('Enter Something: ')
輸入的是整行。
字串用加號連線;字串乘以一個數即將其重複並接在一起。
可以用\n
來指定多行字元,如:
'This is the first line\nThis is the second line'
另外,在一個字串中,一個放置在末尾的反斜槓表示字串將在下一行繼續,但不會新增新的一行。
\b
表示回退,\n
表示換行(游標移動到下一行行首),\r
表示回車(游標移動到本行行首)。
字串常用函式:
str.lower()
將字母全部變成小寫;str.upper()
將字母全部變成大寫。
str.split(str1)
:將str1
看作分隔符,將str
分成幾個字串,返回列表。
str.count(str1)
:返回str1
在str
中的出現次數。
str.replace(old, new)
:返回將str
中的old
替換成new
的結果。
str.center(width[,fillchar])
:將str
用fillchar
擴充至width
並使str
居中。
str.strip(chars)
:在str
的首尾去掉chars
中列出的字元。
str.startswith(str1)
:返回str
是否以str1
開頭。
str1 in str
:返回str
是否包含str1
。
str.find(str1)
:返回str1
在str
中的位置,如果沒有返回-1。
str1.join(str)
:將分隔符str1
插入str
的每一個空隙。
我們可以在引號之前加一個r
或者R
來指定一個原始字串(引號裡的就是字串的內容,無需轉義),如:
r"Newlines are indicated by \n"
format格式化:
可以用編號或者命名來指定格式化的位置,例:age = 20 name = 'Swaroop' print('{0} was {1} years old when he wrote this book'.format(name, age))
或者:
print('{name} wrote {book}'.format(name='Swaroop', book='A Byte of Python'))
關於對格式化的內容進行填充,保留小數等操作:
輸出1/3保留四位小數,用_
填充至11位使小數居中,且用,
作為千位分隔符:print("{0:_^14,.4f}".format(100000. / 3))
輸出:
_33,333.3333__
(
^
表示居中,<
表示居左,>
表示居右)
(加上逗號表示千位分割,沒有需要可直接去掉)
(可以看作跟C的區別就是前面可以選擇用什麼來填充和填充的格式)
(.
之後的數字既可以表示保留小數也可以表示字串最大輸出長度)
關於型別:
(f表示浮點數,d表示整數,c表示字元)
b表示二進位制,o表示八進位制,x表示小寫的十六進位制,X表示大寫的十六進位制;
e表示使用e的科學計數法,E表示使用E的科學計數法,%表示以百分數的形式表示浮點數。
random庫
import random
seed(a = None)
:使用a
作為隨機數種子,預設為當前系統時間
random()
:得到一個\([0.0,1.0)\)之間的隨機小數
randint(a, b)
:生成\([a,b]\)之間的隨機整數
randrange(a, b, c)
:範圍為\([a, b)\),步長為\(c\)
getrandbits(k)
:隨機一個k位元長的隨機整數
uniform(a, b)
:生成\([a, b]\)之間的隨機小數
choice(seq)
:在列表中隨機選取
shuffle(seq)
:將列表隨機打亂
time庫
首先
import time
函式:
time()
:獲取當前時間戳(從1970年1月1日0:00開始過了多少秒)(浮點數)
ctime()
:返回當前時間的易讀方式的字串,如'Fri Jan 26 12:11:16 2018'
gmtime()
:返回一個特殊的時間格式:time.gmtime() = time.struct_time(tm_year = 2018, tm_mon = 1, tm_mday = 26, tm_hour = 4, tm_min = 11, tm_sec = 16, tm_wday = 4, tm_yday = 26, tm_isdst = 0)
strftime(tpl, ts)
:用於格式化輸出結果,其中tpl為模板,ts為struct_time
型別,用法示例:
t = time.gmtime()
time.strftime("%Y-%m-%d %H:%M:%S", t)
得到字串:'2018-01-26 12:55:20'
time.strptime(str, tpl)
是time.strftime(tpl, ts)
的反操作,即反格式化形成內部時間,示例:
str = '2018-01-26 12:55:20'
time.strptime(str, "%Y-%m-%d %H:%M:%S")
perf_counter()
返回的是一個非常精準的時間計數值,但是計時起點不確定,只有差值才有意義。
sleep(x)
:休眠x秒。
附格式化對應表:
格式化字串 | 說明 | 示例 |
---|---|---|
%Y | 年份 | 1999 |
%m | 月份 | 01 |
%B | 月份名稱 | April |
%b | 月份縮寫 | Apr |
%d | 日期 | 01 |
%A | 星期 | Monday |
%a | 星期縮寫 | Mon |
%H | 24小時制小時 | 17 |
%I | 12小時制小時 | 5 |
%p | 上/下午 | AM |
%M | 分鐘 | 00 |
%S | 秒 | 00 |
turtle庫
我們可以用turtle
庫進行簡單繪圖。
import turtle
初始化視窗(不是必須的):
turtle.setup(width, height, startx, starty)
(分別表示視窗的寬度,高度,以及左上角的座標(前一個是橫座標,後一個是縱座標))
絕對座標指以中心為原點的平面直角座標。
我們可以通過turtle.goto(x, y)
來使畫筆從原來的位置走到指定座標並留下軌跡。
相對位置指以畫筆當前正對方向為前方的相對位置。
我們用turtle.circle(r, angle)
繪製一個圓心在當前方向的左邊的、半徑為r
的、角度為angle
的圓弧(angle
可省略,預設為一週)(如果需要向右側畫圓,將半徑改為負數即可);用turtle.bk(d)
表示後退d
;用turtle.fd(d)
表示前進d
。
goto
、fd
、bk
都不會改變畫筆的正對方向,circle
可以。
另外,我們可以用turtle.seth(angle)
或turtle.setheading(angle)
直接指定當前正對方向的絕對角度;也可以用turtle.left(angle)
和turtle.right(angle)
來改變一個相對角度。
turtle.speed(v)
用於調節畫筆的移動速度,範圍為0到10的整數。
turtle.penup()
表示抬起畫筆,之後的軌跡不在顯現。
turtle.pendown()
則表示畫筆落下,之後的軌跡將會顯現。
turtle.pensize(w)
或turtle.width(w)
可調整畫筆寬度。
turtle.pencolor(color)
可修改畫筆顏色,其中·color
有三種形式:
- 顏色字串,比如turtle.pencolor("purple")
- RGB值(小數),如turtle.pencolor(0.1, 0.2, 0.3)
- RGB值(元組),如turtle.pencolor((0.1, 0.2, 0.3))
turtle
預設用RGB的小數形式來表示顏色,但是可以調整表示方式:
turtle.colormode(1.0)
turtle.colormode(255)
turtle.dot(d)
用於繪製直徑為d
的實心圓。
turtle.home()
用於返回原點且將方向設為向右。
如果不希望繪圖之後自動退出,則寫一句turtle.done()
即可。
turtle.write('漢字', font = ("Arial", 18, normal))
可繪製漢字。
PyInstaller
PyInstaller用於將.py檔案轉化為可執行檔案。
安裝:在cmd命令列中輸入pip install pyinstaller
使用:在cmd命令列中輸入pyinstaller -F <檔名.py>
,會生成__pycache
,build
,dist
三個資料夾,生成檔案為dist
中的可執行檔案,前兩個資料夾可以將其刪除。
其它引數:
-h
:幫助
--clean
:清理臨時檔案
-i <圖示檔名.ico>
:指定使用圖示檔案
其它第三方庫
第三方庫的安裝方法
安裝:pip install <庫名>
下載但不安裝:pip download <庫名>
解除安裝:pip uninstall <庫名>
更新:pip install -U <庫名>
檢視詳細資訊:pip show <庫名>
搜尋:pip search <關鍵詞>
已安裝列表:pip list
檔案安裝:如在https://www.lfd.uci.edu/~gohlke/pythonlibs/#wordcloud上下載編譯後的檔案,然後pip install <檔名>
即可。
jieba庫
jieba庫是中文分詞第三方庫(利用詞庫將文字進行分詞以得到一個個詞語)。
安裝:在cmd命令列中輸入pip install jieba
使用:
jieba.lcut(s)
:精確模式,返回分詞結果(列表)jieba.lcut(s,cut_all=True)
:全模式,返回所有可能的詞語,存在冗餘jieba.lcut_for_search(s)
:搜尋引擎模式,在精確模的結果上進一步分詞,存在冗餘
wordcloud庫
用於生成詞雲,需要安裝Microsoft Visual C++ 14.0(也可以在https://www.lfd.uci.edu/~gohlke/pythonlibs/#wordcloudshang 下載編譯後的版本)。
w = wordcloud.WordCloud()
w.generate(txt) #載入文字txt
w.to_file(filename) #輸出影象檔案
設定大小:
w = wordcloud.WordCloud(width=600)
w = wordcloud.WordCloud(height=400)
w = wordcloud.WordCloud(min_font_size=10)
w = wordcloud.WordCloud(max_font_size=20)
w = wordcloud.WordCloud(font_step=2) #步進間隔
w = wordcloud.WordCloud(font_path="msyh.ttc") #字型
w = wordcloud.WordCloud(max_words=200) #最大單詞數
w = wordcloud.WordCloud(stop_words={"ban_word"}) #禁詞
w = wordcloud.WordCloud(background_color="white") #背景顏色(預設黑色)
其他庫
Numpy:資料分析
Pandas:資料分析高層次應用庫
SciPy:數學、科學和工程計算庫
Matplotlib:二維資料視覺化功能庫
Seaborn:統計類資料視覺化功能庫
Mayavi:三維科學資料視覺化功能庫
PyPDF2:用於處理PDF檔案的工具集
NLTK:自然語言文字處理
Python-docx:建立或更新.doc或.docx檔案
Scikit-learn:機器學習方法工具庫
TensorFlow:機器學習框架
MXNet:基於神經網路的深度學習計算框架
Requests:最友好的網路爬蟲功能庫
Scrapy:優秀的網路爬蟲構架
pyspider:Web頁面爬取系統
Beautiful Soup(beautifulsoup4或bs4):HTML和XML的解析庫,需預先了解HTML和XML的設計原理,與網路爬蟲庫配合使用
Re:正則表示式解析和處理功能庫(Re是標準庫,無需安裝)
Python-Goose:提取文章型別的Web頁面的功能庫
Django:略微複雜的Web應用框架
Pyramid:規模適中的Web應用框架
Flask:Web應用開發微框架
WeRoBot:解析、反饋微信訊息
aip:百度AI開放平臺介面
MyQR:生成二維碼
PyQt5:Qt開發框架的Python介面
wxPython:跨平臺GUI開發框架
PyGObject:使用GTK+(一種跨平臺的使用者圖形介面GUI框架)開發GUI的功能庫
PyGame:基於SDL的簡單遊戲開發功能庫
Panda3D:開源、跨平臺的3D渲染和遊戲開發庫(有C++和Python兩種介面)
cocos2d:構建2D遊戲和圖形介面互動式應用的框架
Quads:迭代藝術圖形
ascii_art:ASCII藝術庫