zoukankan      html  css  js  c++  java
  • Python基础第七天

    一、内容

    二、练习

    练习1

    题目:编写函数,函数执行的时间是随机的

    图示:

    代码:

    import time
    import random
    
    def func():
        s = 1
        l = []
        for i in range(1,random.randrange(1,50)):
            s *= i               # s的最大值为:s = 1 * 2 * 3...50
            time.sleep(0.05)
            l.append(i)          # 再把变量i添加至列表l里,此时l列表中的元素最大值为l = [1,2,3,4..50]
        print("%s‘sproduct is%d"%(l,s))
    func()
    

    练习2

    题目:编写装饰器,为函数加上统计时间的功能

    代码:

    import time
    import random
    
    def timmer(data):
        def wrapper(*args,**kwargs):
            start_time = time.time()
            data(*args,**kwargs)
            stop_time = time.time()
            print('The function runs %s seconds'%(stop_time - start_time))
        return wrapper
    @timmer
    def func():
        s = 1
        l = []
        for i in range(1,random.randrange(1,50)):
            s *= i               # s的最大值为:s = 1 * 2 ...* 50
            time.sleep(0.05)
            l.append(i)          # 再把变量i添加至列表l里,此时l列表中的元素最大值为l = [1,2,3...50]
        print("%s‘sproduct is:%d"%(l,s))
    func()
    

    输出结果:

    例:

    [1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19, 20, 21, 22, 23, 24, 25, 26, 27, 28, 29, 30, 31, 32, 33, 34, 35, 36, 37, 38, 39]‘sproduct is20397882081197443358640281739902897356800000000
    The function runs 2.407280206680298 seconds
    View Code

    练习3

    题目:编写装饰器,为函数加上认证的功能

    代码:

    def auth(data):
        def wrapper(*args,**kwargs):
            user = 'knight'
            pwd = 'dk123'
            count = 1
            while True:
                if count == 4:
                    print('Too many times')
                    break
                username = input('Please enter username:').strip()
                passowrd = input('Please enter password:')
                if username == user and passowrd == pwd:
                    print('Login successfully!')
                    data(*args, **kwargs)
                    break
                else:
                    print('Login failed')
                    print('You still have %s chances'%(3-count))
                count += 1
        return wrapper
    @auth
    def func():
        s = 1
        l = []
        for i in range(1,random.randrange(1,50)):
            s *= i               # s的最大值为:s = 1 * 2 ...* 50
            time.sleep(0.05)
            l.append(i)          # 再把变量i添加至列表l里,此时l列表中的元素最大值为l = [1,2,3...50]
        print("%s‘sproduct is:%d"%(l,s))
    func()
    

      

    练习4

    题目:

    编写装饰器,为多个函数加上认证的功能(用户的账号密码来源于文件),要求登录成功一次,后续的函数都无需再输入用户名和密码
    注意:从文件中读出字符串形式的字典,可以用eval('{"name":"knight","password":"dk123"}')转成字典格式

    文件内容如下:
    {'name': 'knight', 'password': 'dk123'}

    {'name': 'lisa', 'password': '123'}

    {'name': 'tangbao', 'password': 'tangbao123'}

    {'name': 'zhuozi', 'password': 'zz123'}

    {'name': 'laozhang', 'password': 'lz110'}

    图示:

    代码:

    # 编写装饰器,为多个函数加上认证的功能(用户的账号密码来源于文件),要求登录成功一次,后续的函数都无需再输入用户名和密码
    # 注意:从文件中读出字符串形式的字典,可以用eval('{"name":"knight","password":"dk123"}')转成字典格式
    
    db_path=r'C:UsersWilliamPycharmProjectsItem_Python1day7user_info.txt'
    user_dic={
        'knight':'dk123',
        'lisa':'123',
        'tangbao':'tangbao123',
        'zhuozi':'zz123',
        'laozhang':'lz110'
    }
    
    # 将字典强转为字符串写入至文件db_path中
    with open(db_path,'w',encoding='utf-8') as f:
        f.write(str(user_dic))
    
    # 定义一个字典,让用户名默认对应None,登陆状态默认对应False
    login_dic={
        'user':None,
        'status':False,
    }
    
    # 装饰器函数
    def auth(func):
        def wrapper(*args,**kwargs):
            with open(db_path,'r',encoding='utf-8') as f:
                user_dic=eval(f.read())  # 将文件"db_path"里的内容转成字典形式
    
            # 用户名不为空,并且登陆状态不是False
            while not login_dic['user'] and not login_dic['status']:
                username = input('Please enter username:').strip()
                password = input('Please enter password:')
                if username in user_dic:                # 判断用户名是否在字典user_dic内,当在字典user_dic中时
    
                    if password == user_dic[username]:  # 判断密码是否为字典user_dic中键所对应的值。
                        print('login successful')
                        login_dic['user'] = username    # 将用户输入的用户名添加至login_dic字典里
                        login_dic['status'] = True      # 将login_dic中的’status‘的False改为True
                                                        # (登陆状态改为True)
                        res=func(*args,**kwargs)
                        return res
                    else:
                        print('password error')         # 密码若不匹配字典user_dic[username]中时,提示密码错误
                        continue                        # 并退出本次循环继续循环(反复输入)
    
    
                else:print('not found username')        # 如果不在字典user_dic里时提示没有找到用户名
    
    
            # 表示用户为为空时并且登陆状态为False时,直接输出原函数
            else:
                res = func(*args, **kwargs)
                return res
        return wrapper
    
    
    @auth
    # 原函数index
    def index():
        print('welcome to index')
    
    # 原函数home
    @auth
    def home(name):
        print('welcome %s to home page'%name)
    
    
    # 调用函数index与home
    index()
    home('knight')
    

    输出结果:

    1、输入一个不存在于字典user_dic中的用户名:

    2、输入一个存在于字典user_dic中的用户名,但密码不匹配:

    3、输入一个存在于字典user_dic中的,并且密码匹配:

    练习5

    题目:编写下载网页内容的函数,要求功能是:用户传入一个url,函数返回下载页面的结果

    代码:

    from urllib.request import urlopen
    
    def get(url):
        return urlopen(url).read()   # 将下载的内容直接返回
    print(get('https://www.python.org'))
    

      

    练习6

    题目:为练习5编写装饰器,实现缓存网页内容的功能:
    具体:实现下载的页面存放于文件中,如果文件内有值(文件大小不为0),就优先从文件中读取网页内容,否则,就去下载,然后存到文件中

    图示:

    代码:

    from urllib.request import urlopen # 调用下载模块
    import os
    
    cache_path=r'C:UsersWilliamPycharmProjectsItem_Python1day7cache.txt'
    def make_cache(func):
        def wrapper(*args,**kwargs):
            if os.path.getsize(cache_path):
            # 返回文件大小,如果文件不存在就返回错误,这里表示有缓存
    
                print('33[45m*******有缓存*******33[0m') # 打印有缓存,33[45m...33[0m 表示字体颜色
                with open(cache_path,'rb') as f:            # 将这个文件以"rb"的模式读取出来,二进制的方式读
                    res = f.read()                          # 得到二进制
    
    
            else:
            # 文件没有内容,直接返回原函数,这里表示无缓存
                res=func(*args,**kwargs)
                with open(cache_path,'wb') as f:            # 将原函数的内容以二进制的写的方式直接写入至文件cache_path中
                    f.write(res)
            return res
        return wrapper
    
    
    @make_cache
    # 原函数
    def get(url):
        return urlopen(url).read()
    
    # 调用函数
    print('========>first')
    print(get('https://www.python.org'))
    print('========>second')
    print(get('https://www.python.org'))
    print('========>third')
    print(get('https://www.python.org'))
    

      

    练习7

    题目:基于上面网页缓存装饰器的基础上,实现缓存不同网页的功能,要求,用户提交的不同url,都能缓存下来,对相同的url发起下载请求,优先从缓存里取内容。

    图示:

    示例:

  • 相关阅读:
    1105 Spiral Matrix (25 分)螺旋矩阵
    1089 Insert or Merge (25 分)
    1044 Shopping in Mars (25 分)二分查找
    1068 Find More Coins (30 分)记忆化搜索
    1133 Splitting A Linked List (25 分)
    1145 Hashing
    1147 Heaps (30 分)
    1098 Insertion or Heap Sort (25 分)
    自测-3 数组元素循环右移问题 (20 分)
    自测-1 打印沙漏 (20 分)
  • 原文地址:https://www.cnblogs.com/fyknight/p/8048035.html
Copyright © 2011-2022 走看看