第二模块:函数编程 第1章-练习题
文件处理相关:
1. 编码问题
1) 请说明python2与python3中的默认编码是什么?
python2中默认编码是ASCII码
python3中默认编码是UTF-8
2)为什么会出现中文乱码?你能列举出现乱码的情况有哪几种?
中文乱码就是因为存的编码和展现的编码不一致造成的,不同的编码是去不同的编码表里去匹配的,就会出现匹配出来的字符不符合。
乱码的情况:
a. 存的是GBK的编码,展现的时候是使用UTF-8编码或其他编码。
3)如何进行编码转换?
encode 和 decode
s = "大中国" # 默认编码是utf-8 print(s) # 输出:大中国 s1 = s.encode("GBK") # 将编码转为GBK print(s1) # 输出:b'\xb4\xf3\xd6\xd0\xb9\xfa' s2 = s1.decode("gbk", "utf-8") # 将s1由gbk转为utf-8 print(s2) # 输出:大中国
4)#-*-coding:utf-8-*- 的作用是什么?
表明使用utf-8编码进行解释。
5)解释py2 bytes vs py3 bytes的区别:
py2的 bytes = str
py3的bytes就是bytes
2. 文件处理
1)r 和 rb 的区别是什么?
r 以只读的模式使用文件
rb 以只读的二进制模式使用文件
2)解释一下以下三个参数的分别作用
open(f_name,'r',encoding="utf-8")
第一个参数:操作的文件路径
第二个参数:文件的打开方式
第三个参数:使用什么编码来打开文件
函数基础:
''' 1. 写函数,计算传入数字参数的和。(动态传参) ''' def my_sum(*args): sum_num = 0 for i in args: sum_num += i print(sum_num) my_sum(12, 34, 45, 353, 435)
''' 2. 写函数,用户传入修改的文件名,与要修改的内容,执行函数,完成整个文件的批量修改操作 ''' def change_data(filename, old_content, new_content): f = open(filename, "r+", encoding="utf-8") data = f.read() f.seek(0) f.write(data.replace(old_content, new_content)) f.close() change_data("test.txt", "明月", "彩霞")
''' 3. 写函数,检查用户传入的对象(字符串、列表、元组)的每一个元素是否含有空内容。 ''' def check_space(object): for i in object: if str(i).isspace(): print(">>>空格") else: print("正常") s = "aaaa b df sdfsafhnsd dfudf" l = ["12", 34, 324324, 4, 4, "sad fdsafa"] t = ("12", 34, 324324, 4, 4, "sad fdsafa") check_space(s) check_space(l) check_space(t)
''' 4. 写函数,检查传入字典的每一个value的长度,如果大于2,那么仅保留前两个长度的内容,并将新内容返回给调用者。 dic = {"k1": "v1v1", "k2": [11,22,33,44]} PS:字典中的value只能是字符串或列表 ''' def check_dict(dic): print(dic) for i in dic: if len(dic[i]) > 2: dic[i] = dic[i][0:2] print(dic) dic = {"k1": "v1v1", "k2": [11, 22, 33, 44]} check_dict(dic)
5. 解释闭包的概念。
使用闭包可以在函数外部对函数内嵌套的函数进行调用。
函数进阶:
''' 1. 写函数,返回一个扑克牌列表,里面有52项,每一项是一个元组 例如:[(‘红心’,2),(‘草花’,2), …(‘黑桃A’)] ''' def poker(): li = ["红心", "方块", "草花", "黑桃"] t_li = [] for index, i in enumerate(li): n = 1 while n <= 13: tt = () if n == 1: tt = (li[index], "A") elif n == 11: tt = (li[index], "J") elif n == 12: tt = (li[index], "Q") elif n == 13: tt = (li[index], "K") else: tt = (li[index], n) t_li.append(tt) n += 1 print(t_li) poker()
''' 2. 写函数,传入n个数,返回字典{‘max’:最大值,’min’:最小值} 例如:min_max(2,5,7,8,4) 返回:{‘max’:8,’min’:2} ''' def min_max(*args): d = {} d["max"] = max(args) d["min"] = min(args) print(d) min_max(12, 35, 6, 3, 234, 3435, 324)
''' 3. 写函数,专门计算图形的面积 其中嵌套函数,计算圆的面积,正方形的面积和长方形的面积 调用函数area(‘圆形’,圆半径) 返回圆的面积 调用函数area(‘正方形’,边长) 返回正方形的面积 调用函数area(‘长方形’,长,宽) 返回长方形的面积 def area(): def 计算长方形面积(): pass def 计算正方形面积(): pass def 计算圆形面积(): pass ''' def area(type, *args): def roundness(*args): area_r = 3.14 * (args[0] ** 2) print("圆的面积:", area_r) def rectangle(*args): area_r = args[0] * args[1] print("长方形的面积:", area_r) def square(*args): area_s = args[0] * args[0] print("正方形的面积:", area_s) if type == "圆形": return roundness(*args) if type == "正方形": return square(*args) if type == "长方形": return rectangle(*args) area("圆形", 23) area("长方形", 23, 56) area("正方形", 10)
''' 4. 写函数,传入一个参数n,返回n的阶乘 例如:cal(7) 计算7*6*5*4*3*2*1 ''' def cal(n): if n == 0: return 1 return n * cal(n - 1) print(cal(7))
''' 5. 编写装饰器,为多个函数加上认证的功能(用户的账号密码来源于文件),要求登录成功一次,后续的函数都无需再输入用户名和密码 ''' login_status = False def login(func): def inner(): account = get_account_from_file() global login_status if login_status == False: name = input("name:") pwd = input("pwd:") print(account) if name == account["username"] and pwd == account["password"]: print("登录成功") login_status = True else: print("登录失败") if login_status: print("认证已通过。。") func() return inner def get_account_from_file(): f = open("account5.txt", "r", encoding="utf-8") data = eval(f.read()) f.close() return data @login def run(): print("跑....") @login def walk(): print("走....") run() walk()
生成器和迭代器
1. 生成器和迭代器的区别?
生成器是迭代器的一种。
2. 生成器有几种方式获取value?
3. 通过生成器写一个日志调用方法,支持以下功能
内置函数
''' 1. 用map来处理字符串列表,把列表中所有人都变成sb,比方alex_sb name=['alex','wupeiqi','yuanhao','nezha'] ''' name = ['alex', 'wupeiqi', 'yuanhao', 'nezha'] name = list(map(lambda x: x + "_sb", name)) print(name)
''' 2. 用filter函数处理数字列表,将列表中所有的偶数筛选出来 num = [1,3,5,6,7,8] ''' num = [1, 3, 5, 6, 7, 8] num = list(filter(lambda x: x % 2 == 0, num)) print(num)
''' 3. 如下,每个小字典的name对应股票名字,shares对应多少股,price对应股票的价格 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} ] 计算购买每支股票的总价 用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} ] for d in portfolio: print(d["name"], "股票总价:", d["shares"] * d["price"]) print("单价大于100的有:") print(list(filter(lambda d: d["shares"] > 100, portfolio)))
4. 请分别介绍文件操作中不同的打开方式之间的区别:
r:只读模式
rb:二进制只读模式
r+:可读可写模式,先读后写
w:只写模式,覆盖写
wb:二进制写模式
w+:可读可写模式,先写后读
wb+:二进制模式
a:追加模式
ab:二进制追加模式
a+:
ab+:
''' 5、有列表 li = ['alex', 'egon', 'smith', 'pizza', 'alen'], 请将以字母“a”开头的元素的首字母改为大写字母; ''' li = ['alex', 'egon', 'smith', 'pizza', 'alen'] new = [] for i in li: if i.startswith("a"): i = i.replace(i, "A" + i[1:]) new.append(i) print(new)
6、有如下程序, 请给出两次调用show_num函数的执行结果,并说明为什么:
num = 20
def show_num(x=num):
print(x)
show_num()
num = 30
show_num()
执行结果为:
20
20
因为:根据作用域查找顺序,num=30在函数声明之后,函数无法调用到。
''' 7. 有列表 li = ['alex', 'egon', 'smith', 'pizza', 'alen'], 请以列表中每个元素的第二个字母倒序排序; ''' li = ['alex', 'egon', 'smith', 'pizza', 'alen'] li = sorted(li, key=lambda x: x[1]) print(li) # 输出:['egon', 'pizza', 'alex', 'alen', 'smith']
''' 8、有名为poetry.txt的文件,其内容如下,请删除第三行; 昔人已乘黄鹤去,此地空余黄鹤楼。 黄鹤一去不复返,白云千载空悠悠。 晴川历历汉阳树,芳草萋萋鹦鹉洲。 日暮乡关何处是?烟波江上使人愁。 ''' f = open("poetry.txt", "r+", encoding="utf-8") data = f.readlines() del data[2] f.seek(0) f.truncate() print(data) for i in data: f.write(i) f.close()
''' 9、有名为username.txt的文件,其内容格式如下,写一个程序,判断该文件中是否存在"alex", 如果没有,则将字符串"alex"添加到该文件末尾,否则提示用户该用户已存在; pizza alex egon ''' f = open("username.txt", "r+", encoding="utf-8") li = [] for line in f: li.append(line.strip()) if "alex" in li: print("有alex") else: f.seek(0, 2) f.write("\nalex") f.close()
''' 10、有名为user_info.txt的文件,其内容格式如下,写一个程序,删除id为100003的行; pizza,100001 alex, 100002 egon, 100003 ''' import os f1 = open("user_info.txt", "r", encoding="utf-8") f2 = open("user_info2.txt", "w", encoding="utf-8") for line in f1: li = line.strip().split(",") print(li) if li[1].strip() == "100003": continue else: f2.write(line) f1.close() f2.close() os.remove("user_info.txt") os.rename("user_info2.txt", "user_info.txt")
''' 11、有名为user_info.txt的文件,其内容格式如下,写一个程序,将id为100002的用户名修改为alex li; pizza,100001 alex, 100002 egon, 100003 ''' import os f1 = open("user_info.txt", "r", encoding="utf-8") f2 = open("user_info2.txt", "w", encoding="utf-8") for line in f1: li = line.strip().split(",") if li[1].strip() == "100002": li[0] = "alex li" line = ",".join(li) + "\n" f2.write(line) f1.close() f2.close() os.remove("user_info.txt") os.rename("user_info2.txt", "user_info.txt")
''' 12、写一个计算每个程序执行时间的装饰器; ''' import time def wrapper(func): def inner(): start = time.time() func() end = time.time() total = end - start print(func, "total run time is:", total) return inner @wrapper def func1(): time.sleep(1) @wrapper def func2(): time.sleep(2) func1() func2()
13、lambda是什么?请说说你曾在什么场景下使用lambda?
匿名函数。
''' 14、题目:写一个摇骰子游戏,要求用户压大小,赔率一赔一。 要求:三个骰子,摇大小,每次打印摇骰子数。 ''' import random while True: res = 0 count = 0 while count < 3: n = random.randint(1, 6) res += n count += 1 guess = int(input("压大还是压小大(1),小(2): ")) if guess == 1 and res > 9: print("压到了‘大’") elif guess == 2 and res <= 9: print("压到了‘小’") else: print("没压到~~~") print("点数为:", res)