python学习笔记(十)——迭代器和生成器(外加import功能)
迭代器
百科:迭代是重復反饋過程的活動,其目的通常是為了逼近所需目標或結果。每一次對過程的重復稱為一次“迭代”,而每一次迭代得到的結果會作為下一次迭代的初始值。
迭代器定義:
所謂迭代器就是具有next方法的對象,在調用next方法時,迭代器會返回它的下一個值。如果next方法被調用,但迭代器沒有值可以返回,就會引發一個StopIteration異常。
迭代器書寫格式:
從可迭代對象生成一個迭代器 迭代器=iter(可迭代對象) 下個值=next(迭代器)示例:
li = [1,2,3,4,5,6] a = iter(li) print(a) print(next(a)) # 單次取一個 執行結果:1注意:next()只能用一次;如果用循環取,不用管下標,只能依次取值,取完之后會拋出異常,迭代完畢(next(a) == a.next())
示例:
for和while也都可以實現迭代過程,比如:
for i in range(100): # 依次拿東西 這就是迭代的過程print(i) =========================================================== li = [1,2,3,4,5,6] index = 0 while index < len(li): # 也能實現迭代過程print(li[index])index +=1那么問題來了,可迭代對象與迭代器有什么區別 ?
當一個對象有__iter__ next 兩個魔法方法 ,就叫做迭代器。如果沒有 next 只有iter 就叫做迭代對象。
可迭代對象一定有: __ iter __
迭代器有: __ iter __ , __ next __
生成器
生成器也叫簡單生成器,生成器可以幫助讀者寫出非常優雅的代碼,當然,編寫任何程序時不使用生成器也是可以的。
創建一個生成器就像創建函數一樣簡單,
示例(顯式的暫停與恢復,next控制):
注意:①遇到yield 就會返回出來,后面的代碼沒有被執行, 它會暫停, 再運行next 恢復代碼會繼續往下執行。②生成器在不運行它時,只是一串代碼,表達式而已。③一個next只能激活一個yield。
隱式的支持迭代協議
實例 1:
#斐波那鍥數列:數列當中每一個值都等于前面兩個數相加的值 def fibo(n):i,a,b = 0,1,1while i<n:yield aa,b = b,a+bi += 1d = fibo(5) for i in d:print(i,end=' ')執行結果: 1 1 2 3 5實例 2:
def func():print('我執行1')yield 1print('我執行2')yield 2print('我執行3')yield 3 a = func() print(next(a)) #不寫會發生什么呢? 不寫的結果就是print都不會被打印執行結果: 我執行1
補充:遞歸生成器
上面創建的生成器只能處理兩層嵌套,為了處理嵌套使用了兩個for循環,如果要處理任意層的嵌套呢?例如,可以每層嵌套需要增加一個for循環,但不知道有幾層嵌套,所以必須把解決方案變得更靈活,現在可以用遞歸來解決。
def fla(aa):try:for bb in aa:for cc in fla(bb):yield ccexcept TypeError:yield aali = list(fla([[[1],2],3,4,[5,[6,7]],8])) #注意括號層次比較多 print(li)執行結果: [1, 2, 3, 4, 5, 6, 7, 8]總結:生成器和普通函數有什么區別和聯系?
- 相同點:
- 定義格式相同,都是使用def語句
- 二者都可以有return語句,也可以沒有
- 函數體格式相同
- 不同點:
- 生成器函數中主要使用yield返回數據,而函數主要使用return返回數據
- 二者返回值不同,函數可以根據需要返回任何類型;生成器函數執行返回的是一個生成器
- 函數要調用會執行代碼,生成器不會,等待next激活運行代碼
包跟包管理
什么是包?
包體現了模塊的結構化管理思想,包由模塊文件構成,將眾多具有相關功能的模塊文件結構化組合形成包。
什么是模塊?
模塊是一種以.py為后綴的文件,在.py文件中定義了一些常量和函數。模塊的名稱是該.py文件的名稱。
什么是庫?
Python中的庫是借用其他編程語言的概念,沒有特別具體的定義,Python庫著重強調其功能性。在Python中,具有某些功能的模塊和包都可以被稱作庫。模塊有諸多函數組成,包由諸多模塊機構化組成,庫中也可以包含包、模塊和函數。
import功能:
import datetime #導入整個模塊 from datetime import datetime # 部分導入 導入部分包 from datetime import * # 所有的模塊 import datetime as dt # 取別名 # 沒有去別名:datetime.now() #取別名后 使用(例):dt.now() import time,deatetime # 導入多個包同級導包 import 文件名 # 文件夾要有__init__.py python 內置的包都是這么導入的if __name__ == '__main__':print(__name__) __name__ 自身調用就用__main__ 別人調用不了,就會變成包的名字,不會執行__main__pip — python必備的包管理:
基本使用:pip -V # 版本pip list #本地安裝包pip install [package_name] # 包安裝#包更新 pip install -U [package_name]#包卸載 pip uninstall [package_name]#包檢索(服務器端) pip search [package_keyword]#輸出安裝包的詳細信息 pip freeze#顯示本地安裝包的詳細信息 pip show [package_name]#pip自身更新 pip install --upgrade pip#幫助信息 pip--help總結
以上是生活随笔為你收集整理的python学习笔记(十)——迭代器和生成器(外加import功能)的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: SQLite API
- 下一篇: BF算法和KMP算法