9.28学习内容

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)

原文地址:https://www.cnblogs.com/jutao/p/9720952.html

时间: 2024-10-08 01:18:59

9.28学习内容的相关文章

2017/9/5的学习内容___通过yield实现在单线程的情况下实现并发运算的效果

之前的学习内容,由于没有申请开通博客,就没有分享,今天想分享一下学习内容:通过yield实现在单线程的情况下实现并发运算的效果 采用的是经典的生产消费者模型 定义了两个函数 Consumer与Producer 关于生成器标志yield : 如果用__next__访问,只是单纯调用yield :如果是send访问,不仅可以访问yield,也可以给yield赋值! 需求:一个人造包子:两个人吃包子: 代码如下: 1 # -*- coding:utf-8 -*- 2 # Author : 何子辰 3

2017年8月9日学习内容存放 #socket通信介绍

2017年8月9日学习内容存放 1 #socket通信介绍 2 3 ''' 4 OSI七层 5 6 应用 7 表示 8 会话 9 传输 10 网络 ip 11 数据链路 mac 12 物理层 网线 13 14 15 16 http 17 smtp 18 dns 19 ftp 20 ssh 21 snmp 22 icmp ping 23 dhcp 24 25 26 27 发 send 28 收 receive 29 30 31 32 33 TCP/IP 三次握手,四次断开 34 35 UDP 36

ijwmh1-2-以前学习整理出来的学习内容--什么是变量1整型变量

崧闱旭 ijwmh1-2-以前学习整理出来的学习内容--什么是变量1整型变量

2015.7.31学习内容

2015.7.31学习内容 循环结构——for循环 1.什么时候选用for循环结构? 当循环次数固定的时候,我们首选for循环 2.for循环结构的基本语法和执行顺序是什么? (1).for语法 for(初始变量;循环条件;迭代变量){ } for(int i=0;i<100;i++){ //循环操作 } (2).死循环:如果一个循环没有终止条件,那么该程序将会无休止的执行下去,直到我们强行结束掉该程序 ,程序才强行退出,那么这样的循环,称为死循环. (3).break 当我们想要在循环过程中,

python-第一块,笔记整理和学习内容复习(day1 - day2 - day3)

DAY1 学习内容: 今天是培训班开班第一天,第一天,了解了python的历史,发展前景,也喝了Alex老师的一大碗鸡汤.鸡汤是鲜的,然后学习还是要学得. 今天写了python的第一个程序,hello world.突然想起大学的时候学习c语言的时候,写的也是这个.此时此刻,新增所想确实,hello python,i'm coming. 笔记:大写代表常量,例如PIE: ASCII的起源,以及gb2312.gbk.gb18031和utf-8等编码的出生: 注释:单行用#,多行用'''   ''':

2015.7.29学习内容

2015.7.29学习内容 一.Switch选择结构 1.回顾 01.在Java中如何产生一个随机数 Math.random()    随机数范围:0到1,能取到0,取不到1 02.equals(): 在Java中,如果比较两个字符串用==的话,会出现错误,所以以后我们只要是对字符串类型进行对比,统一使用equals方法 2.Switch选择结构 Switch(char/int){ case 1: //语句 break; case 2: //语句2 break; default: //默认语句

2.Freshman阶段学习内容的确定

我刷知乎.在知乎上答题的程序员,不是很牛逼就是更牛逼,说起各种系统.各种系统的各种版本.各种语言.数据库.算法.IT届的各种圣战都有板有眼.信手拈来.头头是道,不得不服.这导致了一些非常严重的问题:我都想学,什么都想学,要学的东西太多了,但是不知道从什么地方学期,注意力全都分散了,而且已经花了好多精力找资料了...不由得使我想起大一的时候各种下资料分类整理归档,然后基本上都没看过.前面犯过的错历历在目,再犯的时候毫无察觉,死性不改,人类为何总是重复相同的错误T_T.所以花了一会儿静下心想了想,觉

14-6-27&amp;28自学内容小结

Java对大小写十分敏感 运行时如果没有找到class,会出现NoClassDefFoundError的表达 如果没有找到main method,会出现NoSuchMethodError的表达 制作对话框:需要在JOptionPane class里用到showMessageDialog method 格式:JOptionPane.showMessageDialog(null,"对话框内容","对话框标题",JOptionPane.INFORMATION_MESSAG

2015.8.5学习内容

2015.8.5学习内容 一.二重循环 1.直角三角形 * ** *** **** ***** *号(j)          行号(i) 1                 1 2                 2 3                 3 for(i=1;i<=3;i++){ for(j=1;j<=i;j++){ System.out.print("*"); } System.out.println(""); } 2.直角三角形 * *