python-------列表生成式,生成器(generator),迭代器(Iterable)

'''
 	getattr():
 	    函数用于返回一个对象属性值。 getattr(object, name[, default]),如果没有某一个属性
        设置了默认值则不会报错,如果没有设置默认值就会报错
 	setattr():
 	    函数对应函数 getattr(),用于设置属性值,该属性不一定是存在的
 	    如果属性不存在会创建一个新的对象属性,并对属性赋值,如果属性存在则覆盖
 	hasattr():
 	    函数用于判断对象是否包含对应的属性
         	
'''


'''
 列表生成式
    用来创建list:
    d = {'zs':'1','lisi':'2','wangwu':'3'}
    val = [k +'='+v for k,v in d.items()]
    print(val)
'''
d = {'zs':'1','lisi':'2','wangwu':'3'}
print([k +'='+v for k,v in d.items()])#输出:['zs=1', 'lisi=2', 'wangwu=3']
print([x*x for x in range(1,11)]) #输出:[1, 4, 9, 16, 25, 36, 49, 64, 81, 100]
'''
 'abc' '123'
 生成 a1,a2,a3,b1,b2,b3,c1,c2,c3
 后面还是可以添加表达式的
'''
a=['a','b','c']
b=['1','2','3']
print([x+y for x in a for y in b ])
a='a.b.c'
b=['1','2','3']
print([x+y for x in a for y in b if x !='.' ])




'''
 生成器(generator):
    循环的过程中不断推算出后续的元素,这样就不必创建完整的list,这种一边循环一边计算的机制
    和列表生成式比,一个是[]一个是()
'''
g=(x*x for x in range(1,11)) #<generator object <genexpr> at 0x01806CA0> 对象
print(next(g))#只输出一个值,执行一次输出一次,
for i in g:   #for的底层调用的就是next()的这个方法
    print(i)
print([x*x for x in range(1,11)])
# -------------------------------------yield
def fib(max):
    n,a,b = 0,0,1
    while n<max:
        yield  b
        a,b = b,a+b
        n = n+1
    return  'done'

g = fib(6)

print(fib(6)) '''
    yield
    yield 的作用就是把一个函数变成一个 generator,带有 yield 的函数不再是一个普通函数,Python 解释器会将其视为一个 generator,
    调用 fab(5) 不会执行 fab 函数,而是返回一个 iterable 对象!在 for 循环执行时,每次循环都会执行 fab 函数内部的代码,执行到 yield b 时,fab 函数就返回一个迭代值,
    下次迭代时,代码从 yield b 的下一条语句继续执行,而函数的本地变量看起来和上次中断执行前是完全一样的,于是函数继续执行,直到再次遇到 yield。
    a=0 b=1
      a, b = b, a+b
          # 这种赋值,先计算等值 右边 就是 b=1 a+b=1
          # 再赋值给a和b,那么 a=1, b=1
          #然后就是依次这样

      a = b
            # 此时 b=1, 那么a=1
      b = a+b
            # 那么 b=2

'''
print(next(g))#每next一次,它会向下执行一次,他是不知道什么时候结束的,所以可以使用 for 或者while

for i in fib(6):
    print(i)

while True:
    try:
        x = next(g)
        print(x)
    except StopIteration as e:
        print("没有数据了"+e.value)
        break
#如何判断一个函数是否是一个特殊的 generator 函数?可以利用 isgeneratorfunction 判断:
from inspect import isgeneratorfunction
print(isgeneratorfunction(fib) )

'''    
 迭代器(Iterable)
    直接可作用于for循环的叫可迭代对象:Iterable
    for循环可以应用下列类型:
        1. 集合数据类型,list,tuple,dict,set,str等
        2. generator ,生成器和带yield的generator function等
    直接可作用于next方法的叫可以生成器对象:Iterator
    生成器可以同时作用于for循环和next()函数,不断调用,直到抛出StopIteration错误
'''
#判断一个对象是否可迭代,(能用for循环的)
from collections.abc import Iterable
print(isinstance([],Iterable))#True
print(isinstance({},Iterable))#True
print(isinstance('',Iterable))#True
print(isinstance(123,Iterable))#False


#判断一个对象是否是生成器 Iterator(使用next)
from collections.abc import Iterator
print(isinstance([],Iterator))#False
print(isinstance({},Iterator))#False
print(isinstance('',Iterator))#False
print(isinstance(123,Iterator))#False

#总结 :能使用for循环的, 不一定可以使用next()

# 可迭代的才可以转换成生成器对象!!!
print(isinstance(iter([]),Iterator))#False
print(isinstance(iter({}),Iterator))#False
print(isinstance(iter(''),Iterator))#False


#打印杨辉三角
n = 0
results = []
def triangles():
    g=[1]   #第一个数据
    while True:
        yield  g # 使用yield语句产生一个生成器,返回当前列表
        g = [g[x] + g[x + 1] for x in range(len(g) - 1)]
        g.append(1)
        print('之前------------------',g)
        g.insert(0,1)#在每一个列表最前面插入1
        print('之后------------------',g)
for t in triangles():
    # print(t)
    results.append(t)
    n = n + 1
    if n == 5:
        break

print(results)


 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值