生成器

1生成器

  生成器的本质就是迭代器,生成器的特点和迭代器一样,取值方式也有相同之处(__next__  send()是给上一个yiel传值

  生成器一般是由生成器函数或者生成器表达式创建

2生成器函数

  和普通函数一样,只是函数中含有yield的函数就是生成器函数,

  生成器函数在执行的时候,默认返回的是生成器,不会执行函数的内容操作.执行内容操作需要用__next__才可以

  send()给上一个yield传值,第一次执行生成器代码的时候不能使用send(),最后yield结束程序时也不能使用send()传值

  send()与__next相同之处是都是向前运行一步,区别是send()传值,__next__是读取函数

def s():
    print("111")
    q = yield 222
    print(q)
    print("333")
    w =yield 444
    print(w)
    print("555")
    e = yield 666
    print(e)
    print("777")
    r = yield "完了"
    print(r)
a = s()
# print(a)# 结果<generator object s at 0x000001EBBA7D0F10> 获取生成器
b = a.__next__()# 111
print(b)# 222
c = a.__next__() # None 333
print(c) #444
d = a.send(888) #888 555
print(d) #666
e = a.send("牛肉汤")# 牛肉汤 777
print(e) # 完了
f = a.__next__()#  f = a.__next__()#StopIteration
print(f)

  

3推导式:通过一行代码来构建你要的列表, 看起来代码简单,但是出错误以后排错很难.

  <1>列表推导式:lst=[结果,for循环,条件筛选]

lst = [i for i in range(100) if i % 2 == 0]
print(lst)  #结果为[0,2,4,6...98]  100以内的偶数

  

  <2>字典推导式:dic={k,v for循环,条件筛选}

#要求:把dic的key值与value调换

dic={1:"唐僧",2:"悟空",3:"八戒",4:"沙师弟"}
dic_new={v:k for k,v in dic.items()}
print(dic_new) # {'唐僧': 1, '悟空': 2, '八戒': 3, '沙师弟': 4}

  

  <3>集合推导式:s = {k,for循环,条件}     #集合推导式可以自动帮我们生成一个集合,集合的特点是无序,不重复.自带去重功能.

要求:对列表内的内容去重

lst = [1,2,1,6,3,7,8,9,6,5,8,4]
s = {abs(i) for i in lst}
print(s)#结果{1, 2, 3, 4, 5, 6, 7, 8, 9}

 总结:推导式有列表推导式,字典推导式,集合推导式,没有元组推导式 

4生成器表达式:(结果 for循环 条件)

特点:1惰性机制 2 节省空间(鸡蛋)3只能向前

 # 去掉列表中带有字母d并且出现过一次的字符串
names=[["andy","monedy","tuesday","third"],["sunday","friday","wangjun","666"]]
gen = (el for i in names for el in i if el.count("d")==1 )
for m in gen:
    print(m) 结果  #andy
                    #monedy
                    #tuesday
                    #third
                    #sunday
                    #friday

  总结:列表表达式与生成器表达式的区别:1生成器表达式和列表推导式的语法基本上是⼀一样的. 只是把[]替换成()

                   2列表表达式一次性加载,占用内存较多,生成器表达式只是在调用时才分配和占用内存,节省空间

                   3结果不一样,列表表达式得到的是一个列表,生成器表达式得到的是一个生成器

练习题

# (1)过滤掉长度小于3的字符串列表,并将剩下的转换成大写字母
# lst =["alex", "wu","wukai", "chenyifa", "mo", "ti", "feng"]
# lst_new=[i.upper()for i in lst if len(i)>3]
# print(lst_new)   # 结果为['ALEX', 'WUKAI', 'CHENYIFA', 'FENG']
#
#
# (2)求(x,y)其中x是0-5之间的偶数,y是0-5之间的奇数组成的元祖列表
# s = [(x,y)for x in range(5) if x %2==0 for y in range(5) if y %2==1]
# print(s)   # 结果为[(0, 1), (0, 3), (2, 1), (2, 3), (4, 1), (4, 3)]
#
#
# (3)求M中3,6,9组成的列表M = [[1,2,3],[4,5,6],[7,8,9]]
# M = [[1,2,3],[4,5,6],[7,8,9]]
# lst = [[x, y, z] for x in M[0] if x == 3 for y in M[1]if y == 6 for z in M[2]if z == 9]
# print(lst) # 结果 [[3, 6, 9]]
#
#
#  (4)求出50以内能被3整除的数的平方,并放入到一个列表中。
# ls=[i*i for i in range(50) if i%3==0 ]
# print(ls)  #[0, 9, 36, 81, 144, 225, 324, 441, 576, 729, 900, 1089, 1296, 1521, 1764, 2025, 2304]
#
#
#  (5)构建一个列表:['python1期', 'python2期',
# 'python3期', 'python4期', 'python6期', 'python7期',
# 'python8期', 'python9期', 'python10期']
# l=["python%s期"% s for s in range(1,11)]
# print(l)  #结果为 ['python1期', 'python2期', 'python3期', 'python4期', 'python5期', 'python6期', 'python7期', 'python8期', 'python9期', 'python10期']
#
#
# (6)构建一个列表:[(0, 1), (1, 2), (2, 3), (3, 4), (4, 5), (5, 6)]
# l1=[(x,x+1)for x in range(6)]
# print(l1)#  [(0, 1), (1, 2), (2, 3), (3, 4), (4, 5), (5, 6)]

# (7)构建一个列表:[0, 2, 4, 6, 8, 10, 12, 14, 16, 18]
# l2=[s for s in range(19)if s%2==0]
# print(l2)  #[0, 2, 4, 6, 8, 10, 12, 14, 16, 18]


#(8)有一个列表l1 = ['alex', 'WuSir', '老男孩', '太白']
# 将其构造成这种列表['alex0', 'WuSir1', '老男孩2', '太白3']
# l1 = ['alex', 'WuSir', '老男孩', '太白']
# l3 = [l1[a]+str(a) for a in range(len(l1))]
# print(l3)  #['alex0', 'WuSir1', '老男孩2', '太白3']


#(9)有以下数据类型:
'''x = {
    'name':'alex',
    'Values':[{'timestamp':1517991992.94,
         'values':100,},
        {'timestamp': 1517992000.94,
        'values': 200,},
        {'timestamp': 1517992014.94,
         'values': 300,},
        {'timestamp': 1517992744.94,
         'values': 350},
        {'timestamp': 1517992800.94,
         'values': 280}
        ],}'''
#将上面的数据通过列表推导式转换成下面的类型:
# [[1517991992.94, 100], [1517992000.94, 200], [1517992014.94, 300], [1517992744.94, 350], [1517992800.94, 280]]
# l4=[[k['timestamp'],k['values']]for k in x['Values']]
# print(l4)# 结果为[[1517991992.94, 100], [1517992000.94, 200], [1517992014.94, 300], [1517992744.94, 350], [1517992800.94, 280]]
原文地址:https://www.cnblogs.com/lingcai/p/9470444.html