day20---作业

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('\n').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('\n').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('\n').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('\n').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

猜你喜欢

转载自www.cnblogs.com/surpass123/p/12575121.html