匿名函数


Python从入门到放弃完整教程目录:https://www.cnblogs.com/nickchen121/p/10718112.html

一、有名函数

我们之前定的函数都是有名函数,它是基于函数名使用。

def func():
    print('from func')


func()
func()
func()
print(func)
from func
from func
from func
<function func at 0x10518b268>

二、匿名函数

匿名函数,他没有绑定名字,使用一次即被收回,加括号既可以运行。

lambda x, y: x+y
<function __main__.<lambda>(x, y)>
res = (lambda x, y: x+y)(1, 2)
print(res)
3

三、与内置函数联用

匿名函数通常与max()、sorted()、filter()、sorted()方法联用。

salary_dict = {
    'nick': 3000,
    'jason': 100000,
    'tank': 5000,
    'sean': 2000
}

1.如果我们想从上述字典中取出薪资最高的人,我们可以使用max()方法,但是max()默认比较的是字典的key。

  1. 首先将可迭代对象变成迭代器对象
  2. res=next(迭代器对象),将res当做参数传给key指定的函数,然后将该函数的返回值当做判断依据
salary_dict = {
    'nick': 3000,
    'jason': 100000,
    'tank': 5000,
    'sean': 2000
}

print(f"max(salary_dict): {max(salary_dict)}")


def func(k):
    return salary_dict[k]


print(f"max(salary_dict, key=func()): {max(salary_dict, key=func)}")
# 'nick', v1 = func('nick')
# 'jason', v2 = func('jason')
# 'tank', v3 = func('tank')
# 'sean', v4 = func('sean')


print(
    f"max(salary_dict, key=lambda name: salary_dict[name]): {max(salary_dict, key=lambda name: salary_dict[name])}")
max(salary_dict): tank
max(salary_dict, key=func()): jason
max(salary_dict, key=lambda name: salary_dict[name]): jason

2.如果我们想对上述字典中的人,按照薪资从大到小排序,可以使用sorted()方法。

sorted()工作原理:

  1. 首先将可迭代对象变成迭代器对象
  2. res=next(迭代器对象),将res当做参数传给第一个参数指定的函数,然后将该函数的返回值当做判断依据。
lis = [1, 3, 2, 5, 8, 6]
sorted(lis)
print(f"lis: {lis}")
print(f"sorted(lis,reverse=True): {sorted(lis,reverse=True)}")
lis: [1, 3, 2, 5, 8, 6]
sorted(lis,reverse=True): [8, 6, 5, 3, 2, 1]
salary_dict = {
    'nick': 3000,
    'jason': 100000,
    'tank': 5000,
    'sean': 2000
}

print(
    f"sorted(salary_dict, key=lambda name: salary_dict[name]): {sorted(salary_dict, key=lambda name: salary_dict[name])}")
sorted(salary_dict, key=lambda name: salary_dict[name]): ['sean', 'nick', 'tank', 'jason']

3.如果我们想对一个列表中的某个人名做处理,可以使用map()方法。

map()工作原理:

  1. 首先将可迭代对象变成迭代器对象
  2. res=next(迭代器对象),将res当做参数传给第一个参数指定的函数,然后将该函数的返回值作为map()方法的结果之一。

name_list = ['jason', 'tank', 'sean']

res = map(lambda name: f"{name} sb", name_list)
print(f"list(res): {list(res)}")
list(res): ['jason sb', 'tank sb', 'sean sb']

4.如果我们想筛选除名字中含有'sb'的名字,我们可以使用filter()方法。

filter()工作原理:

  1. 首先将可迭代对象变成迭代器对象
  2. res=next(迭代器对象),将res当做参数传给第一个参数指定的函数,然后filter会判断函数的返回值的真假,如果为真则留下。
name_list = ['nick', 'jason sb', 'tank sb', 'sean sb']

filter_res = filter(lambda name: name.endswith('sb'), name_list)
print(f"list(filter_res): {list(filter_res)}")
list(filter_res): ['jason sb', 'tank sb', 'sean sb']

四、自定义sorted方法

# 不太熟悉的同学不要看(有兴趣的可以看一看)
def sorted(iter, key=None, reverse=None):
    iter.sort()

    if key:
        # key 是一个函数对象
        lt = []
        lt2 = []
        for i in iter:
            res = key(i)
            lt.append(res)
            lt2.append(i)
        lt.sort()

        lt3 = []
        for i in lt:
            for j in lt2:
                if j[1] == i:
                    lt3.append(j)

        if reverse:
            lt3.reverse()
        return lt3

    if reverse:
        iter.reverse()
    return iter


salary_list = list(salary_dict.items())
print(salary_list) # [('nick', 3000), ('jason', 100000), ('tank', 5000), ('sean', 2000), ('z', 1000)]
print(sorted(salary_list, key=lambda i: i[1],
             reverse=None))  # [('sean', 2000), ('nick', 3000), ('tank', 5000), ('jason', 100000)]

五、习题

'''
1. 文件内容如下,标题为:姓名,性别,年纪,薪资

​​```python
姓名,性别,年纪,薪资
nick male 18 3000
ajson male 38 30000
sean female 28 20000
tank female 28 10000

要求:
从文件中取出每一条记录nick male 18 3000放入列表中,
列表的每个元素都是{'name':'nick','sex':'male','age':18,'salary':3000}的形式

  1. 根据1得到的列表,取出薪资最高的人的信息
  2. 根据1得到的列表,取出最年轻的人的信息
  3. 根据1得到的列表,将每个人的信息中的名字映射成首字母大写的形式
  4. 根据1得到的列表,过滤掉名字以a开头的人的信息

'''

user_info_list = []
with open('user_info.txt', 'r', encoding='utf8') as fr:
for user_info in fr: # type:str

print(user_info.strip().split(' '))

user_info_split = user_info.strip().split(' ')
name, sex, age, salary = user_info_split
user_info_dict = {'name': name, 'sex': sex, 'age': age, 'salary': salary}

user_info_dict =

user_info_dict =

user_info_list.append(user_info_dict)

for i in user_info_list:

print(i)

'''

  1. 根据1得到的列表,取出薪资最高的人的信息
  2. 根据1得到的列表,取出最年轻的人的信息
  3. 根据1得到的列表,将每个人的信息中的名字映射成首字母大写的形式
  4. 根据1得到的列表,过滤掉名字以a开头的人的信息

[
{'name': 'nick', 'sex': 'male', 'age': '18', 'salary': '3000'}
{'name': 'ajson', 'sex': 'male', 'age': '38', 'salary': '30000'}
{'name': 'sean', 'sex': 'female', 'age': '28', 'salary': '20000'}
{'name': 'tank', 'sex': 'female', 'age': '28', 'salary': '10000'}
]
'''

1.

print(max(user_info_list, key=lambda item: item['salary']))
max_salary = 0
user_info_str = ''
for user_info in user_info_list:
if int(user_info['salary']) > max_salary:
max_salary = int(user_info['salary'])
user_info_str = user_info
print(1, user_info_str)

2.

print(min(user_info_list, key=lambda item: item['age']))

3.

print(list(map(lambda item: item['name'].title(), user_info_list)))

4.

print(list(filter(lambda item: not(item['name'].startswith('a')), user_info_list)))

for user_info in user_info_list: # type:dict
if user_info['name'].startswith('a'):
user_info_list.remove(user_info)
print(user_info_list)


posted @ 2019-04-29 23:34  B站-水论文的程序猿  阅读(2577)  评论(0编辑  收藏  举报