一、文件处理相关 |
1、编码问题
(1)请说明python2 与python3中的默认编码是什么?
答:Python2是ascii python3是utf-8
(2)为什么会出现中文乱码?你能列举出现乱码的情况有哪几种?
答:中文出现乱码都是由于文件编码导致的。
(3)如何进行编码转换?
答:对文件先decode为unicode,再encode为需要转换的编码。
(4)#-*-coding:utf-8-*- 的作用是什么?
答:告诉解释器这个文件的编码格式是utf-8
(5)解释py2 bytes vs py3 bytes的区别
答:python3把字符串的编码改成了unicode, 还把str和bytes做了明确区分, str就是unicode格式的字符,bytes是单纯二进制。
在python2里,bytes == str
2、文件处理
(1)r和rb的区别是什么?
答:r是文本只读模式
rb:二进制只读模式,无法指定encoding,因为在该模式下数据读到内存里直接是bytes格式,如要查看内容还需手动decode
(2)解释一下以下三个参数的分别作用
open(f_name,‘r‘,encoding="utf-8")
答:f_name将打开的当前目录文件名,r:文本只读模式,encoding="utf-8":指定打开文件为utf-8编码模式。
二、函数基础 |
1、写函数,计算传入数字参数的和。(动态传参)
def func(*args): list1 = [] sum_data = 0 for i in args: list1.append(i) sum_data += i print(list1) print(sum_data) func(313, 213, 12, 1234, 453, 56)
2、写函数,用户传入修改的文件名,与要修改的内容,执行函数,完成整个文件的批量修改操作
def file_modify(filename, old, new): import os f = open(filename, mode=‘r+‘, encoding=‘utf-8‘) new_f = open(filename+"_bak", mode=‘w‘, encoding=‘utf-8‘) for line in f: if old in line: line = line.replace(old,new) new_f.write(line) os.remove(filename) os.rename(filename+"_bak",filename) file_modify(‘aaaa.txt‘, ‘ddd‘, ‘goodman‘)
3、写函数,检查用户传入的对象(字符串、列表、元组)的每一个元素是否含有空内容。
def func(args): n = 0 for i in args: if i == "": n += 1 print("有%s个空内容"%n) func((1, ‘‘, 2, 44, ‘‘, 12))
4、写函数,检查传入字典的每一个value的长度,如果大于2,那么仅保留前两个长度的内容,并将新内容返回给调用者。
dic = {"k1": "v1v1", "k2": [11,22,33,44]}
PS:字典中的value只能是字符串或列表
def func(args_dic): for i in args_dic: if len(args_dic[i]) > 2: item = args_dic[i][0:2] # 前两项 args_dic[i] = item print(args_dic) dic = {"k1": "v1v1", "k2": [11,22,33,44]} func(dic) # {‘k1‘: ‘v1‘, ‘k2‘: [11, 22]}
5、解释闭包的概念
答:在一个外函数中定义了一个内函数,内函数里运用了外函数的临时变量,并且外函数的返回值是内函数的引用。这样就构成了一个闭包。
三、函数进阶 |
1、写函数,返回一个扑克牌列表,里面有52项,每一项是一个元组
例如:[(‘红心’,2),(‘草花’,2), …(‘黑桃A’)]
def poker(): a = [‘红心‘, ‘草花‘, ‘方片‘, ‘黑桃‘] b = [2, 3, 4, 5, 6, 7, 8, 9, 10] c = [‘J‘, ‘Q‘, ‘K‘, ‘A‘] li = [] for i in b: for j in a: item = (j,i) li.append(item) for m in c: for n in a: item2 = (n+m) li.append(item2) print(li) print(len(li)) poker()
2、写函数,传入n个数,返回字典{‘max’:最大值,’min’:最小值}
例如:min_max(2,5,7,8,4)
返回:{‘max’:8,’min’:2}
def min_max(*args): # dict形式 li = [] for i in args: li.append(i) li.sort() dic = {‘max‘:li[-1], ‘min‘:li[0]} print(dic) min_max(2,5,7,8,4) # 输出:{‘max‘: 8, ‘min‘: 2}
3、写函数,专门计算图形的面积
其中嵌套函数,计算圆的面积,正方形的面积和长方形的面积
调用函数area(‘圆形’,圆半径) 返回圆的面积
调用函数area(‘正方形’,边长) 返回正方形的面积
调用函数area(‘长方形’,长,宽) 返回长方形的面积
def area(type, *args): def rectangle(length, wide): return "长方形面积", length*wide def square(length): return "正方形面积", length**2 def circlar(radius): import math return "圆形面积", math.pi*(radius**2) if type in locals(): return eval(type)(*args) print(area(‘rectangle‘, 133, 4)) print(area(‘circlar‘, 20)) print(area(‘square‘, 10))
4、写函数,传入一个参数n,返回n的阶乘
例如:cal(7)
计算7*6*5*4*3*2*1
def cal(n): item = 1 if int(n) == n: li = range(n+1) for i in li: if i == 0: pass else: item = item*i print(item) else: return "%s不是整数"%n cal(3) # 法二: def cal(n): result=1 for i in range(n, 0, -1): # 倒序 result=result*i return result print(cal(7))
5、编写装饰器,为多个函数加上认证的功能(用户的账号密码来源于文件),要求登录成功一次,后续的函数都无需再输入用户名和密码
user_db = { ‘hqs‘:‘123‘, ‘susiff‘:‘123‘, ‘guangfa‘:‘123‘ } with open(‘db.txt‘, ‘w‘, encoding=‘utf-8‘) as f: f.write(str(user_db)) login_db = {‘user‘: None, ‘status‘: False} db_path = r‘db.txt‘ def login(func): def inner(*args,**kwargs): if login_db[‘user‘] and login_db[‘status‘]: res = func(*args, **kwargs) return res user = input(‘input user:‘) passwd = input(‘input passwd:‘) with open(db_path, ‘r‘, encoding=‘utf-8‘) as f: user_db2 = eval(f.read()) if user in user_db2 and passwd == user_db2[user]: print(‘login ok‘) login_db[‘user‘] = user login_db[‘status‘] = True res = func(*args, **kwargs) return res else: print(‘login error‘) return inner # 加括号执行,不加括号返回内存地址 @login def home(): print("首页".center(40,‘-‘)) @login def america(name): print("欧美专区".center(40,‘-‘)) home() america(‘hqs‘)
四、生成器和迭代器 |
1、生成器和迭代器的区别?
可以被next()函数调用并不断返回下一个值的对象称为迭代器(Iterator).
在Python中,可以在循环过程中不断推算后续元素,这种一边循环一边计算的机制,称为生成器(generator)。
生成器是迭代器的一种:
1、生成器都是迭代器对象,但list\dict\str虽然是可迭代对象,但不是迭代器。
2、把list\dict\str等可迭代对象变成迭代器可以使用iter()函数
2、生成器有几种方式获取value?
next:唤醒生成器并继续执行
send("stop"):
1.唤醒并继续执行
2.发送一个信息到生成器内部
3、通过生成器写一个日志调用方法, 支持以下功能
- 根据指令向屏幕输出日志
- 根据指令向文件输出日志
- 根据指令同时向文件&屏幕输出日志
-
以上日志格式如下
2017-10-19 22:07:38 [1] test log db backup 3 2017-10-19 22:07:40 [2] user alex login success #注意:其中[1],[2]是指自日志方法第几次调用,每调用一次输出一条日志