• python之道15


    1. 请实现一个装饰器,限制该函数被调用的频率,如10秒一次(借助于time模块,time.time())(面试题,有点难度,可先做其他)

      答案

      # 思路 运行不能用
      import time
      
      def wrapper(f):
          t = 0
          def inner(*args,**kwargs):
              nonlocal t
              if time.time() - t > 3:
                  ret = f(*args,**kwargs)
                  t = time.time()
                  return ret
          return inner
      
      
      @wrapper
      def func():
          print('in func')
      
      方法一:
      import time
      
      def wrapper(s):
          def inner():
              with open("lasttime",encoding='utf-8',mode='r+')as f1:
                  ret1 = f1.readlines()
                  start = time.time()
      
                  if start - float(ret1[-1]) > 10:
                      s()
                      end = time.time()
                      f1.write(f"{end}
      ")
                  else:
                      print(f"调用时间太频繁,还剩余{10 - int(start - float(ret1[-1]))}可以执行")
          return  inner
      
      @wrapper
      def test_time1():
          print("执行函数")
      test_time1()
      # 方法二
      def timmer(fun):
          count = 0
          def wrapper(*args, **kwargs):
              nonlocal count
              start_time = time.time()
              data = fun(*args, **kwargs)
              end_time = time.time()
              dt = end_time - start_time
              count += 1
              print(f"被调用{count}次,本次调用花费时间{dt}秒。")
              return data
          return wrapper
      @timmer
      def func():
          print("123")
          time.sleep(10)
      func()
      func()
      
    2. 请写出下列代码片段的输出结果:

    def say_hi(func):
        def wrapper(*args,**kwargs):
            print("HI")
            ret=func(*args,**kwargs)
            print("BYE")
            return ret
        return wrapper
    
    def say_yo(func):
        def wrapper(*args,**kwargs):
            print("Yo")
            return func(*args,**kwargs)
        return wrapper
    @say_hi
    @say_yo
    def func():
        print("ROCK&ROLL")
    func()
    

    答案

    HI
    Yo
    ROCK&ROLL
    BYE
    
    1. 编写装饰器完成下列需求:
    2. 用户有两套账号密码,一套为京东账号密码,一套为淘宝账号密码分别保存在两个文件中。
    3. 设置四个函数,分别代表 京东首页,京东超市,淘宝首页,淘宝超市。
    4. 启动程序后,呈现用户的选项为:

    ​ 1,京东首页

    ​ 2,京东超市

    ​ 3,淘宝首页

    ​ 4,淘宝超市

    ​ 5,退出程序

    1. 四个函数都加上认证功能,用户可任意选择,用户选择京东超市或者京东首页,只要输入一次京东账号和密码并成功,则这两个函数都可以任意访问;用户选择淘宝超市或者淘宝首页,只要输入一次淘宝账号和密码并成功,则这两个函数都可以任意访问.

      相关提示:用带参数的装饰器。装饰器内部加入判断,验证不同的账户密码。

      答案

      status = {'jd':False, 'taobao':False}
      user_dic = {}
      menu = {1:'京东首页', 2:'京东超市', 3:'淘宝首页', 4:'淘宝超市', 5:'退出程序'}
      for k,v in enumerate(menu,1):
      	print(k,menu[v])
      
      
      def wrapper_out(n):
      	def wrapper(f):
      		def inner(*args,**kwargs):
      
      
      				if status[n] == True  :
      							ret = f(*args, **kwargs)
      							return ret
      				else:
      					user_input = input('请输入用户名: ').strip()
      					pass_input = input('请输入密码: ').strip()
      					with open(n,mode='r',encoding='utf-8') as f1:
      						for line in f1:
      							username,password = line.strip().split('|')
      							user_dic[username] = password
      							if user_input in user_dic and pass_input == password:
      								status[n] = True
      								ret = f(*args, **kwargs)
      								return ret
      						return False
      
      		return inner
      	return wrapper
      
      @wrapper_out('jd')
      def jd_index():
      	print('京东首页')
      
      
      @wrapper_out('jd')
      def jd_chaoshi():
      	print('京东超市')
      
      
      @wrapper_out('taobao')
      def taobao_index():
      	print('淘宝首页')
      
      
      @wrapper_out('taobao')
      def taobao_chaoshi():
      	print('淘宝超市')
      
      def func():
      	while 1:
      		chiose = input('请选择序号: ').strip()
      		if chiose == '1':
      			jd_index()
      		elif chiose == '2':
      			jd_chaoshi()
      		elif chiose == '3':
      			taobao_index()
      		elif chiose == '4':
      			taobao_chaoshi()
      		elif chiose == '5':
      			exit()
      func()
      
    2. 用递归函数完成斐波那契数列(面试题):

    斐波那契数列:1,1,2,3,5,8,13,21..........(第三个数为前两个数的和,但是最开始的1,1是特殊情况,可以单独讨论)

    答案

    def func(n):
    	if n == 0:
    		return n
    	elif n == 1:
    		return n
    	else:
    		return func(n-1) + func(n-2)
    
    print(func(6))
    # 输出结果
    8
    

    用户输入序号获取对应的斐波那契数字:比如输入6,返回的结果为8.

    1. 给l1 = [1,1,2,2,3,3,6,6,5,5,2,2] 去重,不能使用set集合(面试题)。

      答案

    l1 = [1,1,2,2,3,3,6,6,5,5,2,2]
    l2 = []
    def func(n):
    	for i in n:
    		if n.count(i) >= 2:
    			if i not in l2:
    				l2.append(i)
    	return l2
    
    print(func(l1))
    # 输出结果
    [1, 2, 3, 6, 5]
    
  • 相关阅读:
    「训练反思18」 (8.16) 认清自己
    「训练日志17」 (8.12) 崩盘
    「训练日志16」 8.11 下坠
    「训练日志15」 (8.10)
    「训练反思15」(8.10)
    「训练日志14 」(8.9) 失败
    训练日志13 (8.7)
    Linux 设置vim指令
    训练日志12 (8.5)
    训练反思12 (8.5)
  • 原文地址:https://www.cnblogs.com/zanao/p/11144224.html
Copyright © 2020-2023  润新知