三元表达式、列表、字典生成式和匿名函数

发布时间 2023-12-05 21:48:41作者: JessicaJJmm

一、三元表达式

1、引入

比价两个数的大小,正常函数写法

def my_max(a, b):
    if a > b:
        return a
    else:
        return b
my_max(1, 2)

2、三元表达式写法

def my_max(a, b):
    return a if a > b else b

res=my_max(1, 2)
print(res)

3、语法结构:
条件成立返回if前面的值 if 条件 else 条件不成立返回else后面的值
三元表达式的使用场景:只有当需求功能是二选一的情况下,才使用三元表达式

复制代码
res = '干饭' if 2 > 1 else '不干饭'
print(res)

#还可以支持嵌套
is_beautiful = True
res = '干饭' if 1 > 2 else '学习' if False else '喜欢' if is_beautiful == True else '不喜欢'
print(res)
复制代码

只要条件成立就返回对应的值

三元表达式解题案例:

输入一个列表 arr,返回元素值是元素下标的倍数的元素个数。
列表的下标从 0 开始。
print(sum([1 if x==0 or (i>0 and x%i==0) else 0 for i,x in enumerate(arr)]))

二、列表生成式

python内置的非常简单却强大的用来创建list的生成式,是一种灵活快速的生成列表的方式
variable =[out_exp for var in iterable if condition]

# out_exp:表达式
# for var in iterable:循环
# if condition 判断

1、引入

复制代码
name_list = ['kevin', 'tank', 'tony', 'jerry']
# 1. 给列表中的所以名称加一个后缀_DSB
# 2. 定义一个空列表用来存储拼接之后的值
new_name_list = []

# 3. 循环列表
for name in name_list:
    # res = '%s_DBS' % name
    # res = name +'_DSB'
    new_name_list.append('%s_DBS' % name)

print(new_name_list)
复制代码

2、列表生成式写法

name_list = ['kevin', 'tank', 'tony', 'jerry']
res = [name+'_DSB' for name in name_list]
print(res)

3、给列表中的所有名称都加一个后缀_DSB, 除了jerry不加

name_list = ['kevin', 'tank', 'tony', 'jerry']
for name in name_list:
    if name != 'jerry':
        new_name_list.append('%s_DSB' % name)

print(new_name_list)

列表生成式写法

复制代码
name_list = ['kevin', 'tank', 'tony', 'jerry']
# res = [name+'_DSB' for name in name_list if name != 'jerry']
res = ['%s_DSB' % name if name != 'jerry' else name  for name in name_list]
print(res)

alist = [i   if  i%2   esle  1  for  i  in range(10)]

print(alist)

[' ', 1, ' ', 3, ' ', 5, ' ', 7, ' ', 9]
复制代码

三、字典生成式

字典生成式又叫字典推导式

字典生成式(Dictionary Comprehension)是列表推导式(List Comprehension)的扩展,它们的语法结构非常相似

语法格式

1
{key_expression: value_expression for item in iterable if condition}

其中:

  • key_expression表示字典键的表达式,用于生成字典中的键。
  • value_expression表示字典值的表达式,用于生成字典中对应键的值。
  • item是迭代的元素,可以是一个变量名或者是多个变量名的结构(比如元组解包)。
  • iterable是可迭代对象,例如列表、元组、集合、字符串等。
  • if condition是可选的条件表达式,用于对迭代的元素进行筛选。只有满足条件的元素才会被包含在生成的字典中。

1、enumerate  枚举

循环enumerate方法可以得到两个值:索引 和 元素

列表使用 enumerate方法

seasons = ['Spring', 'Summer', 'Fall', 'Winter']
l = list(enumerate(seasons))
print(l)
 
[(0, 'Spring'), (1, 'Summer'), (2, 'Fall'), (3, 'Winter')]

 

字典使用enumerate方法

dict = {'one': 1, 'two': 2, 'three': 3}
for i, j in enumerate(dict):
    print(i, j)
 
0 one
1 two
2 three

 

2、字典生成式

将列表里面的元素转换成字典,kevin除外

l = ['kevin', 'tank', 'tony', 'jerry']
res = {i: j for i, j in enumerate(l) if j != 'kevin'}
print(res)

/usr/local/bin/python3.6 /Users/sanpangdan/Desktop/python_fullstack/day16.py
{1: 'tank', 2: 'tony', 3: 'jerry'}

案例1

# 将一个字典中的键值对进行交换,生成一个新的字典。
# 示例输入:{'a': 1, 'b': 2, 'c': 3}
# 示例输出:{1: 'a', 2: 'b', 3: 'c'}
 
d1 = {'a': 1, 'b': 2, 'c': 3}
d2 =  {d1.get(char): char for char in d1}
print(d2)

 

案例2:v表达式嵌套列表生成式

# 将一个列表中的元素按照长度进行分组,生成一个字典,其中键为长度,值为对应长度的元素列表。
# 示例输入:['apple', 'banana', 'orange', 'pear', 'kiwi']
# 示例输出:{5: ['apple'], 6: ['banana', 'orange'], 4: ['pear','kiwi']}
 
lst = ['apple', 'banana', 'orange', 'pear', 'kiwi']
 
new_dict = {len(item): [x for x in lst if len(x) == len(item)] for item in lst}
 
print(new_dict)

 

关键之处

v的表达式使用了列表生成式 [x for x in lst if len(x) == len(item)] 满足长度和k相等的条件都留下做列表元素

四、集合生成式

l = ['kevin', 'tank', 'tony', 'jerry']
res = {i for i, j in enumerate(l)}
print(res)

{0, 1, 2, 3}

五、匿名函数

1、没有名字的函数

之前使用def关键字定义的函数都是有名函数,有名字的函数

复制代码
语法格式:
    lambda 形参:返回值

res = lambda x: x+1

# res(1)
# print(res(1))
print((lambda x: x +1)(2))

# 有什么使用场景:他一般不会单独使用,会配合几个常见的内置函数使用=
复制代码