Python基礎總結

來源:互聯網
上載者:User

標籤:溢出   ble   問題   ram   ctr   lin   apc   nta   min   

Python基礎使用者輸入

username = input(‘請輸入使用者名稱:‘)

pyc到底是什嗎?

Python和Java和C#一樣,都是基於虛擬機器的語言,當我們用Python hello.py的時候,就是告訴虛擬機器我要開始工作了,虛擬機器在解釋之前,第一項工作是編譯,編譯的結果儲存在記憶體的PyCodeObject中,當Python程式運行結束後,Python解譯器則將PyCodeObject寫回到pyc檔案中,當python程式第二次運行時,首先程式會在硬碟中尋找pyc檔案,如果找到,先對.pyc檔案和.py檔案的最近一次的修改時間進行判斷,如果.pyc檔案的修改時間晚於.py檔案,說明.py檔案中的原始碼未修改過,則直接載入,否則就重複上面的過程,所以我們應該這樣來定位PyCodeObject和pyc檔案,我們說pyc檔案其實是PyCodeObject的一種持久化儲存方式。
###三元運算子
result = ‘yes’ if username == ‘kernel’ else ‘no’

Python資料類型
  • 字串

    不可更改
    str.capitalize() 首字母大寫
    str.casefold() 大寫全部變小寫
    str.upper() 轉換成大寫字母
    str.lower() 轉換成小寫字母
    str.swapcase() 大小寫反轉
    str.title() 每個單詞的首字母大寫
    str.center(index:總長度,str:前後填充的字元) 內容置中
    str.encode() 將字串編碼成buytes格式
    stt.count(‘kernel‘) 統計kernel在字串中出現的次數
    str.endswith(‘kernel‘) 判斷字串是否以kernel結尾
    ‘kernel\t‘.expandtabs(index) 輸出kernel,將\t轉換成多長的空格

  • 列表

    列表是我們最以後最常用的資料類型之一,通過列表可以對資料實現最方便的儲存、修改等操作
    定義列表
    names = [‘tom‘,‘amy‘,‘jack‘]
    切片
    names[1:3] 擷取下標1-3的值,包括1,不包括3
    names[:3] 從頭開始取
    names[::2] 切片的步長
    names[:-1] 擷取最後一個值
    追加
    names.append(‘dawei‘)
    插入
    names.insert(2,‘dawei‘)
    刪除
    names.pop() 刪除最後一個元素
    names.remove(‘amy‘) 刪除指定值的元素
    del names[1] 刪除指定索引上的元素
    修改
    names[1] = ‘lack‘
    擴充
    number = [1,2,3]
    names.extend(number)
    names=[‘tom‘,‘amy‘,‘jack‘, 1, 2, 3]
    拷貝
    names_copy = names.copy()
    只能拷貝嵌套列表的第一層列表,如果想拷貝嵌套列表需要使用copy模組的deepcopy()
    統計
    names.count(‘tom‘)
    排序&翻轉
    names.sort()
    names.reverse()
    擷取下標
    names.index(‘tom‘)

  • 元組

    元組一旦建立,無法更改,也叫唯讀列表
    定義元祖
    names = (‘tom‘,‘jack‘,‘amy‘)
    統計
    names.count(‘tom‘)
    擷取下標
    names.index(‘tom‘)

  • 字典

    字典一種key - value 的資料類型,使用就像我們上學用的字典,通過筆劃、字母來查對應頁的詳細內容,無序且鍵是唯一的
    定義字典
    info = {
    ‘stu1101‘: "tom",
    ‘stu1102‘: "amy",
    ‘stu1103‘: "jack",
    增加
    info[‘stu1104‘] = ‘dawei‘
    刪除
    del info[‘stu1101‘]
    info.pop(‘stu1101‘)
    info.popitem() 隨機刪除
    修改
    info[‘stu1101‘] = ‘lanlan‘
    尋找
    info.get(‘stu1101‘) 如果存在傳回值,如果不存在返回-1
    info["stu1104"] 如果存在傳回值,如果不存在報錯
    其他
    info.values()
    info.keys()
    info.setdefault("stu1104","dawei")
    info.item()

  • 集合

    集合是一個無序的,不重複的資料群組合,去重,關係
    定義集合
    s = set([1,2,3,4])
    t = set(‘hello‘)
    交集
    b = s |t
    s.union(t)
    並集
    b = t & s
    s.intersection(t)
    補集
    b = t - s
    s.difference(t)
    差集
    b = t ^ s
    s.symmetric_difference(t)
    添加
    t.add(‘h‘)
    t.update([1,2,3])
    刪除
    t.remove(‘h‘)
    其他
    x in t 判斷x是否在集合t中
    x not in t 判斷x是否不再集合t中
    s.issubset(t) 判斷s是否是t的子集
    s.issuperset(t) 判斷t是否是s的自己
    s.copy() 淺複製

檔案
  • 開啟檔案、

    f = open(‘filename‘,‘r‘) 需要手動關閉檔案
    with open(‘filename‘,‘r‘) 自動關閉檔案
    r 唯讀
    w 唯寫,先清空資料,寫入
    x 如果檔案存在,報錯,如果不存在,建立並寫入資料
    a 追加
    b 二進位方式開啟
    (+) 可讀可寫

  • 操作檔案

    f.read() 讀取全部資料
    f.seek(0) 調整遊標位置
    f.tell() tell當前指標所在的位置(位元組)
    f.write(‘‘) 寫入資料
    f.flush() 重新整理緩衝區
    f.fileno() 檔案描述符
    f.readable() 判斷是否可讀
    f.readline() 讀取一行
    f.truncate() 清空遊標後面的資料

  • 關閉檔案

    f.close()

    函數
  • 定義

    def xxx():

  • 函數體

    def xxx():
    pass

  • 傳回值

    return 傳回值,如果沒有指定return,則返回None

  • 參數

    普通參數def information(anem,age):passinformation(‘kernel‘,21)指定參數def infoemation(name,age):    pass information(name = ‘kernel’,age = 21) 預設參數 def infoemation(name,age,addr = ‘山東’):     pass information(‘kernel’,21)動態參數 def infoemation(*args,**kargs):   pass
  • 變數範圍

    函數內部聲明的變數叫局部變數,函數體外部聲明的變數叫全域變數
    局部變數的生命週期是函數體結束,全域變數的生命週期是程式結束

  • 全域變數

    全域變數範圍是整個程式,當局部變數與全域變數同名時,局部變數起作用,如果想使用全域變數,需要聲明global 全名變數名

  • 遞迴

    必須有一個明確的結束條件

    每次進入更深一層遞迴時,問題規模相比上次遞迴都應有所減少

    遞迴效率不高,遞迴層次過多會導致棧溢出

    data = [1, 3, 6, 7, 9, 12, 14, 16, 17, 18, 20, 21, 22, 23, 30, 32, 33, 35]def binary_search(dataset,find_num):if len(dataset) >1:mid = int(len(dataset)/2)if dataset[mid] == find_num:  #find itprint("找到數字",dataset[mid])elif dataset[mid] > find_num :# 找的數在mid左面print("\033[31;1m找的數在mid[%s]左面\033[0m" % dataset[mid])return binary_search(dataset[0:mid], find_num)else:# 找的數在mid右面print("\033[32;1m找的數在mid[%s]右面\033[0m" % dataset[mid])return binary_search(dataset[mid+1:],find_num)else:if dataset[0] == find_num:  #find itprint("找到數字啦",dataset[0])else:print("沒的分了,要找的數字[%s]不在列表裡" % find_num)binary_search(data,66)
  • 匿名函數

    f = lambda a,b: a+b
    result = f(2,3)

  • 內建函數

    abs() 絕對值
    all() 參數為一個可迭代的資料類型,如果全為真,返回真
    any() 同上,有一個為真就是真
    bin() 接收十進位,轉換成二進位
    oct() 接收十進位,轉換成八進位
    hex() 接收十進位,轉換成十六進位
    bytes() 接收字串和編碼類別型,轉換成位元組
    str() 接收字串和編碼類別型,轉換成字串
    callable() 檢測函數是否可以被調用
    chr() 將整型轉換成字元
    ord() 將字元轉換成整型
    compile() 將字串編譯成Python代碼
    exec() 執行Python代碼
    eval() 將字串變成運算式並執行
    help() 查看協助
    divmod() 返回一個包含商和餘數的元祖
    isintance() 判斷對象是否是一個類的執行個體
    issubclass() 判斷某個類是否是一個類的子類
    filter() 接收一個函數和一個可迭代的對象,迴圈可迭代對象並執行函數,函數返回true,將元素添加到結果中
    map() 接收一個函數和一個可迭代的對象,迴圈可迭代對象並執行函數,將函數傳回值添加到結果中
    zip() 接收多個列表,將多個列表相同位置的元素組合成一個元組

物件導向

(Object Oriented Programming,OOP,物件導向程式設計)對函數進行分類和封裝,此編程方式需要使用 “類” 和 “對象” 來實現,所以,物件導向編程其實就是對 “類” 和 “對象” 的使用

  • 類 類就是一個模板,模板裡可以包含多個函數,函數裡實現一些功能
  • 對象 對象則是根據模板建立的執行個體,通過執行個體對象可以執行類中的函數
  • 封裝 將屬性封裝到類中,使得對象可以調用屬性
  • 繼承

    • 單繼承 子類可以繼承父類的屬性和函數
    • 多繼承

      ‘‘‘TEST繼承C和GC繼承B,B繼承A,A存在方法f1,A繼承X,X存在f2G繼承F,E繼承F,F存在方法f1,F繼承X,X存在f2TEST類的對象調用A類的f1,所以先從左邊找到頂層,如果左邊頂層有,就調用左邊頂層的f1,如果沒有去右邊找TEST類的對象調用X類的發,如果左邊右邊的頂層擁有共同的父類,先從左邊開始找,一直找到A類,再從右邊開始找,最後調用X類的f2‘‘‘class X:  def f2(self):      print(‘OK‘)class A(X):  def f1(self):      print(‘A‘)class B(A):  passclass C(B):  passclass E(X):  def f1(self):      print(‘E‘)class F(E):  passclass G(F):  passclass Test(C,G):  def test(self):      self.f1()t = Test()t.test()
  • 成員

    • 欄位

      • 普通欄位 屬於對象的欄位,每個對象都要儲存一份
      • 靜態欄位 屬於類的欄位,只儲存一份
    • 方法

      class Foo: @staticmethod def static_fun():     print(‘靜態方法,由類調用‘) @classmethod def clas_fun(cls):     print(‘類方法,由類調用‘) def fun(self):     print(‘普通方法,由對象調用‘)
      • 普通方法 由對象調用,至少有一個self參數,執行方法時,自動將對象的引用傳遞
      • 靜態方法 由類調用,可以沒有參數
      • 類方法 由類調用,至少有一個cls參數,指定方法時,自動將類名傳遞
    • 屬性 在普通方法的基礎上添加@property裝飾器,定義時,只需要一個self參數,調用時,無需添加()

      方式一:class Foo: def __init__(self,value):     self.value = value @property def price(self):     return self.value @price.setter def price(self,value):     self.value = value     print(‘設定屬性‘) @price.deleter def price(self):     print(‘刪除屬性‘)     del self.valuef = Foo(100)print(f.price)f.price = 200print(f.price)del f.priceprint(f.value)方式二:class Foo: def __init__(self,value):     self.value = value def get_price(self):     return self.value def set_price(self,value):     self.value = value     print(‘設定屬性‘) def del_price(self):     print(‘刪除屬性‘)     del self.value price = property(get_price,set_price,del_price)f = Foo(100)print(f.price)f.price = 200print(f.price)del f.priceprint(f.value)
  • 成員修飾符

    • 公有成員 在任何地方都能訪問
    • 私人成員 私人成員的命名規則是在名稱前面加____
  • Super關鍵字
    >強制調用父類的方法成員
    super(子類,self).f1()

  • 特殊成員

    • doc 表示類的描述資訊
    • module 表示當前操作的對象在那個模組
    • class 表示當前操作的對象是什麼類
    • init 構造方法,通過類建立對象時,自動觸發執行
    • del 析構方法,當對象在記憶體中被釋放時,自動觸發執行
    • call 對象後面加括弧,觸發執行
    • dict 類或對象的所有成員
    • str 列印對象時,預設輸入該方法的傳回值
    • getitem result = obj[‘k1‘]、result = obj[-1:1],自動執行該方法
    • setitem obj[‘k1‘] = 123、obj[1:4] = [11,22,33,44],自動執行該方法
    • delitem del obj[‘k1‘]、del obj[1:4],自動執行該方法
    • iter 用於迭代器,之所以列表、字典、元組可以進行for迴圈,是因為類型內部定義了 iter
    • metaclass 用來表示該類由 誰 來執行個體化建立
迭代器

可以被next()函數調用並不斷返回下一個值的對象稱為迭代器,產生器都是Iterator對象,但list、dict、str雖然是Iterable,卻不是Iterator,把list、dict、str等Iterable變成Iterator可以使用iter()函數

產生器

建立一個包含100萬個元素的列表,如果僅僅需要前面的幾個元素,那後面的元素所佔用的空間就浪費了,在Python中,有一種可以邊迴圈,邊計算後面元素的機制,成為產生器,產生器就是一個具有建立資料能力的一個對象

裝飾器

@+函數名
功能:
自動執行outer函數並且將f作為參數傳遞
將outer函數的傳回值重新賦值給f

def outer(func):def inner(*args,**kwargs):print(‘before‘)ret = func(*args,**kwargs)print(‘after‘)return retreturn inner@outerdef f(msg):print(msg)    f(‘kernel!‘)
反射

利用字串的形式去模組中操作成員
hasattr() 接收一個對象和一個字串成員名 ,如果找到返回Ture,如果沒有找到返回False
getattr() 接收一個對象和一個字串成員名,如果找到返回成員,如果沒有報錯
setattr() 接收一個對象和一個字串成員名,並設定成員
delattr() 接收一個對象和一個字串成員名,如果刪除成功就返回True

異常
  • 異常基礎
    while True:try:    print(int(input(‘num1:‘))+int(input(‘num2:‘)))except Exception as e:    print(e)
  • 常用異常

    AttributeError 試圖訪問一個對象沒有的樹形,比如foo.x,但是foo沒有屬性x
    IOError 輸入/輸出異常;基本上是無法開啟檔案
    ImportError 無法引入模組或包;基本上是路徑問題或名稱錯誤
    IndentationError 語法錯誤(的子類) ;代碼沒有正確對齊
    IndexError 下標索引超出序列邊界,比如當x只有三個元素,卻試圖訪問x[5]
    KeyError 試圖訪問字典裡不存在的鍵
    KeyboardInterrupt Ctrl+C被按下
    NameError 使用一個還未被賦予對象的變數
    SyntaxError Python代碼非法,代碼不能編譯(個人認為這是語法錯誤,寫錯了)
    TypeError 傳入物件類型與要求的不符合
    UnboundLocalError 試圖訪問一個還未被設定的局部變數,基本上是由於另有一個同名的全域變數,
    導致你以為正在訪問它
    ValueError 傳入一個調用者不期望的值,即使值的類型是正確的

  • 異常的其他結構
    try:# 主代碼塊passexcept KeyError,e:# 異常時,執行該塊passelse:# 主代碼塊執行完,執行該塊passfinally:# 無論異常與否,最終執行該塊pass
  • 主動觸發異常
    try:raise Exception(‘主動觸發‘)except Exception,e:print e
  • 斷言

    assert 條件

利用字串的形式去匯入模組

obj = import(‘manager‘)
obj = import(‘lib.manager‘) 預設情況下只能匯入到lib
obj = import(‘lib.manager‘,formlist=True) 即允許模組名使用拼接

Python中的特殊變數
  • doc py檔案的文檔注釋
  • cached 匯入模組的pyc檔案的路徑
  • file 當前運行檔案的所在的路徑
  • package 檔案隸屬與哪個包
  • name 只有當前檔案的name == ‘main‘

Python基礎總結

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.