从列表推导式到生成器、迭代器

#列表推导式
names=['lilly','tom','jimmy','andy','da']
result=[name for name in names if len(name)>3]
print(result)

result1=[name.capitalize() for name in names if len(name)>3]    #s首字母大写
print(result1)

result2=[i for i in range(1,101) if i%3==0 and i%5==0]
print(result2)

# ['lilly', 'jimmy', 'andy']
# ['Lilly', 'Jimmy', 'Andy']
# [15, 30, 45, 60, 75, 90]

result3=[(x,y) for x in range(5) if x%2==0 for y in range(7) if y%2!=0]
print(result3)  #[(0, 1), (0, 3), (0, 5), (2, 1), (2, 3), (2, 5), (4, 1), (4, 3), (4, 5)]

list=[[1,2,3],[4,5,6],[7,8,9]]
result4=[i[-1] for i in list]
print(result4)  #[3, 6, 9]

dict1={'name':'tom','salary':5000}
dict2={'name':'andy','salary':4000}
dict3={'name':'silly','salary':5080}
dict4={'name':'lilly','salary':4820}
list2=[dict1,dict2,dict3,dict4]
result5=[employee['salary']+200 if employee['salary']>5000 else employee['salary']-200 for employee in list2]
print(result5)  #[4800, 3800, 5280, 4620]


dict5={'a':'A','b':'B','c':'C','d':'D'}
newdict={value:key for key,value in dict5.items()}
print(newdict)    #{'A': 'a', 'B': 'b', 'C': 'c', 'D': 'd'}
#通过列表推导式得到生成器
list=[x*3 for x in range(20)]
print(list)
#得到生成器
g=(x*3 for x in range(20))
#print(type(g))  #<class 'generator'>


#1.通过调用__next__()得到生成器元素
print(g.__next__())  #0
print(g.__next__())  #3
#2.next()     buildinns系统内置函数
#每调用一个next就会产生一个元素
print(next(g))  #6
print(next(g))  #9    #StopIteration 异常

while 1:
    try:
        print(next(g))   #12
    except StopIteration:   #StopIteration表示生成器到达上限
        print('没有更多元素了')
        break  #如果没有break就会一直循环“没有更多元素了”


#定义生成器方式2
#斐波那契数列

#函数中出现yield ,说明函数变成生成器
def func():
    n=0
    while True:
        n+=1
        yield n
func()


#!/usr/bin/env python
# -*- coding:utf-8 -*-
'''
1、定义一个函数,函数中使用yield关键字
2、调用函数,接收调用结果
3、得到的结果g就是生成器
4、借助于next(g),g.__next__()

'''
def func():
    n=0
    while True:
        n+=1
        yield n   #return n  + 暂停
g=func()
print(g)#<generator object func at 0x0000024470910750> 生成器对象
print(next(g))#1
print(g.__next__())#2


def fib(length):
    a,b=0,1
    n=0
    while n<length:
        #print(b)
        yield b
        t=b
        b=a+b  #a,b=b,a+b
        a=t
        n=n+1
    return '没有更多元素了'
g=fib(8)
print(next(g))
print(next(g))
print(next(g))
print(next(g))
print(next(g))
print(next(g))
print(next(g))
print(next(g))
print(next(g))
print(next(g))
print(next(g))
'''
生成器:
        1、__next__()#获取下一个元素
        2、send(value)#向每次生成器调用中传值。注意:第一次调用send(None)
'''
def gen():
    i=0
    while i<5:
        temp=yield i
        print('temp:',temp)
        i=i+1
    return '没有更多元素了'
g=gen()
# print(next(g))
# print(next(g))
# print(next(g))
# print(next(g))
print(g.send(None))
n1=g.send('呵呵')
print('n1',n1)
n2=g.send('哈哈')
print('n2',n2)
#运行结果:
# 0
# temp: 呵呵
# n1 1
# temp: 哈哈
# n2 2

#生成器的应用
#协程
def task1(n):
    for i in range(n):
        print('正在搬第{}块砖'.format(i))
        yield


def task2(n):
    for i in range(n):
        print('正在听第{}首歌'.format(i))
        yield
g1=task1(5)
g2=task2(5)
while True:
    try:
        next(g1)
        next(g2)
    except:
        break
# 正在搬第0块砖
# 正在听第0首歌
# 正在搬第1块砖
# 正在听第1首歌
# 正在搬第2块砖
# 正在听第2首歌
# 正在搬第3块砖
# 正在听第3首歌
# 正在搬第4块砖
# 正在听第4首歌
#可迭代的对象,iterable
#生成器,列表,集合,元组,字典,字符串
#如何判断一个对象是否是可迭代的
from collections.abc import Iterable

list1=[1,2,3,4]
f=isinstance(list1,Iterable)
print(f)

#可以被next()函数调用并且不断返回下一个值的对象成为迭代器:Iterator
#可迭代对象不一定是迭代器
list1=iter(list1)   #iter(list)变成迭代器

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值