Python推导式和匿名函数

三元表达式

三元表达式:

x=10
y=20
print(x if x>y else y)

列表推导式

列表推导式又名列表解析式

通过简明扼要的方式来创建列表,也可以使用if语句来控制创建列表

lt=[x for x in range(1,5)]
lt=[1,2,3,4]

通过if创建列表

lt=[x*y for x in range(1,5) if x>2 for y in range(1,4) if y<3]
print(lt)
相当于:
for x in range(1,5)
    if x > 2
        for y in range(1,4)
            if y < 3
                x*y

字典生成式

可以通过字典生成器的方式快速生成字典

#通过zip函数压缩生成
lt=['a','b','c','d']
lt2=[1,2,3,4]
z=zip(lt,lt2)
dic={x:j for x,j in z}
print(dic)

#或者直接通过生成式生成
dic={chr(x):x for x in range(97,101)}

字典生成式使用if...else
dic={chr(x):x*2 if x%2==1 else x for x in range(97,101) }
print(dic)

生成器

yield:

在函数中但凡出现yield关键字,再调用函数,就不会继续执行函数体代码,而是会返回一个值。

def yi():
    x=1
    while x<100:
        x += 1
        yield x


f=yi()
for i in f:
    print(i)

匿名函数

python 使用 lambda 来创建匿名函数。

所谓匿名,意即不再使用 def 语句这样标准的形式定义一个函数。

  • lambda 只是一个表达式,函数体比 def 简单很多。
  • lambda的主体是一个表达式,而不是一个代码块。仅仅能在lambda表达式中封装有限的逻辑进去。
  • lambda 函数拥有自己的命名空间,且不能访问自己参数列表之外或全局命名空间里的参数。
  • 虽然lambda函数看起来只能写一行,却不等同于C或C++的内联函数,后者的目的是调用小函数时不占用栈内存从而增加运行效率。

语法

lambda [arg1 [,arg2,.....argn]]:expression

匿名函数没有名字,使用一次就收回

c = lambda x,y,z: x*y*z
a=c(2,3,4)
print(a)

与内置函数的联动

匿名函数一般与max()、sorted()、filter()、map()方法联动

与max()联动

salary_dict = {
    'nick': 3000,
    'jason': 100000,
    'tank': 5000,
    'sean': 2000
}
a=max(salary_dict, key=lambda name:salary_dict[name])
print(a)

与min()联动

salary_dict = {
    'nick': 3000,
    'jason': 100000,
    'tank': 5000,
    'sean': 2000
}
a=min(salary_dict, key=lambda name:salary_dict[name])
print(a)

与sorted()联动

llt={'a':'2','b':'1','c':'3','d':'9','g':'5'}
ll=list(llt.items())
print(ll)
ll.sort(key= lambda i: i[1])
print(ll)
ll=sorted(ll ,key=lambda i:i[0])
print(ll)

filter()工作原理:

用于筛选

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

map()

  1. 首先将可迭代对象变成迭代器对象
  2. res=next(迭代器对象),将res当做参数传给第一个参数指定的函数,然后将该函数的返回值作为map()方法的结果之一。
原文地址:https://www.cnblogs.com/ledgua/p/11348627.html