'''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,1while n<max:yield ba,b = b,a+bn = n+1return 'done'g = fib(6)print(fib(6)) # yield 的作用就是把一个函数变成一个 generator,带有 yield 的函数不再是一个普通函数,Python 解释器会将其视为一个 generator,调用 fab(5) 不会执行 fab 函数,而是返回一个 iterable 对象
print(next(g))#每next一次,它会向下执行一次,他是不知道什么时候结束的,所以可以使用 for 或者whilefor 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循环的叫可迭代对象:Iterablefor循环可以应用下列类型: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)#在每一个列表最前面插入1print('之后------------------',g)
for t in triangles():# print(t)results.append(t)n = n + 1if n == 5:breakprint(results)