迭代器,生成器,面向過程編程

迭代器

 什麼是迭代器(iterator)
器指的某種工具,
迭代指的是更新換代的過程,例如應用程序的版本更新從1.0 變成 1.1 再1.2
迭代的目的是要根據上一個結果,產生下一個結果,這是一個重複的過程,但不是單純的重複
迭代器就是,一種根據上一個結果獲得下一個結果的工具,簡單地說就是一種獲取數據的工具

可迭代對象
指的就是可使用迭代器取出數據的對象
如何判斷一個對象是否可迭代,就看這個對象是否提供迭代器,經過對象調用__iter__()來獲取迭代器
全部的容器類型(包括字符串)都是可迭代的

迭代器的使用
1.經過調用對象的__iter__()方法的到迭代器
2.調用迭代器的__next__()方法來獲取每個值
如何判斷一個對象是否是迭代器?
迭代是爲了取值,取值使用next方法,那麼只要對象具有 next方法就稱之爲迭代器
其中文件類型比較特殊,它既是迭代器,又是可迭代對象

迭代器總結:
迭代器是一種通用的取值工具
只有具有__iter__()方法的對象才能被迭代器取值,稱之爲可迭代對象
迭代器是爲了取值,只要具有next方法的就是迭代器,
python中迭代器同時具有iter方法和next方法 調用iter將返回迭代器自身
每一種數據類型內部的迭代實現都不各不相同

爲何用迭代器?
統一取值方式

如何使用
for ....
"""

# 要獲取數據 首先得要有數據
# 保存數據的方式有不少,以下
# a = 10
# print(a)

# nums = [1,2,3,4,5,6,7,8]
# nums = "hello python"
# nums = {1,3,5,7,9}
# index = 0
# while index < len(nums):
# t = nums[index]
# index += 1
# print(t)

# 目前每種數據類型 取值方式不統一這就有問題了,萬一後續增長新的數據類型,還得學習新的取值方式,
# 每種類型還不一樣,最好的解決方案是:提供一種通用的取值方式使其能夠搭配任何數據類型,因而就有迭代器


# 可迭代的類型

msg = "hello python"
# 帶有__開頭__結尾的方法都是內置的特殊方法,會在某個時間自動執行
res = msg.__iter__()
print(res)

d = {}
d.__iter__()

s = set()
s.__iter__()

t = (1,)
t.__iter__()

li =[]
li.__iter__()



li = [1,23,4,5]
res = li.__iter__()
print(res)

# print(res.__next__())
# print(res.__next__())
# print(res.__next__())
# print(res.__next__())
#
# print(res.__next__())

# msg = "hello python"
# msg = [1,2,4,5]
# msg = {"name":"張無忌","sex":"女"}
# msg = {1,2,3,4,5}
# # msg = 10
# res = msg.__iter__()
# while True:
# try:
# print(res.__next__())
# except:
# print("中止迭代啦.... 沒有值了")
# break
# print("over")
#
# # for
# for i in msg: # i = msg.__iter__().__next__()
# print(i)
#
# f = open("1.迭代器.py",encoding="utf-8")
# for line in f:
# print(line,end="")
#
# f.__iter__() # 文件也是可迭代對象

# f = open("1.迭代器.py",encoding="utf-8")
# f.__iter__() # 是一個可迭代對象
# f.__next__() # 是一個迭代器
# # 文件自身就是一個迭代器
# res = f.__iter__()
# print(res)
# print(f)
# print(res is f)


li = [ 1,2,3,4]
res = li.__iter__()
res.__iter__()

print(res)
print(res.__iter__().__iter__().__iter__().__iter__())

# msg = "hello world"


# 對於for而言 全部的對象都須要先判斷是不是一個可迭代對象
"""
僞代碼
if data.has(__iter__):
it = data.__iter__()

"""

# res = msg.__iter__()
# while True:
# try:
# print(res.__next__())
# except:
# print("中止迭代啦.... 沒有值了")
# break
# print("over")
#
# d = {"name":"bgon","sex":"man"}
# print(list(d.keys()).__iter__())


s = {1,2,3,4,5}

while len(s) > 0:
print(s.pop())
#
# 迭代器必定是可迭代對象
# 可迭代對象對應是迭代器

生成器
"""
生成器
generator
名詞解釋:
生成數據的工具
生成是從無到有的過程
工具能夠直接當作是函數,咱們能夠本身的定義一個函數來產生數據,可是每次執行
函數都只能產生一次數據
生成器的目的就是能夠屢次(不斷的)生成數據
在python中生成器就是一個函數
可是函數內部具有至少一個yield關鍵字
反過來只要函數中出現了yield那麼該函數就是一個生成器
yield關鍵字
一旦函數中出現了yield,調用函數式就不會當即執行函數體,而且會返回一個生成器對象
當調用生成器的next方法時會執行函數體,可是若是執行期間遇到了yield函數就會暫停執行
每一次調用next 都是從上一次yield的位置繼續往下執行,同時會將yield後的數據返回給調用者
yield與return的區別
都能返回一個值
不一樣之處在於:return只返回一次值,只要執行return函數就總體結束了
而yield能夠返回屢次值,而且會在返回後將函數暫停住
生成器就是迭代器
生成器同時具有iter和next函數,足以證實其就是一個迭代器,因此能夠直接使用for來遍歷
迭代器就是經過生成器實現的

迭代器,生成器,for之間的關係
for的原理是使用迭代器取值
迭代器是經過生成實現的

瞭解知識點:
yield的特殊用法
當你的生成器中須要外界數據參與時,生成器中如何接受外界數據?
閉包和參數都能傳數據到生成器中,可是都只能接收一次值,若是想要屢次傳值就須要使用send函數了
send函數用於向生成器發送數據,可是要注意必須先進行初始化,也就是先調用一次__next__()方法

"""

# def my_generator():
# print("start")
# yield 1
# print("over")
# yield 2
#
#
# gen = my_generator()
# print(gen)
#
# res1 = gen.__next__()
# print(res1)
# res2 = gen.__next__()
# print(res2)

# 能夠生成100個數字的生成器
# def get_num():
# i = 1
# while i <= 100:
# yield i
# i+=1
# #
# g = get_num()
# for i in range(100):
# print(g.__next__())


# def my_range():
# i = 0
# while i < 5:
# yield "a"
# i += 1

# res = my_range()
# for i in res: # i = res.__iter().__next__()
# print("=============")
# print(i)

# for i in range(10):
# print("123")


# send的使用
# def eat(name):
# print("this is a chicken name is",name)
# while True:
# food = yield "雞蛋"
# print("收到的數據",food)
#
# c = eat("bgon")
#
# c.__next__() #初始化生成器
# c.send("飼料") #fasng shu
# c.send("蟲子")


面向過程編程  
是一種編程思想,一樣的在編程界不僅有這一種編程思想,還要面向對象編程等等...
編程思想沒有高低之分,只有適合與不適合
你要思考的是什麼樣的應用程序應該採用哪一種編程思想

核心在於過程,指的是在編程時時刻想着過程
過程指的就是,第一步幹什麼第二步幹什麼,完成這個任務須要哪些步驟
以及每一個步驟要幹什麼

面向過程編程思想的優勢與缺點
優勢:能夠將一個複雜的大問題,拆分簡單的小問題,將複雜的問題簡單化,流程化.
缺點:牽一髮須要動全身,擴展性極差,正因如此,纔有了新的編程思想,即面向對象
使用場景:對於一些對擴展性要求不高的應用程序,建議採用面向過程,例如系統內核,shell腳本程序等等
後期咱們開發的應用程序大多都是直接面向用戶的,需求變化很是頻繁,因此這時候就須要使用面向對象了
 
迭代器?    for循環的實現原理    內部就是在獲取迭代器,不斷的調用next幫你取值,直到沒有值可取爲止    可迭代對象就是擁有iter的對象生成器    爲了避免斷的產生數據,    迭代器就是經過生成器實現的    生成器本質是一個函數 可是其中包含yield關鍵字
相關文章
相關標籤/搜索