python--总结之列表推导式&生成器

列表推导式

#列表推导式
# 旧的列表---》新的列表(不管是之前还是之后,都是一个列表,只是列表推导式会经过一些条件筛选后形成新的列表)
'''
1.列表推导式: 格式1[返回的东西 for 变量 in 旧列表]
             格式2[返回的东西 for 变量 in 旧列表 if 条件]
字典推导式
集合推导式

'''

#求出列表中人名长度小于等于3的元素,并添加到一个新列表
names=['tom','lily','abc','jack','steven','bob','q']
list1=[]
for name in names:
    if len(name)<=3:
        list1.append(name)
print(list1)
#用列表推导式的方法
#必须前后变量名相同,筛选后的每个元素赋值给第一个变量name
result=[name for name in names if len(name)<=3]
print(result)
'''
['tom', 'abc', 'bob', 'q']
['tom', 'abc', 'bob', 'q']
'''

#将1-20之间能被3整除,组成一个新的列表
result=[i for i in range(1,21) if i%3==0]
print(result)
'''
[3, 6, 9, 12, 15, 18]
'''

#元组第一个数字为0-5之间的偶数,第二个数字为0-5之间的奇数
#[(偶数,奇数),(),()]  [(0,1),(0,3),(0,5),(2,1),(2,3)]
newlist = [(x,y) for x in range(6) if x%2==0 for y in range(6) if y%2!=0]
print(newlist)
'''
[(0, 1), (0, 3), (0, 5), (2, 1), (2, 3), (2, 5), (4, 1), (4, 3), (4, 5)]
'''


#集合推导式
#旧集合--》新集合
set2={1,2,1,3,5,2,1,8,9,8,9,7}
new={x for x in set2 if x>5}
print(new)
'''
{8, 9, 7}
'''

#字典推导式
dict1={'a':'A','b':'B','c':'C','d':'C'}
print(dict1.items())
newdict={value:key for key,value in dict1.items()}
print(newdict)
'''
dict_items([('a', 'A'), ('b', 'B'), ('c', 'C'), ('d', 'C')])
{'A': 'a', 'B': 'b', 'C': 'd'}
'''

生成器

#定义生成器得方式一   圆括号

'''
通过列表推导式,我们可以直接创建一个列表
但是,受到内存的限制,列表容量肯定是有限的
而且,创建一个包含100万个元素的列表,不仅占用很大的存储空间
如果我们仅仅需要访问前面几个元素,那后面绝大多数元素占用的空间都白白浪费了
所以,如果列表元素可以按照某种算法推算出来,那我们是否可以在循环过程中不断推算出后续的元素呢?
这样就不必创建完整的list,从而节省大量的空间
在python中,这种一边循环一边计算的机制,称为生成器

'''
#列表推导式
newlist = [x*3 for x in range(20) if x<5]
print(newlist)#[0, 3, 6, 9, 12]

#生成器用圆括号表示,#大括号有可能是集合推导式也可能是字典推导式,方括号是列表推导式,圆括号是生成器
g=(x*3 for x in range(20) if x<5)
print(type(g))#<class 'generator'>

#得到元素的两种方式
print(g.__next__())
print(g.__next__())
print(next(g))
print(next(g))
'''
0
3
6
9
'''
print(next(g))

#下面一句超过了能取得范围
# print(next(g))
'''
Traceback (most recent call last):
  File "D:/pythonFile/hanshu/generatorr7/func03.py", line 31, in <module>
    print(next(g))
StopIteration
'''


#定义生成器得方式二   函数
#只要函数中出现yield关键字,说明这是个生成器而不是一个函数
'''
步骤:
1.定义一个函数,函数中使用yield关键字
2.调用函数,接收调用得结果
3.得到得结果就是生成器g
4.借助于next(g)/g.__next__()得到元素

'''
def func():
    n=0
    while True:
        n+=1
        yield n  #==>return n+暂停程序
        # 第一次到这他会返回n然后暂停自己,去执行print(g.__next__()),然后又回来继续这个while循环,实现n+=1
g=func()  #调用函数,函数返回一个生成器
print(g)

print(g.__next__())
print(next(g))
'''
<generator object func at 0x00000286E1B25AF0>
1
2
'''

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值