# 1、文件内容如下,标题为:姓名,性别,年纪,薪资
# egon male 18 3000
# alex male 38 30000
# wupeiqi female 28 20000
# yuanhao female 28 10000
#
# 要求:
# 从文件中取出每一条记录放入列表中,
# 列表的每个元素都是{'name':'egon','sex':'male','age':18,'salary':3000}的形式
'''
[
{'name':'egon','sex':'male','age':18,'salary':3000},
]
'''
# 格式化数据
def add_data():
# 1) 打开db.txt文件,将所有用户的数据读取出来
# 方式一:
# user_list = []
with open('db.txt', 'r', encoding='utf-8') as f:
# 方式一
# for line in f:
# name, sex, age, salary = line.strip().split(' ')
# user_list.append(
# {'name': name, '': sex, 'age': age, 'salary': salary}
# )
# 方式二: 一行代码实现
# [[], [], [], []]
# line2 ---> []
user_list = [
{'name': line2[0], 'sex': line2[1], 'age': line2[2], 'salary': line2[3]}
for line2 in
[line.strip().split(' ') for line in f]
]
# print(user_list)
return user_list
user_list = add_data()
# [{'name': 'egon', 'sex': 'male'}, {}]
# 2 根据1得到的列表,取出所有人的薪资之和
# print(sum((int(user.get('salary')) for user in user_list))) # 63000
# 3 根据1得到的列表,取出所有的男人的名字
# res = filter(lambda user_dict: user_dict.get('sex') == 'male', user_list)
# print(list(res))
# 4 根据1得到的列表,将每个人的信息中的名字映射成首字母大写的形式
# map
# ['egon', 'alex', 'wupeiqi', 'yuanhao']
# -> e , a, w, y --> Egon , Alex, Wupeiqi, Yuanhao
# 方式一:
# res = map(lambda x:x.get('name')[0].upper() + x.get('name')[1:], user_list)
# print(list(res))
# 方式二:
# str.capitalize()字符串的内置方式,可以将字符串中的首字母改为大写
# x.get('name').capitalize() --> name {'name': name, 'sex': x.get('sex'), 'age': x.get('age')}
# res = map(lambda x:
# {'name': x.get('name').capitalize(), 'sex': x.get('sex'), 'age': x.get('age'), 'salary': x.get('salary')},
# user_list
# )
# print(list(res))
# 5 根据1得到的列表,过滤掉名字以a开头的人的信息
# names = filter(lambda x: not x.get('name').startswith('a'), user_list)
# print(list(names))
# 6 使用递归打印斐波那契数列(前两个数的和得到第三个数,如:0 1 1 2 3 5 8 13 ...)
# 0 1 1 2 3 5 8 13 21
# 普通版本
'''
a = 0 # 1 1 2 3
b = 1 # 1 2 3 5
# 斐波那契数列的最大值是 1000 以内
# 1)循环获取a的值,a < 1000
while a < 1000:
# 0 1
print(a, end=' ')
# a, b ---> 1, 1
# a, b ---> 1, 2
# a, b ---> 2, 3
# a, b ---> 3, 5
a, b = b, a + b
'''
# 递归版
def func(a, b, stop):
# a ---> b --> 1, b ---> a + b ---> 1
'''
:param a: 初始值0 --->
:param b: 初始值1 --->
:param stop: 斐波那契数列最大值
:return:
'''
# a --> 0, b --> 1
if a > stop:
# 直到a的值 大于 stop的值,开始回溯
return
print(a, end=' ')
# 原理与普通版一样
func(b, a + b, stop)
# func(0, 1, 1000)
# 7 一个嵌套很多层的列表,如l=[1,2,[3,[4,5,6,[7,8,[9,10,[11,12,13,[14,15]]]]]]],用递归取出所有的值
l = [1, 2, [3, [4, 5, 6, [7, 8, [9, 10, [11, 12, 13, [14, 15]]]]]]]
def get_value(l):
# 循环列表
for i in l:
# 若类型不是列表,则递归调用
if type(i) is list:
get_value(i)
else:
print(i)
# get_value(l)
# # 选做作业:同昨天
# 生成器 ---> 内部实现原理
# def add(n, i):
# return n + i
#
#
# def test():
# for i in range(4):
# yield i
#
#
# g = test()
#
# for n in [1, 10]:
# g = (add(n, i) for i in g)
#
# res = list(g)
#
# print(res)
# 选做题,下周讲