首页 > 其他分享 >表达式与匿名函数

表达式与匿名函数

时间:2022-10-13 17:45:15浏览次数:54  
标签:函数 res 列表 匿名 l1 print 表达式

表达式和生成式

在python中,分支结构和for循环结构十分的常用,它们也有一些简化的版本。

三元表达式

分支结构if的一般用法:

name = input('输入你的大名')
if name =='leethon':
    print('handsome boy')
else:
    print('点个赞呗,大帅哥')

这样二选一的结构占了四行,不是很优雅,python提供了简洁的语法:

name = input('输入你的大名')
res = 'handsome boy' if name == 'leethon' else '点个赞呗,大帅哥'  # 三元表达式
print(res)

二选一的if-else结构被简化为了一行,十分的优雅。

这样的结构叫三元表达式,三元指,

一元:数据值if二元:判断条件else三元:数据值

如果判断条件成立则返回if左侧的数据值,如果判断条件不成立则返回else右侧的数据值。

列表生成式

如何对一个列表进行整体型的操作,如:

对列表[1, 2, 3, 4, 5]中的每个数字进行+1操作,以最普遍的for循环用法:

l1 = []
for num in [1, 2, 3, 4, 5]:
    l1.append(num + 1)
print(l1)  # [2, 3, 4, 5, 6]

但是python又给我们提供了更简洁的语法:

l1 = [num + 1 for num in [1, 2, 3, 4, 5]]
print(l1)  #  [2, 3, 4, 5, 6]

这个优雅快速获取新列表的语法叫列表生成器,通过遍历一个可以遍历的对象,对遍历对象的每个元素进行一定的操作,得到新的列表。

其语法结构的一般形式为

[表达式 for 变量名 in 可被遍历的对象]
执行顺序:
	1.for先行,将遍历值的第一个元素塞到变量名里面,
    1.for前面表达式的结果被作为新列表的第一个元素(注,这个表达式可以含for后的变量名)
    2.进入下一次for循环,遍历新值
    2.for前表达式的结果作为第二个元素传入列表
    以此类推
    
表达式中可含变量名的特点,使它可以对可遍历对象的的每个元素做一定的处理,再生成新的列表。
进阶例子
l1 = [[0] for _ in range(10)]
print(l1)
# [[0], [0], [0], [0], [0], [0], [0], [0], [0], [0]]
# 得到一个嵌套的列表

字典生成式

for循环有时会跟两个变量形成以下的结构:

any_dict = {'leethon': 'handsome', 'alex': 'small-handsome', 'lalisa': 'big-bella'}
for k, v in any_dict.items():
    print(k, v)
    
## 运行结果
leethon handsome
alex small-handsome
lalisa big-bella
##

# enumerate内置方法,类似于得到一个序号与值的二元组列表
for index, value in enumerate([1, 2, 3, 4, 5]):  
    print(index, value)
## 运行结果
0 1
1 2
2 3
3 4
4 5
##

我们也利用for跟两个变量的形式,来构筑字典生成式:

# 打印A-D的ASCII码对应
print({k: v for k, v in enumerate(['A', 'B', 'C', 'D'], start=65)})  # enumerate的start参数,表示序号开头
# {65: 'A', 66: 'B', 67: 'C', 68: 'D'}

字典生成式以{}为外壳,内部也是表达式加for循环的结构,for循环先执行,表达式作为for关键字的子代码后执行。表达式要为键值对的形式才得到字典。

集合生成式

如果{}内部的表达式不是k:v键值对的形式,而是单独一个表达式形式,则产生集合生成式

print({v for v in 'hello'})
# {'l', 'o', 'e', 'h'}  # 去重且无序

匿名函数及其应用

匿名函数指没有函数名的函数,无法通过名字找到它的代码,他可以代替如下的结构:

def func(a, b):
    return a+b

# 只传参和只返回,所有的表达式在return后写完的结构

匿名函数关键字lambda

lambda 形参:返回值  # lambda语法
代替上述代码写为:
lambda a, b: a+b

匿名函数的应用场景很小,因为代码不能被函数名找到,所以即用即丢。

它常常搭配一些需要传入函数实参的内置函数使用。

常见内置函数

  1. map() —— 映射

    map(函数, 可遍历对象) 指将遍历的元素挨个取出来做函数的形参,得到的返回值放到map工厂里,map工厂转换为列表的结果就是每个被函数处理好的元素组成的列表

    l1 = [1, 2, 3, 4, 5]
    '''如果用有名函数
    def func(a):
        return a + 1
    res = map(func,  l1)
    '''
    res = map(lambda x:x+1, l1)  # 而匿名函数这种简单又临时的函数很适合用在这里
    print(list(res))  # [2, 3, 4, 5, 6]
    """
    元素1经过匿名函数变成2,
    元素2经过匿名函数返回3
    以此类推
    最终res会接收一个迭代器,可以被for循环,所以可以被list()转换为列表
    """
    
  2. max()/min() —— 最大最小值

    # 简单的比较
    l1 = [11, 22, 33, 44]
    res = max(l1)  # 44
    
    # 依据映射关系比较
    d1 = {
        'leethon': 100,
        'jason': 8888,
        'lalisa': 99999999,
        'alex': 1000
    }
    # def func(a):  # 传键
    #     return d1.get(a)  # 返回字典的值
    # res = max(d1, key=func)  # key后面跟函数
    res = max(d1, key=lambda k: d1.get(k))  # 根据键的值来比较
    print(res)  # lalisa  # 但是返回的是键
    

    max根据映射关系比较的逻辑是:

    根据遍历元素映射后的值作依据比较,得到的结果是映射前原本的元素。

  3. reduce()

# reduce  传多个值,返回一个值
from functools import reduce  # 已经不是内置方法了,需要导入模块
l1 = [1, 2, 3, 4, 5]
res = reduce(lambda a, b: a * b, l1)  # 计算 ((((1+2)+3)+4)+5)
print(res)

标签:函数,res,列表,匿名,l1,print,表达式
From: https://www.cnblogs.com/Leethon-lizhilog/p/16788991.html

相关文章