推导式

十二、推导式

1、推导式(列表推导式)

用一行循环判断遍历出一系列数据的方式

注:推导式在使用时只能使用for循环和if判断,if判断只能式单项判断

推导式得三种形式:列表推导式、集合推导式、字典推导式

(1)普通推导式:通过 [] 和 for 形式构成

(2)带有判断的推导式:通过 [] for if 形式构成

(3)多循环推导式:通过 [] for for … 形式构成

(4)带有判断条件的循环推导式:通过 [] for for if 的形式构成

列表推导式,获取的数据在列表中

lst = [1, 2, 3, 4, 5, 6, 7, 8, 9]
lst_new = []
for i in range(1, 51):
    lst_new.append(i)
print(lst_new)
# 基本语法
lst = [i for i in range(1, 51)]
print(lst)

# 普通推导式
lst = [1, 2, 3, 4]
lst = [i << i for i in lst]
print(lst)

lst = [1, 2, 3, 4, 5, 6, 67, 7, 8]
lst_new = []
for i in lst:
    if i % 2 == 0:
        lst_new.append(i)
print(lst_new)
# 带有判断的推导式
lst = [i for i in lst if i % 2 == 0]
print(lst)

list1 = ['a', 'b', 'c']
list2 = ['x', 'y', 'z']
lst_new = []
for i in list1:
    for j in list2:
        res = i + "♥" + j
        lst_new.append(res)
print(lst_new)
# 多循环推导式
lst = [i + "♥" + j for i in list1 for j in list2]
print(lst)

lst_new = []
for i in list1:
    for j in list2:
        if list1.index(i) == list2.index(j):
            res = i + "♥" + j
            lst_new.append(res)
print(lst_new)
# 带有判断条件的多循环推导式
lst = [i + "♥" + j for i in list1 for j in list2 if list1.index(i) == list2.index(j)]
print(lst)

2、集合推导式

集合推导式,获取的数据在集合中并自动去重

三目运算可应用在推导式中

listvar = [
    {"name": "jack", "age": 18, "money": 10000},
    {"name": "eric", "age": 19, "money": 5100},
    {"name": "pdd", "age": 20, "money": 4800},
    {"name": "asd", "age": 21, "money": 2000},
    {"name": "erick", "age": 180, "money": 20}
]

setvar = set()
for i in listvar:
    if 18 <= i["age"] <= 21 and 5000 <= i["money"] <= 5500:
        res = "尊贵VIP卡老" + i["name"][0]
    else:
        res = "黄金VIP卡老" + i["name"][0]
    setvar.add(res)
print(setvar)

setvar = {"尊贵VIP卡老" + i["name"][0] if 18 <= i["age"] <= 21 and 5000 <= i["money"] <= 5500 else "黄金VIP卡老" + i["name"][0] for i in listvar}
print(setvar)

3、字典推导式

字典推导式,获取的数据在字典

内置方法:

​ enumerate:枚举,将索引和iterable中的值,一个一个拿出来配对组成元组放入迭代器中

​ 参数:可迭代性数据;start:设置开始的索引,默认从0开始

​ 返回值:迭代器

​ zip:将多个iterable中的值,一个一个拿出来配对组成元组放入迭代器中

​ 参数:可迭代性数据;

​ 返回值:迭代器

​ 注:不能匹配多余值会被舍弃

注:三目运算可应用在推导式中

# enumerate
lst = ["a", 'b', 'c', 'd', 'e', 'f', 'g', 'h']
it = enumerate(lst)
it = enumerate(lst, start=5)
from collections import Iterator, Iterable
res = isinstance(it, Iterator)
print(res)

for i in range(3):
    res = next(it)
    print(res)

res = list(it)
print(res)

dic = {k: v for k, v in enumerate(lst, start=1)}
print(dic)

# zip
from collections import Iterator,Iterable
lst1 = ['a', 'b', 'c', 'd', 'e']
lst2 = ['1', '2', '3', '4']
lst3 = ['+', '-', '/']

it = zip(lst1, lst2)
print(isinstance(it, Iterator))
print(list(it))

dic = {k: v for k, v in zip(lst1, lst2)}
print(dic)

dic = dict(zip(lst1, lst2))
print(dic)

十三、生成器

生成器本质是迭代器,允许自定义逻辑的迭代器

迭代器和生成器的区别:迭代器本身是系统内置的,不能被重写;生成器是用户自定义的,可以重写迭代逻辑

生成器的两种创建方式:

(1)生成器表达式:里面用推导式,外面用圆括号

(2)生成器函数:用def定义,里面含有yield

1、生成器表达式

推导式 + 圆括号

from collections import Iterator
gen = (i * 2 for i in range(1, 5))
print(gen)
print(isinstance(gen, Iterator))

ret = next(gen)
print(ret)

gen = (i * 2 for i in range(1, 5))
for i in gen:
    print(i)
gen = (i * 2 for i in range(1, 5))
for i in range(2):
    ret = next(gen)
    print(ret)

res = list(gen)
print(res)

2、生成器函数

yield类似return

​ 共同点:执行到这句话都会把值返回出去

​ 不同点:yield每次返回时,会记住上次离开时执行的位置,下次在调用生成器,会从上次执行的位置往下继续执行;而return直接终止函数,每次从头调用

​ yield from : 将一个可迭代对象变成一个迭代器返回

写法:yield 6 和 yield(6) 推荐使用前者,避免记混

send方法:send 可以发送数据,发送给上一个yield

​ send与next区别:

​ next 只能取值

​ send 不但能取值,还能发送值

​ send需要注意:

​ 第一个send不能给yield传值默认只能写None

​ 最后一个yield接受不到send的发送值

初始化生成器函数 -> 生成器对象 -> 简称生成器

# 语法
from collections import Iterator
def mygen():
    print("one")
    yield 1
    print("two")
    yield 2
    print("three")
    yield 3
gen = mygen()
print(isinstance(gen, Iterator))
res = next(gen)
print(res)
res = next(gen)
print(res)
res = next(gen)
print(res)

# for + next
def mygen():
    for i in range(1, 101):
        yield "我的球衣号码是%s"%(1)
gen = mygen()
for i in range(5):
    ret = next(gen)
    print(ret)

for i in range(3):
    res = next(gen)
    print(res)

# send传值
def mygen():
    print("start")
    ret = yield 111
    print(ret)

    ret = yield 222
    print(ret)

    ret = yield 333
    print(ret)
    print("end")

gen = mygen()
val = gen.send(None)
print(val)
val = gen.send(444)
print(val)
val = gen.send(555)
print(val)

# yield from
def mygen():
    lst = ['a', 'b', 'c']
    yield from lst
gen = mygen()
print(next(gen))
print(next(gen))
print(next(gen))
  • 2
    点赞
  • 13
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
Python推导是一种简洁的语法糖,可以从一个数据序列构建另一个新的数据序列。常见的推导包括列表推导、字典推导和集合推导。列表推导可以通过对一个列表进行迭代和筛选操作,生成一个新的列表。字典推导可以通过对一个字典进行迭代操作,生成一个新的字典。而集合推导则可以通过对一个集合进行迭代和筛选操作,生成一个新的集合。推导在数据处理场景中非常常见,并可以大大简化代码的编写和阅读。如果你想了解更多关于推导的语法和用法,请参考引用和引用中提供的链接。<span class="em">1</span><span class="em">2</span><span class="em">3</span> #### 引用[.reference_title] - *1* [Python推导简单示例【列表推导、字典推导与集合推导】](https://download.csdn.net/download/weixin_38708361/12865890)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v92^chatsearchT0_1"}}] [.reference_item style="max-width: 50%"] - *2* *3* [Python 之推导](https://blog.csdn.net/iprobobo/article/details/123582135)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v92^chatsearchT0_1"}}] [.reference_item style="max-width: 50%"] [ .reference_list ]

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值