1. 程式人生 > 其它 >註解版SpringMVC

註解版SpringMVC

迭代器與生成器

迭代器

"""
迭代器就是用來迭代取值的工具

迭代其實就是一個重複的過程,但是每次重複都是基於上一次的結果進行的,單純的重複不叫迭代

優點:
   (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)