1. 程式人生 > >python基礎進階知識

python基礎進階知識

1.linux命令的基本使用

1.ls    :顯示當前資料夾裡的內容
2.pwd	:顯示當前檔案的路徑
3.touch	:如果檔案不存在,建立一個檔案
4.mkdir	:如果資料夾不存在,建立一個資料夾
5.rm	:刪除指定檔案 如果要刪除資料夾則需要在rm 後加-r
6.cd	:切換工作路徑
7.cp	:拷貝檔案 cp 需要拷貝的路徑 拷貝後的路徑    如果需要拷貝資料夾 則在cp後加-r
8.mv	:移動指定檔案 mv 移動前的路徑 移動後的路徑
9.tree	:以樹狀圖的形式的顯示資料夾下的內容
10.clear:清空螢幕下的資訊

2.linux命令的進階使用

1.壓縮與解壓:bz2格式 	tar -jcvf 壓縮包包名 壓縮的檔案	tar -jxvf 解壓的壓縮包名 -C 指定目錄
			zip格式	zip 壓縮包包名 壓縮的檔案		uzip -d解壓後的目錄 解壓檔案

2.許可權操作:  許可權物件(u【使用者】 g【組】 o【其他】)	
		    許可權處理(+【增加許可權】 -【減少許可權】 =【設定許可權】) 
		    許可權(r【可讀】 w【可寫】 x【可執行】
		    數字法(r:4 w: 2   x:  1  -:0 )例:700 為u有多有許可權 g o沒有許可權 
		    
3.遠端操作:遠端登陸賬戶   ssh 使用者名稱@IP地址
  		  遠端上傳和下載  上傳:scp 本地檔案 使用者名稱@IP地址:目標地址 
  		  			    下載:scp 使用者名稱@IP地址:源地址  本地地址  上傳和下載資料夾要加-r
  		  			    
4.軟體安裝與刪除:sudo apt install 安裝包名 rm 刪除  sudo apt update 更新源

5.vim(文字編寫):插入(i) 複製游標行(yy) 貼上(p) 到末尾(G) 指定去哪行(+行數G)

3.UDP(使用者資料報協議)與TCP(傳輸控制協議)

1.IP地址的作用:IP 地址是指網際網路協議地址(英語:Internet Protocol Address,又譯為網際協議地址), 是 IP Address 的縮寫. IP 地址是 IP 協議提供的一種統一的地址格式

2.埠:埠是作業系統分配給網路應用程式的編號, 當接收到資料之後, 作業系統會根據編號來將資料轉發到對應編號的應用程式.

3.UDP:它是無連線的、不可靠的網路傳輸協議。

4.UDP的特點:因為 UDP 傳送資料之前不需要建立連線,並且每個資料包最大是64K,所以具有無連線 ,資源開銷小,傳輸速度快 等特點

4.TCP:它是一種面向連線的、可靠的、基於位元組流的傳輸層通訊協議

5.TCP特點:TCP通訊需要經過建立連線、資料傳送、終止連線三個步驟。是一種非常可靠的傳輸協議,因為TCP在建立連線時需要通過三次握手過程來完成,在斷開連線時四次揮手,保證了資料傳輸的安全性。

6.TCP與UDP的區別:
1). TCP 面向連線; UDP 是不面向連線;
2). TCP 提供可靠的資料傳輸,也就是說,通過 TCP 連線傳送的資料,無差錯,不丟失,不重複,且按序到達; UDP 不保證可靠的資料傳輸,容易出現丟包情況;
3). TCP 需要連線傳輸速度慢,UDP 不需要連線傳輸速度快
4). TCP 不支援發廣播; UDP 支援發廣播
5). TCP 對系統資源要求較多,UDP 對系統資源要求較少。
6). TCP 適合傳送大量資料,UDP 適合傳送少量資料
7). TCP 有流量控制,UDP 沒有流量控制

4.多工

1.執行緒

1.執行緒的概念:執行緒是執行程式中的一個執行分支,是CPU排程基本單位,但是沒有充分使用cpu多核的效能

2.執行緒的格式:threading.Thread(targre=引用的函式,args=(位置引數,),kwargs=(關鍵字引數))

3.如何解決線上程共享資料時出現的資源競爭問題?
在多個執行緒同時對同一個全域性變數進行操作時,會有可能出現資源競爭資料錯誤的問題,可以通過在程式中加入互斥鎖來解決共享變數的資源競爭問題。互斥鎖為資源引入一個狀態:鎖定/非鎖定搶到鎖的執行緒先執行,沒有搶到鎖的執行緒需要等待,等鎖用完後需要釋放,然後其它等待的執行緒再去搶這個鎖,哪個執行緒搶到那個執行緒再執行。具體哪個執行緒搶到這個鎖我們決定不了,是由cpu排程決定的
格式:建立鎖 lock = threading.lock  上鎖 lock.acquire()  釋放鎖 lock.release()

2.程序

1.程序的概念:程序是系統進行資源分配基本單位,每啟動一個程序作業系統都需要為其分配執行資源。

2.程序的格式:multiprocessing.Process(targre=引用的函式,args=(位置引數,),kwargs=(關鍵字引數) )

3.簡述你對程序的理解?
程序是應用程式在作業系統中的一種例項表現,一個應用程式至少會對應一個程序。
程序是系統進行資源分配基本單位,每啟動一個程序作業系統都需要為其分配執行資源。
在建立子程序時,子程序會複製當前父程序的執行環境。
執行緒是依附在程序裡面的,沒有程序就沒有執行緒,一個程序預設提供一條執行緒,程序可以建立多個執行緒

4.Queue:
程序之間不共享全域性變數,所以需要通過Queue實現變數之間的共享。建立 queue=multiprocessing.Queue(n)可以放入n個數據  放入 queue.put(放入的資料)   取出queue.get()按照放入的順序依次取出一個數據
Queue.qsize():返回當前佇列包含的訊息數量;
Queue.empty():如果佇列為空,返回True,反之False , 注意這個操作是不可靠的。
Queue.full():如果佇列滿了,返回True,反之False;
Queue.get([block[, timeout]]):獲取佇列中的一條訊息,然後將其從列隊中移除,block預設值為True;

5.程序池
程序池同步執行任務 程序池同步執行任務表示程序池中的程序在執行任務的時候一個執行完成另外一個才能執行,如果沒有執行完會等待上一個程序執行  建立 pool = multiprocessing.pool(指定數量) pool.apply(函式)

程序池非同步執行任務 程序池非同步執行任務表示程序池中的程序同時執行任務,程序之間不會等待 
p1 = pool.apply_async(函式) p1.close()告訴主程序沒有任務加入程序池 p1.jion()讓主程序等待

3.協程

1.協程的概念:
協程,又稱微執行緒,纖程,也稱為使用者級執行緒,在不開闢執行緒的基礎上完成多工,也就是在單執行緒的情況下完成多工,多個任務按照一定順序交替執行.
通俗理解只要在def裡面只看到一個yield關鍵字表示就是協程
python 可以使用 greenlet 和gevent 模組來實現協程

2.協程的公式:g1 = gevent.spwon(函式,引數)  g1.join()讓主程式等待 也可以gevent.joinall(等待的列表)

3簡述執行緒,程序和多協程之間的區別。
相同點:程序、執行緒、協程都是可以完成多工程式設計。
不同點:
        1. 程序之間不共享全域性變數
        2. 執行緒之間共享全域性變數,但是要注意資源競爭的問題,解決辦法: 互斥鎖或者執行緒同步
        3. 建立程序的資源開銷要比建立執行緒的資源開銷要大
        4. 程序是作業系統資源分配的基本單位,執行緒是CPU排程的基本單位
        5. 執行緒不能夠獨立執行,必須依存在程序中 
        6. 多程序開發比單程序多執行緒開發穩定性要強
        7. 協程切換任務資源很小,效率高

5.正則

1.什麼是正則表示式?正則表示式的作用是什麼? 
正則表示式是用來記錄文字規則的特殊字串
正則表示式用來在程式開發過程中匹配或者查詢符合某些規則的字串。比如:郵箱、圖片地址、手機號碼等

2.正則的符號:
[]		匹配[]裡面列舉的字元
. 		匹配任意一個字元(除了\n)
\d		匹配任意一個數字0-9
\s		匹配任意一個空白字元(\n  \t)
\w		匹配任意一個非特殊字元0-9 a-z A-Z(特殊字元¥#@%……)範圍太大不常用
* 		匹配前一個字元無限個 0到無限
+		匹配前一個字元無限個 1到無限
?		匹配前一個字元0或1個
{n}		匹配前一個祖父出現n次
{n,m}	 匹配前一個字元出現n到m次
[^]		取反
^ 		從頭匹配
$ 		匹配到結尾
|		匹配 | 左邊或者右邊的字元
()		把()裡面的字元分成一組

3.re模組的高階用法:
re.match()		從頭開始匹配一一對應的匹配 提取用 group
re.search()		搜尋匹配到的資料只匹配第一個資料 提取用 group
re.findall()	匹配所有的資料  得到的是一個列表
re.sub('正則',代替的資料,字串,count=次數) 替換匹配到的資料
re.spilt('正則',字串)  以匹配到的資料為分割線分割字串並返回一個列表

4.在正則表示式中,什麼是貪婪匹配?什麼是非貪婪匹配?如何在兩種匹配方式間進行切換?舉例說明。
貪婪匹配是指在進行規則匹配時,總是嘗試匹配儘可能多的字元,python中預設貪婪匹配非貪婪匹配是指在進行規則匹配時,總是嘗試匹配儘可能少的字元。

非貪婪操作符“?”,可以這個操作符可以用在"*","+","?"的後面,這樣?前面的正則表示式不能匹配?後面正則表示式的資料
示例:
>>> s="This is a number 234-235-22-423
>>> r=re.match(".+(\d+-\d+-\d+-\d+)",s)
>>> r.group(1)
'4-235-22-423'
>>> r=re.match(".+?(\d+-\d+-\d+-\d+)",s)
>>> r.group(1)
'234-235-22-423'

常用正則

使用者名稱正則	
	# 4到16位(字母,數字,下劃線,減號)
	re.match(r'^[a-zA-Z0-9_-]{4,16}$', 使用者名稱)

整數正則
	#正整數正則
	re.match(r'^\d+$',"42")
	#負整數正則
	re.match(r'^-\d+$',"42")
	#整數正則
	re.match(r'^-?\d+$',"-42")

數字正則
	#正數正則
	re.match(r'^\d*\.?\d+$',"42.3")
	#負數正則
	re.match(r'^-\d*\.?\d+$',"-42.2")
	#不分正負正則
	re.match(r'^-?\d*\.?\d+$',"-42.32")

郵箱正則
	re.match(r'^([A-Za-z0-9_\-\.])+\@([A-Za-z0-9_\-\.])+\.([A-Za-z]{2,4})$')		

手機號正則
	re.match(r'^((13[0-9])|(14[5|7])|(15([0-3]|[5-9]))|(18[0,5-9]))\d{8}$')

身份證號正則
	re.match(r'^[1-9]\d{5}(18|19|([23]\d))\d{2}((0[1-9])|(10|11|12))(([0-2][1-		9])|10|20|30|31)\d{3}[0-9Xx]$')
	
車牌正則
	re.match(r'^[京津滬渝冀豫雲遼黑湘皖魯新蘇浙贛鄂桂甘晉蒙陝吉閩貴粵青藏川寧瓊使領A-Z]{1}[A-Z]{1}[A-Z0-9]{4}[A-Z0-9掛學警港澳]{1}$')

身份證(包含中文)正則
	# 身份證號(18位)正則
	re.match(r'[\u4E00-\u9FA5]+')

HTTP協議

1.簡述TCP長/短連線的優點和缺點:
長連線可以省去較多的TCP建立和關閉的操作,節約時間。但是如果使用者量太大容易造成伺服器負載過高最終導致服務不可用
短連線對於伺服器來說實現起來較為簡單,存在的連線都是有用的連線,不需要額外的控制手段。但是如果使用者訪問量很大, 往往可能在很短時間內需要建立大量的連線,造成伺服器響應速度過慢

2.請簡述請求報文和響應報文的區別:
請求報文分為請求行,請求頭,空行,請求體四部分
請求行由 請求方法,請求資源路徑,請求協議版本組成,以 \r\n 結尾
請求頭中以鍵值對的形式表示請求相關的資訊,每個鍵值對使用\r\n結束
請求空行用來分隔請求頭與請求體
請求體用來儲存請求的附加資訊,在使用GET請求方式時,一般請求體為空,在使用POST請求方式時,將資訊儲存在請求體中。

響應報文分為響應行,響應頭,空行,響應體四部分
響應行由 協議版本,響應狀態碼,響應短語組成,以 \r\n 結尾
應頭中以鍵值對的形式描述了響應相關的資訊,每個鍵值對使用\r\n結束
響應空行用來分隔響應頭和響應體
響應體中用來儲存伺服器對客戶端請求的相應資料。

MYSQL資料庫

1.常見關係型資料庫。
oracle 銀行,電信等專案
ms sql server:在微軟的專案中使用
sqlite:輕量級資料庫,主要應用在移動平臺
mysql:web時代使用最廣泛的關係型資料庫

2.結構化查詢語言SQL中,定義的DML,DQL分別包括哪些操作?
DML: 資料操作語言,包括 insert插入,update 更新,delete刪除操作
DQL: 資料查詢語言,包括 select 查詢操作

3.資料庫中常用欄位型別:
   	整數型別:	 int
   	浮點型別:	 decimal(5,3) 總共5位數,小數點後面有三位 22.222
   	字串型別:	varchar可變長字串 char固定長字串
   	列舉型別: 	 enum()只能填()裡列舉的資料
   	日期型別: 	datatime

1.資料庫常見操作指令

show 
	# 用來檢視資料庫和表的指令
	show databases; 檢視有多少資料庫
	show create database 資料庫名; 檢視你建立資料庫的結構
	show tables; 檢視有多少表  檢視前先使用use xxx; 進入某個庫
	show create table 表名; 查看錶的構造
	
create
	# 用來建立資料庫和表的指令
	create database 資料庫名 charset=utf8; 建立編碼為utf-8的資料庫
	create table 表名(id.....,name...)建立表()裡寫的是欄位的型別及約束

drop
 	# 用來刪除資料庫和表的指令
 	drop database 資料庫名		刪除這個資料庫
 	drop table 表名			 刪除這個表

alter
 	# 用於操作欄位的指令
 	alter table 表名 add 欄位名 型別及約束; 	增加欄位
 	alter table 表名 modify 欄位名 新的型別及約束; 	修改欄位的型別及約束
 	alter table 表名 change 欄位名 新欄位名 型別及約束; 修改欄位名和型別與約束
 
insert 
	# 使用者操作資料的指令
	insert into 表名(欄位) values(資料) 指定欄位新增資料
	insert into 表名 values(資料) 逐行新增資料,資料要與表中的欄位一一對應,主鍵可以使用0來佔位
	insert into 表名1(欄位) (select 欄位 from 表2) 把表2查詢出來的資料插入到表1
	
update
	# 用於操作資料的指令
	update 表名 set 欄位 = 資料 where id = x;更改id為x的欄位資料,如果沒有條件則該欄位的資料將被全部更改
	update (表1 inner join 表2 on 表1欄位=表二欄位) set 表1欄位=表2欄位;批量更新欄位資料
 
delete
	# 用於操作資料的指令
	delete from 表名 where id = x; 刪除id =x的那一行資料

select
	# 用於操作資料的指令
	select * from 表名  查看錶中的所有資料
	select * from 表名 where id = x; 檢視id為x的那一行資料
	select 欄位 from 表名 查看錶中某一個欄位的資訊