推导和生成器

#字典推导式
dic = {'a':10,'b':59}
r = [(k,v)for k,v in dic.items()]
s = [m for m in dic.items()]  #items()返回的时元组形式
print(r,s)

#列表推导式
m = [x*x for x in range(10)]
print(m)


#将单词长度大于3的转为大写输出
names = ['bob','tom','alice','jerry','wendy','mary']
result = [x.upper() for x in names if len(x)>3]
print(result)


#求(x,y)其中x是0-5的偶数,y是0-5的奇数组成
num = range(6)
result = [(x,x+1) for x in range(6) if x%2==0]
print(result)


#求m中3,6,9组成的列表
m = [[1,2,3],[4,5,6],[7,8,9]]
result = [x[2] for x in m]
print(result)
#求m中斜线1,5,9组成的列表
result1 = [x[i] for i,x in enumerate(m) ]
result2 = [m[i][i]for i in range(len(m))]
print(result1,result2)



#求m,n中矩阵和元素的乘积
m = [[1,2,3],[4,5,6],[7,8,9]]
n = [[2,2,2],[3,3,3],[4,4,4]]
result5 = [m[row][col]*n[row][col] for row in range(3) for col in range(3)]
print(result5)


# myre = (x[2] for x in m)
#生成器:生成器可以被循环迭代,直到循环结束,但只能遍历一次,next(myre)或myre.__text__(),
         #1.把(列表,字典,集合)推导式的[]和{}改成().
         #2.将print或return换成yield,每到yield时就会停止并返回当前这个值,调用方法时没有结果,可以调用next()

'''特点:1.语法上和函数类似,都用def定义,但是生成器用yield语句返回一个值,而函数用return
         2.自动实现迭代器协议,可以调用它的next方法,在没有值可以返回的时候,生成器自动产生
           StopIteration异常,它也是迭代器
         3.状态挂起:生成器使用yield语句返回一个值。yield语句挂起该生成器函数的状态,
           保留足够的信息,以便之后从它离开的地方继续执行'''
#迭代器:用iter(对象)可以将一个可迭代对象转成一个生成器,可以被next()调用的都为迭代器
def fun():
    a,b= 0,1
    while b<10:
        print('yield开始---')
        yield(a)
        a,b = b,a+b
        print('yield结束---')
f = fun()
print(f)
print(f.__next__())
print(f.__next__())
# print(f.__next__())
# print(f.__next__())
# print(next(f))


#自写迭代器:
class IterDemo:
    def __init__(self,start=0,end=0):
        self.start = start
        self.end = end#照应下面---->下标 或 列表长度
    def __iter__(self):
        print('iter----')
        return self
    def __next__(self):
        i = self.start
        if self.start < self.end:#对应上面--->self.end 或 self.end-1
            self.start += 1
            return i
        else:
            raise StopIteration
test = IterDemo(0,5)
for i in test:
    print(i)

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值