• Python文件与函数练习题


    练习题

    文件处理相关

    1. 编码问题

      1. 请说明python2 与python3中的默认编码是什么?

        python2默认是ASCII码,python3默认是utf-8

      2. 为什么会出现中文乱码?你能列举出现乱码的情况有哪几种?

          
        sys.stdout.encoding,默认就是locale的编码,print会用sys.stdout.encoding去encode()成字节流,交给terminal显示。所以locale需要与terminal一致,才能正确print打印出中文。
        sys.setdefaultencoding(‘utf8’),用于指定str.encode() str.decode()的默认编码,默认是ascii。
        以下几种(local 为软件运行时的语言环境):
        终端为UTF-8,locale为zh_CN.GBK
        终端为UTF-8,locale为zh_CN.UTF-8
        终端为GBK,locale为zh_CN.GBK
        终端为GBK,locale为zh_CN.UTF-8
      3. 如何进行编码转换?

          
        字符串在python内部中是采用unicode的编码方式,所以其他语言先decode转换成unicode编码,再encode转换成utf8编码。
      4. #-*-coding:utf-8-*- 的作用是什么?

          
        #coding:utf-8 #.py文件是什么编码就需要告诉python用什么编码去读取这个.py文件。
      5. 解释py2 bytes vs py3 bytes的区别

          
        Python 2 将 strings 处理为原生的 bytes 类型,而不是 unicode(python2 str == bytes),

        Python 3 所有的 strings 均是 unicode 类型(python2 中需要通过 unicode )
          string -> encode -> bytes

          bytes -> decode -> string
    2. 文件处理

      1. r和rb的区别是什么?

        
      r 读模式
      rb 二进制读

      2.解释一下以下三个参数的分别作用

        
      open(f_name,'r',encoding="utf-8")

      f_name   文件名
      r       模式
      encoding 编码方式

    函数:

    函数使用

    1. 写函数,计算传入数字参数的和。(动态传参)


      def func_sum(x, y):
         return x + y

      lambda x,y:x+y
    2. 写函数,用户传入修改的文件名,与要修改的内容,执行函数,完成整个文件的批量修改操作

      import os
        def modify_file(file_name,content,newstr):
            new_file_name = '%sfile_name' %'new.'
            f_new = open(new_file_name, 'w')
            if os.path.exists(file_name):
                with open(file_name,'r+') as f:
                    for line in f:
                        if content in line:
                            line = line.replace(content, newstr)
                        f_new.write(line)
                f_new.close()
                os.rename(new_file_name, file_name)
            else:
                exit('file is not exist !!!')
    3. 写函数,检查用户传入的对象(字符串、列表、元组)的每一个元素是否含有空内容。

      
      
      def isNull(p_obj):
            for item in p_obj:
                if item.strip() == '':
                    return True
            else:
                return False
        ​
        a = [' ','1','2']
        b = ['5','1','2']
        c = 'ab c'
        print(isNull(a))
        print(isNull(c))
        print(isNull(b))
    4. 写函数,检查传入字典的每一个value的长度,如果大于2,那么仅保留前两个长度的内容,并将新内容返回给调用者。

        
        def two_len(**kwargs):
        ​
            for k, v in kwargs.items():
        ​
                if len(v) > 2:
        ​
                    kwargs[k] = v[:2]
        ​
            return kwargs
        ​
        print(two_len(x='12', y='345', c='byw'))
        ​
    5. 闭包

      内部函数包含对外部作用域而非全局作用域变量的引用,该内部函数称为闭包函数

    6. 写函数,返回一个扑克牌列表,里面有52项,每一项是一个元组

      1. 例如:[(‘红心’,2),(‘草花’,2), …(‘黑桃A’)]

        
        
        def cards():
              type_li = ['红心', '草花', '黑桃','梅花']
              num = list(range(2, 11))
              num.extend('JQKA')
              return [(x, y) for x in type_li for y in num ]
          ​
          print(len(cards()), cards())
        ​
    7. 写函数,传入n个数,返回字典{‘max’:最大值,’min’:最小值}

      
      
      def max_min_dic(*args):
            min_v = min(args)
            max_v = max(args)
            return {'max':max_v,'min':min_v}
        ​
        print(max_min_dic(2,3,6,7,9))
    8. 写函数,传入一个参数n,返回n的阶乘

      
      
      from functools import reduce
        def factorial(n):
            if n == 0:
                return 0
            elif n == 1:
                return 1
            else:
                return reduce(lambda x, y: x*y ,list(range(1, n)))
        print(factorial(5))
    9. 编写装饰器,为多个函数加上认证的功能(用户的账号密码来源于文件),要求登录成功一次,后续的函数都无需再输入用户名和密码

      user_dic={
          'user':None,
          'is_authenticate':False
      }
      
      def read_file():
          with open('USER.TXT','r') as f:
              s = f.read().strip(',')
              user_info = eval(s)
          return user_info
      
      def auth(user_info):
          username = input("account:").strip()
          password = input("password:").strip()
          print(user_info)
          if username in user_info['name'] and password in user_info['password']:
              print("success")
              user_dic['user'] = username
              user_dic['is_authenticate'] = True
              return user_dic
          else:
              print("Failure")
              return ''
           def login_required(func):
      
             def inner(*args, **kwargs):
      
                 if args[0].get('is_authenticate'):
      
                     ret = func(*args, **kwargs)
      
                 else:
      
                     exit('need authenticate')
      
                 return ret
      
             return inner
      
         @login_required
      
         def print_info(acc_data):
      
             print('进入')
      
         user_info = read_file()
      
         user_data = auth(user_info)
      
         print(user_data)
      
         print_info(user_data)

    生成器和迭代器

    生成器有几种方式获取value?
    `next和for循环

    内置函数

    1. 用map来处理字符串列表,把列表中所有人都变成good,比方alex_good

    2.  name=['alex','wupeiqi','yuanhao','nezha']
       print(list(map(lambda x:x+'good',name)))
    1. 用filter函数处理数字列表,将列表中所有的偶数筛选出来

      num = [1,3,5,6,7,8]
      print(list(filter(lambda x:x%2==0,num)))
        ​
    2. 如下,每个小字典的name对应股票名字,shares对应多少股,price对应股票的价格

      计算购买每支股票的总价

      用filter过滤出,单价大于100的股票有哪些

        
        portfolio = [
        {'name': 'IBM', 'shares': 100, 'price': 91.1},
        {'name': 'AAPL', 'shares': 50, 'price': 543.22},
        {'name': 'FB', 'shares': 200, 'price': 21.09},
        {'name': 'HPQ', 'shares': 35, 'price': 31.75},
        {'name': 'YHOO', 'shares': 45, 'price': 16.35},
        {'name': 'ACME', 'shares': 75, 'price': 115.65}
        ]
        print([(item['name'],item['shares']*item['price']) for item in portfolio])
        print(list(filter(lambda item:item['price']>100, portfolio)))

      4.有列表 li = ['alex', 'egon', 'smith', 'pizza', 'alen'], 请将以字母“a”开头的元素的首字母改为大写字母;

        li = ['alex', 'egon', 'smith', 'pizza', 'alen']
        print([item.capitalize() if item.startswith('a') else item for item in li])

      5.有如下程序, 请给出两次调用show_num函数的执行结果,并说明为什么:

    3.  num = 20
          def show_num(x=num):
            print(x)
          show_num()
          num = 30
          show_num()
          
          20
          20
          如果函数收到的是一个不可变对象(比如数字、字符或者元组)的引用,就不能直接修改原始对象,相当于通过“传值’来传递对象。

       6. 有列表 li = ['alex', 'egon', 'smith', 'pizza', 'alen'], 请以列表中每个元素的第二个字母倒序排序

    • li = ['alex', 'egon', 'smith', 'pizza', 'alen']
        print(list(sorted(li,key=lambda x :x[1],reverse=True)))
       

    综合

    • 有名为poetry.txt的文件,其内容如下,请删除第三行:
    • """
        昔人已乘黄鹤去,此地空余黄鹤楼。
        黄鹤一去不复返,白云千载空悠悠。
        晴川历历汉阳树,芳草萋萋鹦鹉洲。
        日暮乡关何处是?烟波江上使人愁。
      """
      
      import os
      
      str = '晴川历历汉阳树,芳草萋萋鹦鹉洲'
      f_name = 'poetry.txt'
      f_new_name = '%s.new'% f_name
      f_new = open(f_new_name,'w',encoding='utf-8')
      with open(f_name,'r', encoding='utf-8') as f:
          for line in f:
              if str in line:
                  line = ''
                  f_new.write(line)
              else:
                  f_new.write(line)
      f_new.close()
      os.replace(f_new_name, f_name)
    • 有名为username.txt的文件,其内容格式如下,写一个程序,判断该文件中是否存在"alex", 如果没有,则将字符串"alex"添加到该文件末尾,否则提示用户该用户已存在
    • import os
      
      str = 'alex'
      f_name = 'username.txt'
      f_new_name = '%s.new'% f_name
      with open(f_name,'r+', encoding='utf-8') as f:
          for line in f:
              if str in line:
                  print('the user {} already exist'.format(str))
                  break
          else:
              f.write('
      %s' % str)
    • 有名为user_info.txt的文件,其内容格式如下,写一个程序,删除id为100003的行;

    • """
      有名为user_info.txt的文件,其内容格式如下,写一个程序,删除id为100003的行
      pizza,100001
      alex, 100002
      egon, 100003
      """
      
      f_name = r'user_info.txt'
      f_new_name = '%s.new'%f_name
      del_id = '100001'
      f_new = open(f_new_name, 'w', encoding='utf-8')
      with open(f_name, 'r', encoding='utf-8') as f:
          for line in f:
              if del_id in line:
                  pass
              else:
                  f_new.write(line)
      f_new.close()
      os.replace(f_new_name,f_name)
    • 有名为user_info.txt的文件,其内容格式如下,写一个程序,将id为100002的用户名修改为alex li

    • """
      有名为user_info.txt的文件,其内容格式如下,写一个程序,将id为100002的用户名修改为alex li
      pizza,100001
      alex,100002
      egon,100003
      """
      f_name = r'user_info.txt'
      f_new_name = '%s.new'%f_name
      update_id = '100002'
      update_name = 'alex li'
      f_new = open(f_new_name, 'w', encoding='utf-8')
      with open(f_name, 'r', encoding='utf-8') as f:
          for line in f:
              if update_id in line:
                  line = ','.join([update_name, update_id])
                  f_new.write(line+'
      ')
              else:
                  f_new.write(line)
      f_new.close()
      os.replace(f_new_name,f_name)
      
      
    • 写一个计算每个程序执行时间的装饰器;
    • import time
      from functools import wraps
      def timer(func):
          @wraps(func)
          def wrapper(*args,**kwargs):
              start = time.time()
              ret = func(*args, **kwargs)
              print('{} execute {}s'.format(func.__name__,time.time()-start))
              return ret
          return wrapper
      
      
      
      @timer  # fib = timer(fib)
      def fib(n):
          a, b = 0, 1
          for i in range(n):
              print(b)
              a, b = b, a+b
          return b
      
      fib(100)
    • lambda是什么?请说说你曾在什么场景下使用lambda?

    • 好处:
              1.lambda函数比较轻便,即用即扔,适合完成只在一处使用的简单功能
              2.匿名函数,一般用来给filter,map这样的函数式编程服务
              3.作为回调函数,传递给某些应用,比如消息处理
    • 题目:写一个摇骰子游戏,要求用户压大小,赔率一赔一。

      要求:三个骰子,摇大小,每次打印摇骰子数。

    • import random
      
      
      def roll_dice(numbers=3, points=None):
          """
          定义骰子,循环三次
          :param numbers:
          :param points:
          :return:
          """
          if points is None:
              points = []
      
          print('----- 摇骰子 -----')
          while numbers > 0:
              point = random.randrange(1, 7)
              # print('roll dice is {}'.format(point))
              points.append(point)
              numbers -= 1
      
          return points
      
      
      def roll_result(total):
          """
          定义大小,三个大或者一个小两个大。三个小或者两个小一个大
          :param total:
          :return:
          """
      
          is_big = 11 <= total <= 18
          is_small = 3 <= total <= 10
          if is_big:
              return "big"
          elif is_small:
              return "small"
      
      
      def start_game():
          money = 1000
          while money > 0:
              print('----- 游戏开始 -----')
              choices = ['big', 'small']
              your_choice = input("请下注, big or small")
              your_bet = input("下注金额:")
              if your_choice in choices:
                  if your_bet.isdigit():
                      points = roll_dice()
                      total = sum(points)
                      you_win = your_choice == roll_result(total)
                      if you_win:
                          print("骰子点数", points, total)
                          money += int(your_bet)
                          print("恭喜, 你赢了%s元, 你现在的本金%s 元" % (your_bet, money))
                      else:
                          print("骰子点数", points, total)
                          money -= int(your_bet)
                          print("很遗憾, 你输了%s元, 你现在的本金%s 元" % (your_bet, money))
      
                  else:
                      print('格式有误,请重新输入')
              else:
                  print('格式有误,请重新输入')
          else:
              print("game over")
      
      start_game()

     

  • 相关阅读:
    Security headers quick reference Learn more about headers that can keep your site safe and quickly look up the most important details.
    Missing dollar riddle
    Where Did the Other Dollar Go, Jeff?
    proteus 与 keil 联调
    cisco router nat
    router dhcp and dns listen
    配置802.1x在交换机的端口验证设置
    ASAv931安装&初始化及ASDM管理
    S5700与Cisco ACS做802.1x认证
    playwright
  • 原文地址:https://www.cnblogs.com/xiao-apple36/p/8726096.html
Copyright © 2020-2023  润新知