'''
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)