python基礎進階
python開發基礎進階
1.程式的組成
從兩個方面分類:
程式 = 資料 +(彙編)指令
程式 = 資料結構 + 演算法
演算法:編寫程式的邏輯,解決問題的流程
[tess.cpp]
a=hello #資料:a hello 這裡為非數值型資料
#資料結構:字串
if(a is hello): # 一個演算法由n個指令組成(計算機底層硬體的操作:if is print )
print ‘ok’
[test.o]
01010101 01010101 01010101
01010101 01010101 01010101
01010101 01010101 01010101
2.語言
發展史
機器語言(01010101),打字機打動,紙條一個洞打不打代表是否是1(最原始的字典),hello world(96個位置,1就打洞)
彙編(move 1,暫存器(硬體),add 暫存器1 暫存器2) a = 1 ,b=1+2
C(第一門高階語言(符合人類邏輯,且不需要懂很多硬體知識))
c++ java python(1.更符合人類邏輯和事物特徵:面向物件出現2.需要動更少的硬體知識。)
區別:
靜態/編譯型:
先編譯(直接翻譯完成一個機器碼檔案,但是沒有真正的執行),再執行(交給CPU去執行):活幹完了一半
bianyi tess.cpp -> 多了個test.o
zhixing test.cpp
先轉為機器碼(c++)或者中間程式碼(Java jvm-java位元組碼)
動態/解釋性:
邊執行,邊翻譯,邊執行(兩部為一步:缺點是效率低)
.py .pyc(如果先編譯成.pyc .pyo)執行也可以更快,*但是它的底層是解釋因此很慢
要研究資料結構+演算法,最好選擇靜態/編編譯型語言,因為動態/解釋性語言坑很多(本身問題很多)
3.變數與記憶體
變數作用:標記並存儲資料, 增強可讀性。能被後面的程式碼呼叫,資料複用。
python :按引用傳遞(和別的語言的概念不同):底層是C(指標即地址(記憶體條的位置))
a=1
b=2
b=a
c=1
d=1
一夫(資料)多妻(變數),一個變數只能對一條資料,但是一條資料卻可以被很多變數所對應。
id()檢視地址
is,is not 比較資料的值、地址
== 比較資料的值
字面量(不同語言的字面量的型別不同):在Python中,對字面常量(數字、字串、布林、位元組)物件進行快取,
多個變數賦相同值,其實是同一個值
4.True 和 False
bool() 判斷真假
False: 0和False
其餘為真
if True (如果真,則執行)
if(bool(False) is False):
print 6
while True(如果真,則迴圈)
5.流程控制
if 帶條件的->過濾
while 帶條件的->迴圈
for 有限次數的->迴圈
6.資料結構
資料結構:資料的儲存形式(計算機儲存,組織資料的方式)
基本資料型別:
數字、字串:連續儲存
列表
是否可變:數字、字串的資料不可變(記憶體空間是否可伸縮list dict)
如果重新賦值,會申請另一塊記憶體(如果不是字面量)
檢視python原始碼:
其它資料型別:
檔案
資料庫
[]研究資料結構?不同的資料,需要不同的資料結構去儲存,造成的增刪改查的效能不一樣
*遍歷
7.每種型別的方法:
增刪改查(及展開)
4.基本資料型別 (1)(bool型別 數字int 字串str(常用) 列表[](常用) 元祖() 字典(常用) 集合(沒用)) (2)巢狀賦值:列表、元祖、字典 (3)支援遍歷、索引、切片:字串、列表、元祖:for、var[3]、var[2:]、in和not in (4)字典:key,value。key型別:int,str。for k,v in d.items(Dict) (5)遍歷:for k,v in enumerate(List|tuple): (6)劃分: 1.是否是序列(索引是整數),支援索引、切片(字串、列表、元祖 2.是否可變:按所佔記憶體大小、記憶體地址是否可變區分。(不可變:數字、字串) (7)操作序列: len() 求序列的長度 + 連線兩個序列 (常用與字串拼接) in 判斷是否存在序列 (8)字串格式化:% %s %d, format(推薦,就可以換序) pythonic (9)型別轉換 數字、字串、列表、元祖 檢視資料型別:type(var) str(int) # 數字轉字串 int(str) # 字串轉數字 list(str)# 字串轉列表 ”.join(list) # 列表轉字串 tuple(list) # 列表轉元組 list(tuple) # 元組轉列表 5.基本資料型別常用方法 格式type.methond() (1)字串 format # 格式化 replace # 替換 join # 拼接 strip # 去除字串兩邊空格 str.split(‘char’) # 分割字串 startswith # 以…開頭 endswith find # 查詢 encode # 編碼 (2)列表|元組 count # 數量 copy # 複製 等效於== append # 追加 extend # + 拼接 insert # 插入 pop remove # 刪除 list[index] = value # 改 reverse sort clear (3)字典 items get(‘key’) # 等效於dict[‘key’] keys values setdefault # == 賦值 update(d1) # 增加 pop popitem # 刪除 clear copy 佇列 :是一種資料結構(儲存方式) List|tuple : 元素連續分佈 編碼 6.檔案操作 資料庫:分類,比excel強大的地方就是:分表 r w a w:覆蓋寫 a:追加寫 r+:預設游標在開始位置,寫的話時追加寫 w+:覆蓋寫,想讀取內容,seek調整 a+:游標預設在檔案最後位置,不管游標位置,一定是追加寫,seek調整位置讀取 seek的應用:比如斷點續傳, ------------rb wb ab f=open("test","r",encoding="utf8")#解碼 f=open("test","rb")#直接拿位元組資料,所以不用解碼 print(f.read()) f=open("test6","wb") f.write("hello 倩雯".encode("utf8"))#wb需要位元組資料轉換utf8,w直接家的字串 f.close() f=open("test6","ab") with 推薦 f=open("rest6") f.read() f.close() with open("test6") as f: #f=open("test6") f.read()View Code
檔案操作流程: 1:開啟這個檔案 open() 2:操作檔案 read,write 3:關閉檔案 close() 開啟檔案 #開啟,以utf8編碼開啟#僅可讀: f=open("test",mode="r",encoding="utf8") #可寫,不可讀,覆蓋,加絕對路徑 f=open(file = 'E:\網盤下載視屏\筆記\python筆記\檔案基本操作',mode="w",encoding="utf8") #追加模式 f=open("test3",mode="a",encoding="utf8") #二進位制讀取模式,硬碟怎麼存就怎麼讀。讀取出來後是二進位制模式 f=open("test",mode="rb") 讀操作 f=open("test2") data=f .read()#讀取 data = f.read(5)#讀指定個數的字元 data2 = f.read(5)#從游標位置 讀指定個數的字元 data = f.readline() data2 = f.readline() data= f.readlines()#拿到的是一個列表結果,帶著換行 print(data) print("data2",data2) f.close()#關閉 for line in f : print (line) 假如需要處理的檔案不知道是什麼編碼 使用python第三方軟體 安裝:pip3 install chardet import chardet f = open('log',mode = 'rb') data = f.read() f.close() result = chardet.detect(open('log',mode='rb').read()) print(result) 命令列: import chardet f = open('log',mode = 'rb') data = f.read() chardet.detect(data) data.decode("gb2312") 寫操作 f.write("hello\nworld")#清空覆蓋,如果是不存在的檔案,直接建立 f.write("\n哎呦我去") -----------------------寫,flush操作 追加模式: a f=open("test5",mode="a",encoding="utf8") f.write("/nhellp test5") 讀寫模式: r+ 先讀後寫,游標處於最後一位,可以追加 f=open("test5",mode="r+",encoding="utf8") 寫讀模式: w+ 先寫再讀,從第一行開始寫,覆蓋寫 f.flush() #重新整理存入 import time #做延遲 time.sleep(100) f=open("test",mode="w+",encoding="uest",mode="r+",encoding="utf8") print(f.read(3)) f.write("hello原浩雄") print(f.read()) f.seek(3,0) #移動游標到開始位置 按照位元組走,不同於read()方法 f.seek(1,0) print(f.read()) print(f.tell()) f.close() a+ 總是再游標位置最後位置新增 f=open("test2","a+",encoding="utf8") f.seek(0) print(f.read())#讀取後游標處於最後 f.seek(0) f.write("xiong") f.write("yuan") 練習(不常用) count =0 for line in f.readlines(): if count == 0: line = "".join([line.strip(),"原浩雄"]) print(line.strip()) count+=1 推薦,保持在執行時記憶體只儲存了一行資訊 count =0 for line in f: #f 可迭代物件,序列#優化記憶體 if count == 0: line = "".join([line.strip(),"原浩雄"]) print(line.strip()) count+=1 進度條 import sys for i in range(100): sys.stdout.write("#") sys.stdout.flush() #強行重新整理顯示 import time time.sleep(0.5)檔案操作
#可讀可寫模式 r+ w+ a+ # # R+ # # f=open("test2",mode="r+",encoding="utf8") # # # # print(f.read()) # # f.write("where is you ") # # #W+ 先覆蓋,再讀取 # # # f=open("test",mode="w+",encoding="utf8") # f=open("test",mode="r+",encoding="utf8") # print(f.read(3)) # # f.write("hello原浩雄") # print(f.read()) # #f.seek(3,0) #移動游標到開始位置 按照位元組走,不同於read()方法 # # # f.seek(1,0) # # # print(f.read()) # # print(f.tell()) # # f.close() #a+ 總是再游標位置最後位置新增 # f=open("test2","a+",encoding="utf8") # f.seek(0) # print(f.read())#讀取後游標處於最後 # f.seek(0) # f.write("xiong") # f.write("yuan") #------------------總結 # r w a w:覆蓋寫 a:追加寫 #r+:預設游標在開始位置,寫的話時追加寫 #w+:覆蓋寫,想讀取內容,seek調整 #a+:游標預設在檔案最後位置,不管游標位置,一定是追加寫,seek調整位置讀取 #seek的應用:比如斷點續傳, #------------rb wb ab #f=open("test","r",encoding="utf8")#解碼 # f=open("test","rb")#直接拿位元組資料,所以不用解碼 # print(f.read()) # # f=open("test6","wb") # f.write("hello 倩雯".encode("utf8"))#wb需要位元組資料轉換utf8,w直接家的字串 # f.close() # # f=open("test6","ab") #with #推薦 # f=open("rest6") # f.read() # f.close() # # with open("test6") as f: #f=open("test6") # f.read()檔案操作2
8.檢視python原始碼
1.檢視部分原始碼(不能檢視實現,常用關鍵字的說明文件)
pycharm:輸入關鍵字/import 關鍵字,按住ctrl鍵+滑鼠點選關鍵字
__ 私有方法,不公開(約定不能用,但是可以用)
公有方法
2.檢視全部原始碼
去官網下載原始碼(C語言的原始碼)
要安裝?就要編譯
3.自學/進階直接看(最清楚的)
4.通過語言的原始碼、高階開源專案原始碼去進階