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

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.通過語言的原始碼、高階開源專案原始碼去進階