1、文件内容如下,标题为:姓名,性别,年纪,薪资
[root@Surpass day20]# cat user.txt egon male 18 3000 alex male 38 30000 wupeiqi female 28 20000 yuanhao female 28 10000
实现:
f = open('user.txt', mode='r', encoding='utf-8') g = (line.strip(' ').split(' ') for line in f) user_list = [{k:v for k,v in zip(['name','sex','age','salary'],item)} for item in g]
##
[{'name': 'egon', 'sex': 'male', 'age': '18', 'salary': '3000'},
{'name': 'alex', 'sex': 'male', 'age': '38', 'salary': '30000'},
{'name': 'wupeiqi', 'sex': 'female', 'age': '28', 'salary': '20000'},
{'name': 'yuanhao', 'sex': 'female', 'age': '28', 'salary': '10000'}
2、对列表1进行取值操作
#2 根据1得到的列表,取出薪资最高的人的信息 #3 根据1得到的列表,取出最年轻的人的信息 res = max(user_list,key=lambda item:item['salary']) print(res) #{'name': 'alex', 'sex': 'male', 'age': '38', 'salary': '30000'} res = min(user_list,key=lambda item:item['age']) print(res) #{'name': 'egon', 'sex': 'male', 'age': '18', 'salary': '3000'}
3、对列表names=['egon','alex_sb','wupeiqi','yuanhao']进行操作
#4、将names=['egon','alex_sb','wupeiqi','yuanhao']中的名字全部变大写 #5、将names=['egon','alex_sb','wupeiqi','yuanhao']中以sb结尾的名字过滤掉,然后保存剩下的名字长度 names_new = [(lambda obj:obj.upper())(item) for item in names] print(names_new) #['EGON', 'ALEX_SB', 'WUPEIQI', 'YUANHAO'] names_new = list(filter(lambda item: not item.endswith('sb'), names)) print(names_new) #['egon', 'wupeiqi', 'yuanhao']
4、对a.txt文件进行操作
#6、求文件a.txt中最长的行的长度(长度按字符个数算,需要使用max函数) #7、求文件a.txt中总共包含的字符个数?思考为何在第一次之后的n次sum求和得到的结果为0?(需要使用sum函数) f = open('user.txt', mode='r', encoding='utf-8') res = len(max(f,key=lambda item:len(item))) print(res) f.close() #24 f = open('user.txt', mode='r', encoding='utf-8') res = sum((lambda item:len(item))(line) for line in f) print(res) f.close() #85 f = open('user.txt', mode='r', encoding='utf-8') res = sum((lambda item:len(item))(line) for line in f) res2 = sum((lambda item:len(item))(line) for line in f) res3 = sum((lambda item:len(item))(line) for line in f) print(res) print(res2) print(res3) f.close() #答:因为第一次操作后,文件指针移到了文件末尾,再通过for line in f取值,没有值了,所以之后的n次结果全为0
5、思考题
with open('a.txt') as f: g=(len(line) for line in f) print(sum(g)) #为何报错? #答:生成器g是对文件f进行取值,经过with open后,文件对象f已经被释放,sum(g)取不到值,因此会报错。 正确的做法应该是: f = open('a.txt') g=(len(line) for line in f) print(sum(g)) f.close()
6、对shopping.txt文件进行操作
mac,20000,3 lenovo,3000,10 tesla,1000000,10 chicken,200,1
#求总共花了多少钱? #打印出所有商品的信息,格式为[{'name':'xxx','price':333,'count':3},...] #求单价大于10000的商品信息,格式同上 f = open('shopping.txt', mode='r', encoding='utf-8') res = sum((lambda obj: int(obj[1]) * int(obj[2]))(item.strip(' ').split(',')) for item in f) print('一共消费{}元'.format(res)) f.close() #一共消费10090200元 f = open('shopping.txt', mode='r', encoding='utf-8') goods_info = [{k: v for k, v in zip(['name', 'price', 'count'], line.strip(' ').split(','))} for line in f] print(goods_info) f.close() #[{'name': 'mac', 'price': '20000', 'count': '3'}, {'name': 'lenovo', 'price': '3000', 'count': '10'}, {'name': 'tesla', 'price': '1000000', 'count': '10'}, {'name': 'chicken', 'price': '200', 'count': '1'}] f = open('shopping.txt', mode='r', encoding='utf-8') goods_info = [{k: v for k, v in zip(['name', 'price', 'count'], line.strip(' ').split(','))} for line in f] res = list(filter(lambda item: int(item['price']) > 10000, goods_info)) print(res) f.close() #[{'name': 'mac', 'price': '20000', 'count': '3'}, {'name': 'tesla', 'price': '1000000', 'count': '10'}]
7、思考题,判断下列说法是否正确
题目1: 1、应该将程序所有功能都扔到一个模块中,然后通过导入模块的方式引用它们 (F) 2、应该只将程序各部分组件共享的那一部分功能扔到一个模块中,然后通过导入模块的方式引用它们 (F) 题目2: 运行python文件与导入python文件的区别是什么?
答:(1)运行python文件。打开文件——>将内容从硬盘读到内存-->python解释器读取运行;
(2)导入python文件。运行python文件-->产生文件的的名称空间,将文件运行过程中产生的名字都丢到文件的名称空间中-->在当前文件中产生一个名字,该名字指向之前产生的名称空间 运行的python文件产生的名称空间何时回收,为什么?
答:程序结束后。 导入的python文件产生的名称空间何时回收,为什么?
答:引用结束后。
8、二分法取值
使用递归函数来实现二分法
list_obj = [-3,4,7,10,13,21,43,77,89] find_num = 10 def bindary_search(list_obj,find_num): print(list_obj) mid_index = len(list_obj) // 2 if not list_obj: print('该值不在此列表中') return if find_num > list_obj[mid_index]: list_obj = list_obj[mid_index+1:] bindary_search(list_obj,find_num) elif find_num < list_obj[mid_index]: list_obj = list_obj[:mid_index] bindary_search(list_obj,find_num) else: print('find it!') bindary_search(list_obj,find_num)
9、使用递归函数,来实现查看文件夹的文件大写
[root@Surpass day20]# python practice_2.py 请输入目标文件夹:/practice/ 文件夹的大小为:9898 [root@Surpass day20]# ll /practice/ 总用量 32 -rw-r--r--. 1 root root 0 3月 13 09:00 11.py -rw-r--r--. 1 root root 158 3月 13 09:00 2.py -rw-r--r--. 1 root root 1954 3月 12 20:01 3.py -rw-r--r--. 1 root root 31 3月 13 12:17 3.txt drwxr-xr-x. 2 root root 26 3月 13 14:53 day10 drwxr-xr-x. 2 root root 27 3月 19 07:58 day15 drwxr-xr-x. 2 root root 141 3月 22 17:46 day16 drwxr-xr-x. 2 root root 166 3月 24 09:00 day17 drwxr-xr-x. 2 root root 233 3月 26 08:34 day18 drwxr-xr-x. 2 root root 77 3月 25 19:32 day19 drwxr-xr-x. 2 root root 112 3月 26 17:30 day20 -rwxr-xr-x. 1 root root 877 3月 16 16:51 file_copy.py -rw-r--r--. 1 root root 48 3月 13 11:06 test1.py -rw-r--r--. 1 root root 445 3月 13 12:19 test2.py -rw-r--r--. 1 root root 2114 3月 12 19:37 test3.py -rw-r--r--. 1 root root 3489 3月 4 16:44 timg.jpeg