迭代器、for循环本质、生成器、常用内置方法整理
迭代器
什么是迭代器
迭代:更新換代(重復)的過程,每次的迭代都必須基于上一次的結果
迭代器:迭代取值的工具
為什么要用迭代器
迭代器給你提供了一種不依賴索引取值的方式
?
重復+每次迭代都是基于上一次的結果而來的
l = [1, 2, 3, 4] s = 'hello' n = 0 while n < len(s):print(s(n))n+=1根據我們知道的數據類型中,其中 字符串(str)、列表(list)、元組(tuple)、字典(dict)、集合(set)、文件對象 都屬于需要迭代取值的數據類型,內置有__iter__方法的都叫做可迭代對象
文件對象(執行內置的__iter__之后還是本身,沒有任何變化):文件對象本身就是迭代器對象
迭代器對象
1.內置有__iter__方法
2.內置有__next__方法
注意:迭代器一定是可迭代對象,而可迭代對象不一定是迭代器對象
列表取值
l = [1,2,3,4] iter_l = l.__iter__() #生成一個迭代器對象#迭代器取值,調用__next__方法 print(iter_l.__next__()) #取值:1 print(iter_l.__next__()) #取值:2 print(iter_l.__next__()) #取值:3 print(iter_l.__next__()) #取值:4 print(iter_l.__next__()) #當列表中的值被取完時,直接報錯StopIteration字典取值
d = {'name':'zhangsan', 'password':'123', 'hobby':'study'}#將可迭代對象d轉換成迭代器對象 iter_d = d.__iter__()#迭代器對象取值,使用__next__ print(iter_d.__next__()) #取值:name print(iter_d.__next__()) #取值:password print(iter_d.__next__()) #取值:hobby print(iter_d.__next__()) #當字典中的key被取完時,直接報錯StopIteration在項目過程中,所有的程序肯定是不允許有報錯信息的,這時我們可以使用捕獲異常來處理
while True:try:print(iter_d.__next__())except StopIteration: #放入程序的報錯信息print('值已經被取完了')breakps:迭代器取值的特點:只能從前往后依次取,不能倒序
?
for循環內部的本質
for循環內部的本質
1.將in后面的對象調用__iter__轉換成迭代器對象
2.調用__next__迭代取值
3.內部有異常捕獲StopIteration,當__next__報這個錯,自動結束循環
d = {'name':'zhangsan', 'password':'123', 'hobby':'study'} for i in d:print(i)#for循環后面的in是關鍵,跟的是一個可迭代對象小示例:
#使用匿名函數,以及map方法求取出的值 l = [1,2,3,4] res = map(lambda x:x+1,l) print(map(lambda x:x+1,l)) print(res.__next__()) print(res.__next__()) print(res.__next__()) print(res.__next__())#打印結果 2 3 4 5小結:
可迭代對象:內置有__iter__方法
迭代器對象:內置既有__iter__方法,內置也有__next__方法
迭代取值:
優點:
1.不依賴于索引取值
2.內存中永遠只占一份空間,不會導致內存溢出
缺點:
1.不能夠獲取指定的元素
2.取完之后會報錯StopIteration
?
?
生成器
生成器:用戶自定義的迭代器
?
def func():print('first')yield 666 # 函數內如果有yield關鍵字,那么加括號執行函數的時候并不會觸發函數體代碼的運行print('second')yield 777print('third')yield 888,999print('forth')yield g = func() # 生成器初始化:將函數變成迭代器 print(g) print(g.__next__()) print(g.__next__()) print(g.__next__())打印結果:
<generator object func at 0x000001F4D0F73780>
first
666
second
777
third
(888, 999)
?
# yield后面跟的值就是調用迭代器__next__方法能得到的值
# yield既可以返回一個值,也可以返回多個值,并且多個值也是按照元組的形式返回
?
小練習:
有這樣一個例子,如何把它寫成一個生成器呢?
for i in range(1,10,2):
print(i)
?
yield的用法
yield支持外界為其傳參
def eat(name):print('%s 準備開吃' %name)while True:food = yieldprint('%s 吃了 %s' %(name, food))g = eat('zhangsan') g.__next__() # 必須現將代碼運行至yield,才能夠為其傳參 g.send('包子') #send給yield左邊的變量傳值,其中觸發了__next__方法 g.send('火腿')# 打印結果 zhangsan 準備開吃 zhangsan 吃了 包子 zhangsan 吃了 火腿# 當函數內有yield關鍵字的時候,調用該函數不會執行函數體代碼,而是將函數變成生成器小結:
yield:
1.提供了一種自定義生成器方式
2.會幫助將函數的運行狀態暫停住
3.可以返回值
與return之間異同點
相同點:都可以返回值,并且都可以返回多個
不同點:
1.yield可以返回多次值,而return只能返回一次函數就會立即結束
2.yield還可以接收外部傳入的值
?
生成器生成式
生成器不會主動執行任何一行代碼,必須通過__next__觸發代碼的運行
with open('xxx.txt','r',encoding='utf-8') as f:g = (len(line) for line in f)print(sum(g)) #求和練習
def add(n,i):return n+i def test():for i in range(4):yield i g=test() for n in [1,10]:g=(add(n,i) for i in g)# 第一次for循環g=(add(n,i) for i in test())# 第二次for循環g=(add(n,i) for i in (add(n,i) for i in test())) print(n) res=list(g) print(res)res的結果是多少答案
[20,21,22,23] View Code?
?
?
內置方法
abs:絕對值
print(abs(-11.11)) # 求絕對值 l = [0,1,0] print(all(l)) # 只要有一個為False就返回False print(any(l)) # 只要有一個位True就返回True?callable :可調用的(可調用返回True,不可調用返回False)
l = [1,2,3] def index():pass print(callable(l)) print(callable(index)) # print(chr(97)) # 將數字轉換成ascii碼表對應的字符 # print(ord('a')) # 將字符按照ascii表轉成對應的數字dir:獲取當前對象名稱空間里面的名字
l = [1,2,3] print(dir(l))divmod:分頁器
print(divmod(101,10)) total_num,more = divmod(900,11) if more:total_num += 1 print('總頁數:',total_num)enumerate:枚舉
l = ['a','b'] for i,j in enumerate(l,1):print(i,j)eval
s = """ print('hello baby~') """ eval(s)# 打印結果 hello baby~s1 = """
print(1 + 2)
for i in range(10):
print(i)
"""
eval(s1)
# 報錯:SyntaxError: invalid syntax
# eval不支持邏輯代碼,只支持一些簡單的python代碼
exec
s1 = """ print(1 + 2) for i in range(10):print(i) """ exec(s1)# 打印結果
1
2
3
4
5
6
7
8
9
format 三種玩法
{}占位
{index} 索引
{name} 指名道姓
isinstance:判斷是否屬于某個數據類型
n = 1 print(type(n)) print(isinstance(n,int))# 打印結果 <class 'int'> True print(pow(2,3)) #2的三次方# 打印結果 8 print(round(3.4)) #四舍五入# 打印結果 3help:打印函數注釋
def login():"""一起嗨皮:return:""" print(help(login))?
轉載于:https://www.cnblogs.com/chengzige/p/11190559.html
總結
以上是生活随笔為你收集整理的迭代器、for循环本质、生成器、常用内置方法整理的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 记-PHPExcel下载
- 下一篇: 乒乓球训练