註解版SpringMVC
阿新 • • 發佈:2021-06-28
迭代器與生成器
迭代器
""" 迭代器就是用來迭代取值的工具 迭代其實就是一個重複的過程,但是每次重複都是基於上一次的結果進行的,單純的重複不叫迭代 優點: (1):找到一種通用的迭代取值方案---->for迴圈 (2): 惰性計算,節省記憶體 缺點: (1): 不能取指定的值,只能往後next (2): 迭代器物件是一次性的;一個迭代器物件取值取乾淨了,就不能在繼續取了。若想繼續取值,則必須重新來一個迭代器物件。 可迭代物件: 內建有__iter__方法的物件都是可迭代物件 迭代器物件: 呼叫可迭代物件的__iter__()會得到一個返回值,這個返回值就是迭代器物件 內建有__next__方法的物件都是迭代器物件 特點: 1.內建有__next__()方法 用來取值 2.內建有__iter__()方法 方便for迴圈 """ >>> l = [1,2,3,4,5] >>> iter_l = iter(l) # 等價於 iter_l = l.__iter__ >>> next(iter_l) # 等價於 iter_l.__next__ 1 >>> next(iter_l) 2 >>> next(iter_l) 3 # 這是兩種迭代器的取值方式,注意迭代器取值一次性取完,後面就不能再取,要取只能重新來一個迭代器 l = [1,2,3,4,5,6,7] iter_l = iter(l) while True: try: print(next(iter_l)) except StopIteration as e: break
生成器
"""
自定義的迭代器
"""
"""
需求:
造一個生成器,內部有1-10 這樣一個列表
"""
def func(start, stop, step=1):
while start < stop:
yield start
start += 1
g = func(1,10)
for i in g:
print(i)
"""
yiel對比return
相同點: 都可以返回任意型別,任意個數的值
不同點: return只能返回一次值,函式就立即結束
yield可以返回多次值,可以暫停函式的執行
"""
函式遞迴
""" 函式遞迴: 函式遞迴是函式巢狀的一種特殊格式,內部自己呼叫自己,其實就是一種迴圈機制 遞迴分為兩個階段: 回溯: 一層一層往下呼叫 遞推: 一層一層向上推出結果 """ 例如: """ 需求: 取出下面列表的每一個元素 """ l = [11, [22, [33, [44, [55, [66, [77, [88, [99]]]]]]]]] def func(l): for item in l: if type(item) is list: func(item) else: print(item) func(l)
演算法之二分法
"""
需求:
最快找到指定值
"""
nums = [3, 7, 9, 13, 21, 33, 57, 63, 78, 99]
file_num = 63
def search(l, file_num):
if len(l) == 0:
return
mid = len(l) //2
if file_num > l[mid]:
search(l[mid+1:], file_num)
elif file_num < l[mid]:
search(l[:mid], file_num)
else:
print(f'找到了')
search(nums, 63)
三元表示式
"""
條件成立時的返回值 if 條件 else 條件不成立時的返回值
"""
例:
"""
找最大值
"""
x = 20
y = 10
print(x if x > y else y )
各種生成式
# 列表生成式
"""
需求:
生成一個1-10的列表,要求大於3元素
可以用來做一些列表的對映
"""
res = [i for i in range(10) if i > 3]
# 字典生成式
d = {'k%i'%i:i for i in range(3)}
#集合生成式
s = {i for i in range(4)}
# 生成器表示式(沒有元組生成式,因為元組本身的不可變,而且有列表生成式,需要元組把列表做一個型別轉換就可以了)
>>> g = (i for i in range(3))
>>> print(g)
<generator object <genexpr> at 0x000002781E541F90>
>>> next(g)
0
>>>
例:
"""
需求:
計算一個文字檔案的字元個數,假設這個檔案很大
"""
with open('a.txx', 'rt', encoding='utf-8')as f:
res = sum(len(line) for line in f)
print(res)