日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程语言 > python >内容正文

python

Python学习笔记(五) Python高级特性

發布時間:2024/4/30 python 37 豆豆
生活随笔 收集整理的這篇文章主要介紹了 Python学习笔记(五) Python高级特性 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

Python高級特性

一、 切片

  • python中提供了切片(Slice)操作符 , 可以方便的獲取list或tuple中的某一段元素 。

    # -*- coding : utf-8 -*- #Python 切片#生成0~99的元組或list都是可以進行切片操作的 L=tuple(range(100))#輸出 print(L)#使用且前截取 #使用 L[startIndex : endIndex] 的形式 #startIndex表示 開始截取的位置 endIndex表示結束截取的位置 含左不含右 print(L[10:20]) print(L[:10]) # 沒有起始位置時 , 默認從0開始 print(L[10:]) # 沒有結束位置時 , 默認截取剩余部分#指定截取時的步數 print(L[:10:2]) # 截取0~10的元素 , 每兩個取一個 print(L[::5]) #所有的數 , 每五個取一個
  • 示例

    #去除字符串首尾的空格 def trim(s):if(s[0] == " "):s = s[1:]trim(s)elif s[len(s)-1] == " " :s = s[:len(s)-1]trim(s)else:print("***"+s+"***")s = input("請輸入要處理的字符串:") trim(s)
  • 二、 迭代

  • python中的迭代遍歷不僅僅可以用在list和tuple上 , 而且可以用在dict上 。
  • 示例

    # -*- coding : utf-8 -*- #python 中的迭代遍歷 #1. 迭代list 或 tuple #為什么是 一個列子? 因為tuple本身就是一個特別的listL=tuple(range(100)) J=list(range(100))for i in J :print(i)#2. 迭代一個dict # 在迭代dict時 , 默認迭代的是dict 的key 的集合 , 隨后可以拿著key從dict 中取到value D = {'a':1 , 'b':2 , 'c':3} #遍歷Key for d in D :print(d) #遍歷value 方式一 for d in D : print(D[d])#遍歷value 方式二 for d in D.values() :print(d)
  • 當我們在python 中使用for遍歷時 , 只要作用于一個可迭代對象 , for循環就可以正常運行 , 而不用太關心被迭代的元素類型 。
  • 如何判斷一個對象是一個可迭代對象 ?

    from collections import Iterable#python 判斷一個對象是否是一個可迭代對象 D = {'a':1 , 'b':2 , 'c':3} flag = isinstance(D , Iterable) print("是否是一個可迭代的對象呢: "+str(flag))
  • 遍歷二維list

    #python遍歷二維列表K=((1,1) , (2,2) , (3,3) , (4,4))for x , y in K :print(x , y)
  • 練習

    #python 迭代練習 #查找list中的最大值和最小值 print("查找list中的最大值和最小值:") H=(1,6,33,7,8,5,3,7,75,3,7,32,6,8,8,4,3,88,5,33,5,11111) min=None max=Nonefor h in H :if min==None or (h!=min and h<min) :#int 不能和None進行邏輯運算 , 當min為None時 , 先賦予初始值 。 min = helif max==None or (h!=max and h>max) :max = h print("min=" , min) print("max=" , max)
  • 三、 列表生成式

  • 列表生成式即List Comprehensions , 是Python內置的非常簡單卻強大的可以 用來創建List 的生成式 。

    舉個例子 要想生成[1,2,3,4,5,6,7,8,9,10] , 可以用list(range(1,11))但是想要生成[1x1 , 2x2 , 3x3 , 4x4, 5x5] 怎么做? 只能使用原始的for循環么?? 1. 可以用list(x*x for x in range(1, 6)) 2. 可以使用判斷 , 篩選出僅偶數的平方 list(x*x for x in range(1,11) if x%2==0) 3. 可以使用循環嵌套生成全排列 list(m+n for m in 'ABC' for n in 'XYZ')
  • 示例

    # -*- conding:utf-8 -*-import os #導入os模塊 #利用列表生成式列出當前目錄下所有的目錄和文件名L = [d for d in os.listdir('.')]#.代表當前目錄 print(L)#遍歷dict的第三中方式 D={'1':'a' , '2':'b' , '3':'c'} for k,v in D.items():#使用for循環遍歷dict 時 , 默認遍歷keys , 可以通過D.values()僅遍歷value , 可以通過items()同時遍歷key和valueprint(k , '=' , v) #使用列表生成式將dict 轉換為listL2 = [k+"="+v for k , v in D.items()] print(L2) #把list中的所有字符串轉換為小寫并輸出L3=['AAA',"BBB",18,'CCC','adfFFFF']L3c=[s.lower() for s in L3 if isinstance(s , str)] print(L3c)
  • 四 、 生成器

  • 通過列表生成式 , 我們可以直接創建一列表 , 但是雖然理論上list 的長度是無限的 , 由于受內存限制, 實際上list的長度也是受限的的 。 當我創建出一個包含100萬個元素的list卻只取其中的某幾個元素使用 一次時 ,這就顯得非常的浪費 。
  • 所以 ,如果列表中的元素如果可以按照某種算法推算出來 , 我們就不必創建大量占用內存的list而使用list 中的元素了 。 在python中這樣以便循環一邊計算的機制叫做生成器generator 。
  • 生成一個generator最簡單的辦法就是把一個列表生成式的[]改為() , 就創建了一個generator 。

    # -*- conding:utf-8 -*-#generator生成器 L=[x for x in range(10)] #列表生成式 用于比較 G=(x for x in range(10)) #生成器print("列表" , L) print("生成器" , G )
  • 遍歷generator的元素之前說過generator保存的是數據生成的算法 , 不斷調用next(g)的方式太麻煩 , 由于generator也是可迭代對象 , 所以可以使用for循環 。

    G=(x for x in range(10)) #生成器 for g in G :print(g)
  • generator非常強大 , 如果推算的算法比較復雜 , 用上述的方法無法實現的時候 , 還可以用函數來實現 。

    #函數的形式實現generator#比如,著名的斐波拉契數列(Fibonacci),除第一個和第二個數外,任意一個數都可由前兩個數相加得到: #1, 1, 2, 3, 5, 8, 13, 21, 34, ... #斐波拉契數列用列表生成式寫不出來,但是,用函數把它打印出來卻很容易:def fib(max) :n , a , b = 0 , 0 , 1#n控制循環次數 , a為假設的第0個數 b為第一個數while n<max :print(b)a , b = b , a+b # 相當于a=b , b=a+b n = n + 1 print('done')#調用 fib(6)
  • 定義generator的另一種形式: 如果一個函數中包含了yield關鍵字 , 那么這個函數就不再是一個普通函數 , 而是一個generator 。

    #從上面的例子可以看出和generator非常類似 , 可以從第一個元素開始推算出后續的任意元素 。 #想要把fib()函數變為generator , 其實只要將print(b) 變為yield b 就可以了def fib(max) :n , a , b = 0 , 0 , 1#n控制循環次數 , a為假設的第0個數 b為第一個數while n<max :yield ba , b = b , a+b # 相當于a=b , b=a+b n = n + 1 print('done')f=fib(6) print(f)
  • 需要注意的是:generator和函數的執行流程是不一樣的 , 函數時順序執行 , 從上至下 , 遇到return語句或函數最后一句時就返回 。但是generator在每次調用next()函數時執行 , 遇到yield語句返回 , 再次執行時從上次返回的yield處繼續執行 。

    #generator函數的執行順序 #generator遇到yield之后返回結果 , 下次執行時從上次的yield出執行 def odd() :print("step 1")yield 1print("step 2")yield 2print("step 3")yield 3o=odd() r1 = next(o) print(r1) r2 = next(o) print(r2) r3 = next(o)#當順序執行完yield關鍵字之后 , 再執行next()函數就會報錯 print(r3)
  • 即使generator是以函數的形式定義的 , 我們也幾乎不會用next()函數獲取返回值 , 而是使用迭代遍歷

    def odd() :print("step 1")yield 1print("step 2")yield 2print("step 3")yield 3#使用迭代遍歷獲取generator函數返回的值 for r in odd() :print(r)
  • 當generator以函數的形式定義 , 并且generator中含有return語句時 , 會發現拿不到return語句中的返回值 , 如果想要拿到返回值 ,則必須捕獲StopIteration錯誤 , 返回值包含在StopIteration的value中:

    def odd() :print("step 1")yield 1print("step 2")yield 2print("step 3")yield 3return "done"o=odd() while True:try:x=next(o)print(x)except StopIteration as e:print("return:" , e.value)break
  • 總結
  • generator 是非常強大的工具 , 在Python中 , 可以簡單的把列表生成式改為generator, 也可以通過函數形式實現復雜李玉偶記的generator
  • generator工作時的原理: generator在for循環的過程中不斷的計算下一個元素 , 并在適當的條件結束for循環 。 對于普通函數改成的generator來說, 遇到return語句或者執行到函數最后一行語句 , 就是結束generator的指令 , for循環隨之結束 。
  • 五 、 迭代器

  • 通過以上的學習已經知道 , 可以使用for循環的數據類型有以下幾種:

  • 集合數據類型: list 、 tuple 、 dict 、 set 、 str 。
  • generator :包括生成器和帶yield的generator function
  • 這些可以直接作用于for循環的對象統統成為可迭代對象

    # -*- coding : utf-8-*- #判斷數據類型是否是一個可迭代類型 from collections import Iterable flag = isinstance([] , Iterable) print("list是否是可迭代對象:" , flag)flag = isinstance(() , Iterable) print("tuple是否是可迭代對象:" , flag)flag = isinstance({} , Iterable) print("dict 、 set 是否是可迭代對象:" , flag)flag = isinstance("" , Iterable) print("str是否是可迭代對象:" , flag)
  • 生成器不但可以用for循環遍歷 , 還可以被next()函數不斷電泳并返回下一個值 , 知道最后拋出一個StopItreator 錯誤表示無法繼續返回下一個值了 。
  • 可以被next()函數調用并不斷返回下一個值的對象稱之為迭代器
  • 生成器是Iterator對象 , 但是list 、 dict 、 str雖然是Iterable , 卻不是Iteraor
  • 想要把Iterable轉換為Iterator可以使用iter()函數
  • 思考: list 、 dict 、 str為什么不是Iterator對象?
  • 因為pyhton 中Iterator對象表示的是一個數據流 , Iterator對象可以被next()函數調用并不斷返回下一個數據 , 直到沒有數據時拋出StopIteration錯誤 , 可以把這個數據流看作是一個有序序列, 但是我們不能提前知道序列的長度 , 只能不斷的通過next()函數實現按需計算下一個數據 , 所以Iterator的計算時惰性的 , 只有在需要返回下一個數據時他才會計算 。
  • Iterator甚至可以表示一個無限大的數據流 , 列如:全體自然數 , 而使用list永遠不可能存儲全部自然數 。
  • 迭代器總結:

  • 凡是可用作與for循環的對象都是Iterable類型
  • 凡是可以作用于next()函數的對象都是Iterator類型 , 他們表示一個惰性的計算的序列 。
  • 集合數據類型如: list 、 dict 、tuple 、 set 、 str都不是Iterator類型的數據 , 但是可以通過iter()函數轉換為一個Iterator類型的對象 。
  • Python的for循環本質上就是通過不斷調用next()函數實現的 。如:

    # -*- conding : utf-8-*-#迭代器 #Python中的for循環實質上是通過不斷調用next()函數實現的 。L = [1,32,3,4,5,6,7,8,89,9,]for l in L:pass#等同于 it = iter(L) while True:try :#獲取下一個值x = next(it)except StopIteration as e :#遇到異常break;
  • 總結

    以上是生活随笔為你收集整理的Python学习笔记(五) Python高级特性的全部內容,希望文章能夠幫你解決所遇到的問題。

    如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。