1. 程式人生 > 其它 >Python基礎-學習筆記

Python基礎-學習筆記

嵩天老師python課的筆記。

Python中用#進行註釋。 三單引號既是多行字串,又可以作為註釋。

0b0B開頭表示二進位制,0o0O表示八進位制,0x0X表示十六進位制。

浮點數的取值範圍約為\(-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)

計算\(a^b \bmod c\)

max(x1, x2, ..., xn)求最大值,min同理。

int()float()可以強制轉換字串。

complex()可以強制轉換為複數。

print會自動列印一個\n,如果無需換行,可以用end來指定結尾:

**表示乘方,//表示整除。

Python中沒有自加自減操作。

常用邏輯語句:andornotTureFlase

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還支援innot in判斷,用加號連線,用乘號複製。

s.index(x)s.index(x,i,j)返回sij中第一次出現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):如果xS中則刪除

S.remove(x):如果xS中則刪除,如果不在則報錯

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):返回str1str中的出現次數。
str.replace(old, new):返回將str中的old替換成new的結果。
str.center(width[,fillchar]):將strfillchar擴充至width並使str居中。
str.strip(chars):在str的首尾去掉chars中列出的字元。
str.startswith(str1):返回str是否以str1開頭。
str1 in str:返回str是否包含str1
str.find(str1):返回str1str中的位置,如果沒有返回-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

gotofdbk都不會改變畫筆的正對方向,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檔案轉化為可執行檔案。

網站:http://www.pyinstaller.org

安裝:在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藝術庫