1. 程式人生 > >9.28學習內容

9.28學習內容

str 文件的 elif 學習 就是 with 異常 本質 一個

24疊加多個裝飾器
# 加載裝飾器就是將原函數 偷梁換柱成了裝飾器最內層那個wrapper函數
# 在加載完畢後,調用原函數其實就是在調用wrapper函數
 
# 當一個被裝飾的對象同時疊加多個裝飾器時
# 裝飾器的加載順序是:自下而上
# 裝飾器內wrapper函數的執行順序是:自上而下
‘‘‘
 
import time
 
def timmer(func): #func=wrapper2的內存地址
    def wrapper1(*args, **kwargs):
        print(‘===================================>wrapper1運行了‘)
        start=time.time()
        res = func(*args, **kwargs) #===========================>跳到wrapper2去執行了,
        stop=time.time()
        print(‘run time is %s‘ %(stop - start))
        return res
    return wrapper1
 
def auth(engine=‘file‘):
    def xxx(func): # func=最原始那個index的內存地址
        def wrapper2(*args, **kwargs):
            print(‘===================================>wrapper2運行了‘)
            name=input(‘username>>>: ‘).strip()
            pwd=input(‘password>>>: ‘).strip()
            if engine == ‘file‘:
                print(‘基於文件的認證‘)
                if name == ‘egon‘ and pwd  == ‘123‘:
                    print(‘login successfull‘)
                    res = func(*args, **kwargs)
                    return res
            elif engine == ‘mysql‘:
                print(‘基於mysql的認證‘)
            elif engine == ‘ldap‘:
                print(‘基於ldap的認證‘)
            else:
                print(‘錯誤的認證源‘)
        return wrapper2
    return xxx
 
@timmer # index=timmer(wrapper2的內存地址) #index=wrapper1的內存地址
@auth(engine=‘file‘) #@xxx #index=xxx(最原始那個index的內存地址) #index=wrapper2的內存地址
def index():
    print(‘welcome to index page‘)
    time.sleep(2)
 
index() #wrapper1的內存地址()
‘‘‘
 
 
 
 
import time
 
def timmer(func): #func=wrapper2的內存地址
    def wrapper1(*args, **kwargs):
        print(‘===================================>wrapper1運行了‘)
        start=time.time()
        res = func(*args, **kwargs) #===========================>跳到wrapper2去執行了,
        stop=time.time()
        print(‘run time is %s‘ %(stop - start))
        return res
    return wrapper1
 
def auth(engine=‘file‘):
    def xxx(func): # func=最原始那個index的內存地址
        def wrapper2(*args, **kwargs):
            print(‘===================================>wrapper2運行了‘)
            name=input(‘username>>>: ‘).strip()
            pwd=input(‘password>>>: ‘).strip()
            if engine == ‘file‘:
                print(‘基於文件的認證‘)
                if name == ‘egon‘ and pwd  == ‘123‘:
                    print(‘login successfull‘)
                    res = func(*args, **kwargs)
                    return res
            elif engine == ‘mysql‘:
                print(‘基於mysql的認證‘)
            elif engine == ‘ldap‘:
                print(‘基於ldap的認證‘)
            else:
                print(‘錯誤的認證源‘)
        return wrapper2
    return xxx
 
@auth(engine=‘file‘)
@timmer
def index():
    print(‘welcome to index page‘)
    time.sleep(2)
 
index() #wrapper1的內存地址()
 
 
25 什麽是叠代器
    叠代指的是一個重復的過程,每一次重復都是基於上一次的結果而來的
    li=[‘a‘,‘b‘,‘c‘,‘d‘,‘e‘]
    li=(‘a‘,‘b‘,‘c‘,‘d‘,‘e‘)
    li=‘hello‘
 
    i=0
    while i < len(li):
        print(li[i])
        i+=1
    叠代器指的是叠代取值的工具,該工具的特點是可以不依賴於索引取值
2. 為何要用叠代器
    為了找出一種通用的&可以不依賴於索引的叠代取值方式
 
3. 如何用叠代器
    可叠代的對象:但凡內置有.__iter__方法的對象都稱之為可叠代的對象
    叠代器對象:既內置有__iter__方法,又內置有__next__方法
    關於__iter__方法:
        調用可叠代對象的__iter__會的到一個叠代器對象
        調用叠代器對象的__iter__會的到叠代器本身
 
4. 總結叠代器的優缺點:
    優點:
    1. 提供了一種通用的&可以不依賴於索引的叠代取值方式
    2. 同一時刻在內存中只有一個值,更加節省內存
 
    缺點:
    1. 取指定值不如索引靈活,並且叠代器是一次性的
    2. 無法預知叠代器數據的個數
 
‘‘‘
# 可叠代的對象: str,list,tuple,dict,set,文件對象
# 叠代器對象: 文件對象
 
# 可叠代的對象=====》叠代器對象:調用可叠代對象內置的__iter__方法會有一個返回值,該返回值就是對應的叠代器對象
dic={‘x‘:1,‘y‘:2,‘z‘:3}
 
# iter_dic=dic.__iter__()
# # print(iter_dic)
# res1=iter_dic.__next__()
# print(res1)
#
# res2=iter_dic.__next__()
# print(res2)
#
# res3=iter_dic.__next__()
# print(res3)
#
# res4=iter_dic.__next__()
# print(res4)
 
 
 
# print(dic.__iter__().__next__())
# print(dic.__iter__().__next__())
# print(dic.__iter__().__next__())
 
 
# dic={‘x‘:1,‘y‘:2,‘z‘:3}
# # dic=[‘a‘,‘b‘,‘c‘]
# iter_dic=dic.__iter__()
#
# # iter_dic=open(r‘D:\上海python全棧4期\day13\今日內容‘,mode=‘rt‘,encoding=‘utf-8‘)
#
# while True:
#     try:
#         print(iter_dic.__next__())
#     except StopIteration:
#         break
 
# for準確地說應該是叠代器循環,for循環的原理如下:
#1. 先調用in後面那個值的__iter__方法,得到叠代器對象
#2. 執行叠代器.__next__()方法得到一個返回值,然後賦值給一個變量k,運行循環體代碼
#3, 循環往復,直到叠代器取值完畢拋出異常然後捕捉異常自動結束循環
 
dic={‘x‘:1,‘y‘:2,‘z‘:3}
iter_dic=dic.__iter__()
print(iter_dic)
print(iter_dic.__iter__())
 
# for k in dic: #iter_dic=dic.__iter__()
#     print(k)
 
 
 
# with open(r‘D:\上海python全棧4期\day13\今日內容‘,mode=‘rt‘,encoding=‘utf-8‘) as f:
#     for line in f: #iter_f=f.__iter__()
#         print(line)
 
 
 
26yield關鍵字:只能用在函數內
# 在函數內但凡包含有yield關鍵字,再去執行函數,就不會立刻運行函數體代碼了
# 會得到一個返回值,該返回值成之為生成器對象,生成器本質就是叠代器
 
# 總結yield:
# 1. 提供一種自定義叠代器的解決方案
# 2. yield可用於返回值
#    yield VS return
#    相同點:都可以用於返回值
#    不同點:yield可以暫停函數,yield可以返回多次值,而return只能返回值一次值函數就立刻終止
 
# def func():
#     print(‘=====>第一次‘)
#     yield 1
#     print(‘=====>第二次‘)
#     yield 2
#     print(‘=====>第三次‘)
#     yield 3
#     print(‘=====>第四次‘)
#
# # print(func)
#
# g=func()
# # print(g.__iter__().__iter__().__iter__() is g)
# # iter(g) #g.__iter__()
# # next(g) #g.__next__()
#
# res1=next(g)
# print(res1)
#
# res2=next(g)
# print(res2)
#
# res3=next(g)
# print(res3)
#
# res4=next(g)
# print(res4)
 
 
 
def my_range(start,stop,step=1):
    while start < stop:
        yield start
        start+=step
 
res=my_range(1,5,2) # 1 3
 
next(res)
next(res)
# print(next(res))
# for item in res:
#     print(item)
 
 
 
for item in my_range(1,5,2):
print(item)
 
        27多種表達式
# 三元表達式   
# def max2(x,y):
#     if x > y:
#         return x
#     else:
#         return y
#
# x=10
# y=20
# res=‘條件成立的值‘ if x > y else ‘條件不成立的值‘
# print(res)
 
# 列表生成式
# l=[]
# for i in range(1,11):
#     if i > 4:
#         res=‘egg%s‘ %i
#         l.append(res)
# print(l)
#
# l=[‘egg%s‘ %i for i in range(1,11) if i > 4]
# print(l)
 
# names=[‘egon‘,‘lxx‘,‘yyx‘,‘cw‘,‘alex‘,‘wxx‘]
# l=[]
# for name in names:
#     if name != ‘egon‘:
#         res=‘%s_DSB‘ %name
#         l.append(res)
# print(l)
#
# l=[‘%s_DSB‘ %name for name in names if name != ‘egon‘]
# print(l)
 
# 生成器表達式
# res=(i**2 for i in range(3))
# print(res)
# print(next(res))
# print(next(res))
# print(next(res))
# print(next(res))
 
 
with open(r‘D:\上海python全棧4期\day13\今日內容‘,mode=‘rt‘,encoding=‘utf-8‘) as f:
    # data=f.read()
    # print(len(data)) #1025
 
    # res=0
    # for line in f:
    #     res+=len(line)
    # print(res)
 
    # res=sum((len(line) for line in f))
    # res=sum(len(line) for line in f)
    # print(res)
 
    # res=max([len(line) for line in f])
    # res=max((len(line) for line in f))
    res=max(len(line) for line in f)
    print(res)
 
# 字典生成式
# items=[(‘name‘,‘egon‘),(‘age‘,18),(‘sex‘,‘male‘)]
 
# dic={}
# for k,v in items:
#     dic[k]=v
# print(dic)
 
# res={k:v for k,v in items if k != ‘sex‘}
# print(res)
 
 
# res={i for i in ‘hello‘}
# print(res)

9.28學習內容