1. 程式人生 > >Python3.5 基礎知識點

Python3.5 基礎知識點

。。。.。。。。。。。。。。。。。。。。。。。。。。。。

Notebook

2018/09/09


  • Python互動模式的程式碼是輸入一行,執行一行,而命令列模式下直接執行.py檔案是一次性執行該檔案內的所有程式碼。可見,Python互動模式主要是為了除錯Python程式碼用的,也便於初學者學習,它不是正式執行Python程式碼的環境!
    命令列裡面直接輸入python進入互動模式。

  • 用Python開發程式,完全可以一邊在文字編輯器裡寫程式碼,一邊開一個互動式命令視窗,在寫程式碼的過程中,把部分程式碼粘到命令列去驗證。那麼文字編輯器,Windows推薦Notepad++

    ,linux就直接vim。其實最好都用pycharm吧

  • Python使用縮排來組織程式碼塊,請務必使用4個空格的縮排。

  • 整數和浮點數在計算機內部儲存的方式是不同的,整數運算永遠是精確的(除法也是精確的!),而浮點數運算則可能會有四捨五入的誤差。

  • Python允許用r’‘表示’'內部的字串預設不轉義,:

>print(r’\\t\’)
\\t\


  • 在Python中,可以直接用True、False表示布林值(請注意大小寫),並且可以進行運算and or not。複數的話,用j而不是i
  • python能直接處理的資料型別:整數、浮點數、布林值、字串、空值(None)、變數、常量。
  • 在計算機記憶體中,統一使用Unicode編碼,當需要儲存到硬碟或者需要傳輸的時候,就轉換為UTF-8編碼(稱為可變長度的uincode)。
    用記事本編輯的時候,從檔案讀取的UTF-8字元被轉換為Unicode字元到記憶體裡,編輯完成後,儲存的時候再把Unicode轉換為UTF-8儲存到檔案
  • 對於單個字元的編碼,Python提供了ord()函式獲取字元的整數表示,chr()函式把編碼轉換為對應的字元:這裡寫圖片描述
  • 1箇中文字元經過UTF-8(常用)編碼後通常會佔用3個位元組,而1個英文字元只佔用1個位元組(這就不同於unicode了,他都是兩個位元組,16bits):這裡寫圖片描述

  • 字串
    • 單雙引號都可以定義字串,並且三引號可以定義多行的字串。
    • 字串操作:
      • ‘a’+‘b’ =>ab
      • ‘a’*2 =>aa
    • 格式化輸出:
      %運算子就是用來格式化字串的。在字串內部,%s表示用字串替換,%d表示用整數替換,有幾個%(佔位符),後面就跟幾個變數或者值,順序要對應好。如果只有一個%,括號可以省略。
      這裡寫圖片描述
      • 字串裡面的%是一個普通字元怎麼辦?這個時候就需要轉義,用%%來表示一個%這裡寫圖片描述
    • 字串方法
      • str.find(str1)/str.find(str1,num1,num2):從num1到num2檢索str1,返回str1中第一個位置索引值。找不到返回-1。
      • str.join(str1):以str連線str1裡面各元素。
      • str.lower()/str.upper()/str.swapcase():str裡面大寫轉小寫/小寫轉大寫/相互轉。
      • str.replace(old,new[,num]):把str裡面的old替換成new,替換次數num次(可選)。不指定num,全部替換。
      • str.split([st=‘A’,num=num1]):以A為分割符,預設空格,分割num1次。
      • xian’zai

  • python裡面特有的運算子:
    • in,not in(成員運算子,判斷在不在,指定的序列找到值),返回bool型別
    • is,is not(身份運算子,判斷兩個識別符號是不是引用自一個物件),返回bool型別
    • 位運算子& | ^ ~ << >>除了處理bool變數,也可處理數字,是把數字當作二進位制計算。

  • list(陣列)與tuple(tuple一旦初始化就不能修改),,隔開,沒有型別安全檢查
    這裡寫圖片描述
    這裡寫圖片描述

    • list也可以構成二維等多維陣列。
      在這裡插入圖片描述
    • type(),len()函式可以讀取list的型別、長度。
    • 元組就是隻讀的list,圓括號。或者多項只用,隔開,不用加()。元組tuple就可以作為字典裡面key,list就不行。
    • 所謂元組不能修改指的是其內容不能修改,但不包括元組裡面某項指的內容。元組可以連線組合。
    • 元組和陣列的轉換:
      tuple1=tuple(list1)
      list1=list(tuple1)
      在這裡插入圖片描述
  • list裡面:物件.方法(引數)

    • list.append(obj):在末尾新增新物件;
    • list.count(obj): 統計obj在list裡面出現的次數;
    • list.extend(seq):用新list(seq)擴充套件原來list。這個操作其實和分片a[len(a):]=seq相同;
    • list.index(obj):找出obj第一個匹配的索引位置;
    • list.insert(index,obj):將obj插入index位置(原來index位置的值後移)。分片a[index:index]=seq也行;
    • list.pop(index):移除index位置的數,預設是最後一個;
    • list.remove(obj):移除第一個匹配的值;
    • list.reverse():反向list元素,不需要傳參;
    • list.sort():排序。預設按照升序。有兩個可選引數keyreverse=Ture(表示逆序),exp:list.sort(key=len,reverse=True)
    • list.clear()作用類似於del a[:]
    • b=list.copy()與b=list[:]相同(這兩個都是淺copy,區別與copy module裡面的deepcopy)。注意:這個和b=list(直接賦值)的區別

  • dict與set(set和dict的唯一區別僅在於沒有儲存對應的value)
    這裡寫圖片描述
    dict內部存放的順序和key放入的順序是沒有關係的
    • dir是鍵值對結構型別,花括號,key唯一,value可以不唯一,key值也可以是數字、元組etc.但是列表就不行(可變),因為不可做hash演算法。

    • 字典函式:

      • del dict[key1]
      • len(dict):key的個數
    • 字典方法

      • dict.clear() :清空,區別於del dict和dict = {}(這個是重新賦值,產生一個新的物件)
      • dict.keys()
      • dict.values()
      • dict.item()
      • dict.fromkeys(list1[,value1]):以list1裡面與元素作為鍵,以value1為他們所有鍵的值。預設None。
      • dict.get(‘key1[,default=A]’):返回key1對應的值,若不存在返回A,預設None。
      • dict.update(‘dict2’):把dict2裡面的鍵值對更新放進dict裡面。
    • set


  • 變數
    • 一般來說,變數名稱字母數字下劃線,但是呢python3支援漢字做變數名。
    • 變數分類:
      • 不可變變數
        int/float/complex
        tuple
        str(值變的時候會指向一個新的地址)
      • 可變變數
        list[]
        dict{}
    • 字串:
      數字字母下劃線組成
      +字串連線運算子,*重複操作

  • python函式裡面的引數

    • 位置引數(必須引數)
      def func(name,age):
      func(‘a’,11)
    • 關鍵字引數
      def func(name,age):
      func(age = 11,name = ‘a’)關鍵字必須一致,但是順序可以調換
      可變引數允許你傳入0個或任意個引數,這些可變引數在函式呼叫時自動組裝為一個tuple。而關鍵字引數允許你傳入0個或任意個含引數名的引數,這些關鍵字引數在函式內部自動組裝為一個dict。
      關鍵字引數和位置引數混用的話,必須先傳位置引數,比如就不能有func(name=‘a’,11),
    • 預設引數。有輸入就按輸入順序來,沒有就按預設。當不按順序提供部分預設引數時,需要把引數名寫上。比如呼叫enroll(‘Adam’, ‘M’, city=‘Tianjin’),意思是,city引數用傳進去的值,其他預設引數繼續使用預設值。預設引數必須指向不變物件!
      def func(name,age=11):
      func(‘a’,13)/func(‘a’ )
      預設引數後面不能加位置引數,比如說就沒有def func(name='a',age)
    • 可變引數:
      def func(*args,**kwargs)要是在函式裡檢視args、kwargs型別,是個tuple、dict 可以理解為args位置引數,kwargs關鍵字引數。其實,*表示位置可變引數,**表示關鍵字可變引數
      func(1,2,3,4)
      傳入的引數個數是可變的。但是在函式內部,引數接收到的是一個tuple。呼叫的時候,Python允許在list或tuple前面加一個*號,把list或tuple的元素變成可變位置引數傳進去:【同理我們也允許字典前面加**轉變為關鍵字可變引數】

    list1 = [1,2,3,4]
    #以下和c = func(1,2,1,2,3,4)相同
    c = func(1,2,*list1)

    • 命名關鍵字引數:限制關鍵字引數的名字
  • 以上組合 對於任意函式,都可以通過類似func(*args, **kw)的形式呼叫它,無論它的引數是如何定義的


  • 寫列表生成式時,把要生成的元放到前面,後面跟for迴圈,就可以把list創建出來。for迴圈後面還可以加上if判斷:這裡寫圖片描述

  • 生成器
    • 建立一個generator。第一種方法只要把一個列表生成式的[]改成()。二是如果一個函式定義中包含yield關鍵字,那麼這個函式就不再是一個普通函式,而是一個generator
    • generator儲存的是演算法,每次呼叫next(g),就計算出g的下一個元素的值,直到計算到最後一個元素。最難理解的就是generator和函式的執行流程不一樣。函式是順序執行,遇到return語句或者最後一行函式語句就返回。而變成generator的函式,在每次呼叫next()的時候執行,遇到yield語句返回,再次執行時從上次返回的yield語句處繼續執行。
  • 直接作用於for迴圈的資料型別有以下幾種:
    一類是集合資料型別,如list、tuple、dict、set、str等;
    一類是generator,包括生成器和帶yield的generator function。
  • set可以把字串變成集合
    這裡寫圖片描述
  • print()自帶換行,否則需要在輸入內容之後加上,end=' '
  • 檔案操作最好使用控制代碼,開啟之後記得關閉!readline()可以按行讀取,要用迴圈!
  • 異常處理:
    try:…
    except Exception as error
    print(er)…
  • 檔案操作裡面,open("...(1)","...(2)")(2)裡面r可讀,w覆蓋寫入,a追加寫入,b二進位制模式,+讀寫模式

pass表示空的語句。什麼都不做,僅佔位。
assert 判斷語句a,“bbb”:如果!a,則輸出bbb。


  • 語句塊(:標誌開始,縮排控制)
    • 條件語句
      • if ():
        pass
        elif ():
        pass
        else ():
        pass
      • 認為是False情況:
        None
        False
        0 0.0 0+0j
        空字串
        空陣列
        空字典
        空元組
        其他即為True([]!等為False)。
  • 迴圈
    • while迴圈

      • while ():
        pass 表示佔位,沒有實際意義
        continue不執行接下來的語句,再跳到判斷上
        break直接退出
    • for迴圈

      • for x in langs:
        (langs可以為list tuple dict str等任意支援迭代器的物件)
        (這個x呢,是一般變數,系統自動定義,如果說langs是個dict,x指代key)
      • break、continue也可以使用

  • range函式:
    • range() 產生的是一個迭代器
    • list(range(5))變成list
    • 迭代器特點:懶載入,用一次產生一個數,需要的時候才產生。節省空間,消耗時間。
    • ()一個引數x:0 1 2…x-1
      ()兩個引數x,y:x x+1 …y-1(分別start stop)
      ()三個引數x,y,z:分別 start stop step
    • 與numpy.arrang區別:
      • range()返回的是range object;而np.arange()返回的是numpy.ndarray()。
      • range只可用於迭代,而numpy.arange作用遠不止於此,它是一個序列,可被當做向量使用。
      • 兩者都有三個引數,以第一個引數為起點,第三個引數為步長。[first,end,step)。range()不支援步長為小數,np.arange()支援步長為小數。

  • 函式:
    • 定義:
      def funcname(argument/arg) :
      pass
    • 函式返回值:這個也可以不要有
      return
      不帶引數、不寫return、return None都是返回None
    • 引數傳遞:值傳遞、引用傳遞
      • 值傳遞:
        要是引數是int、、float、bool、complex、str、tuple在函式裡面改變這個值,並不會影響函式外的值。
      • 引用傳遞:
        如果引數是list、dict、object,在函式裡面修改則影響外面的值。
    • 函式巢狀函式、閉包closure(函式裡面包含函式)
    • 函式可以作為引數傳遞,在return之後
    • 函式作為引數傳遞:

    def add(a,b) : return a +b
    def test(a,b,func)
      v = func(a,b)
      return v

    c = test(10,20,add)
    #輸出30
    print ( c )

    • 函式作用域:
      區域性作用域local
      閉包函式外的作用域enclosing
      全域性作用域global
      內建作用域built-in(系統自帶,一般前後有_)
      查詢以LEGB的順序去查詢
      • 定義在if、for、while裡面變數也是全域性變數
        在函式def裡定義的變數是區域性變數
        函式內部可以訪問全域性變數a,但是隻能使用不能修改。要想函式裡面修改,在使用前用global a
        in all:要想修改自己返回之外的變數,if全域性,用global a
           不是全域性,用nonlocal a 申明
      • 只有模組(module)、類(class)、函式(def、lambda)才會引入新的作用域

  • python完全是面向物件的程式語言
    • 面向物件三大特徵:封裝、繼承、多型
    • 在這裡插入圖片描述