生成器,函数递归-练习

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}的形式

# 方法一: 字典生成式 + zip + for + 三元
li = []
with open('a.txt', 'rt', encoding='utf-8') as f:
    for line in f:
        res = line.strip().split()
        li.append({key: int(value) if value.isdigit() else value for key, value in zip(['name', 'sex', 'age', 'salary'], res)})
print(li)

# 方法二(难理解): 列表生成式 + 取值 + 字典生成式
with open('a.txt', 'rt', encoding='utf-8') as f:
    # line1 --> ['egon', 'male', '18', '3000']
    li = [{'name': line1[0], 'sex': line1[1], 'age': int(line1[2]), 'salary': int(line1[3])}
          for line1 in [line.strip().split() for line in f]]
print(li)

# 方法三: zip + 字典生成式 + 列表生成式 + zip
with open('a.txt', 'rt', encoding='utf-8') as f:
    li = [{key: int(value) if value.isdigit() else value for key, value in
           zip(['name', 'sex', 'age', 'salary'], line.strip().split())} for line in f]
print(li)

# 方法四: zip + 字典生成式 + 列表生成式 + dict()
# 小节: 基于方法三, 使用字典生成式, 它里面的key和value都没有变化. 这个时候, 我们使用的又是zip。所以我们可以使用dict()内置函数直接转化.(缺点: 不能把字典的value是年龄,薪资转化成int, 上面方法可以)
with open('a.txt', 'rt', encoding='utf-8') as f:
    li = [dict(zip(['name', 'sex', 'age', 'salary'], line.strip().split()))for line in f]
print(li)

2. 根据1得到的列表,取出所有人的薪资之和

li = [{'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'}]

# 方式一: for循环 + 累加
total_salaries = 0
for dic in li:
    salary = dic['salary']
    total_salaries += salary
print(total_salaries)

# 方式二: sum不加括号 + 生成器表达式
res = sum(dic.get('salary') for dic in li)
print(res)

# 方式三: reduce + lambda
# 注意: 由此我们可以得出结论,reduce开始阶段是计算两个的x和y的值。然后再计算y的值把值赋值给与前面的x的值进行累加。
from functools import reduce
res = reduce(lambda x, y: x + y.get("salary") if isinstance(x, int) else x.get("salary") + y.get('salary'), li)
print(res)

3. 根据1得到的列表,取出所有的男人的名字

li = [{'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'}]

res = [dic.get('name') for dic in li if dic.get('sex') != 'female']
print(res)

# 方式二: filter + lambda + 列表生成式
res = [dic.get("name") for dic in filter(lambda dic: dic.get('sex') == 'male', li)]
print(res)

4. 根据1得到的列表,将每个人的信息中的名字映射成首字母大写的形式

li = [{'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'}]

# 回顾知识:
'''
capitalize 将字符串的首字母变成大写
title      将字符串中的每个单词的首字母变成大写
'''
# 方法一: zip + 列表生成式 + 字典生成式 + 三元 + map + keys() + capitalize
res = [{key: value for key, value in zip(dic.keys(), map(lambda k: dic[k].capitalize() if k == 'name' else dic[k], dic))} for dic in li]
print(res)

# 方式二: map + 字典生成式 + capitalize + items()
res = map(lambda dic: {key: value.capitalize() if key == 'name' else value for key, value in dic.items()}, li)
print(list(res))

5. 根据1得到的列表,过滤掉名字以a开头的人的信息

li = [{'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}]

res = [{key: value for key, value in dic.items()}for dic in li if not dic.get('name').startswith('a')]
print(res)

# 方法二: filter + lambda + 字典生成式 + items() + startswith + if
res = filter(lambda dic: {key: value for key, value in dic.items() if not (key == 'name' and value.startswith('a'))}, li)
print(list(res))

6. 使用递归打印斐波那契数列(前两个数的和得到第三个数,如:1、2、3、5、8、13、21、34)

# fibonacci 斐波那契
# 需要两个数 去递推第三个数, 每次保留第二个数和他们的和
left_num = 0
right_num = 1
while left_num < 10000:
    print(left_num, end=' ')  # 0 1 1 2 3 5 8 13 21 34 55 89 144 233 377 610 987 1597 2584 4181 6765


    # 0,           1    =   0,             0 + 1
    # 1,           1    =   1,             1 + 0
    # 1,           2    =   1,             1 + 1
    # 2,           3    =   2,             2 + 1
    right_num, left_num = left_num, left_num + right_num


def fibonacci(left_num, right_num, stop=10000):
    if left_num > stop:
        return left_num

    print(left_num, end=' ')
    fibonacci(right_num, left_num+right_num)

fibonacci(0, 1)

7. 一个嵌套很多层的列表,如l=[1,2,[3,[4,5,6,[7,8,[9,10,[11,12,13,[14,15]]]]]]],用递归取出所有的递归取值

def recusive_values(li: list):
    for item in li:
        if isinstance(item, list):
            recusive_values(item)
        else:
            print(item, end=' ')

li = [1,2,[3,[4,5,6,[7,8,[9,10,[11,12,13,[14,15]]]]]]]
recusive_values(li)  # 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15
posted @ 2020-03-25 21:58  给你加马桶唱疏通  阅读(142)  评论(0编辑  收藏  举报