Python_day13_2018.7.18(生成器和生成器表达式)

本节主要内容:

  1.生成器和生成器函数

  2.列表推导式

一.生成器

  什么是生成器,生成器实质是迭代器

三个获取生成器的方法:

  1.通过生成器函数

  2.通过各种推导式来实现生成器

  3.通过数据的转换可以获生成器

def func():   

  print("111")   

  return 222

ret = func()

print(ret)

结果: 111 222

------------把return换成yield --------------

def func():   

  print("111")   

  yield  222

ret = func()

print(ret)   #ret没有执行函数,只是获取到生成器的内存地址.

由于函数中存在了了yield. 那么这个函数就是一个生成器 函数. 这个时候. 我们再执行这个函数的时候. 就不再是函数的执行了.

而是获取这个生成器. 如何使用呢? 想想迭代器. ⽣生成器的本质是迭代器. 所以. 我们可以直接执行__next__()来执行.

def func():   

  print("111")   

  yield 222

gener = func()  # 这个时候函数不不会执行. 而是获取到生成器器

ret = gener.__next__()  # 这个时候函数才会执⾏行行. yield的作⽤用和return⼀一样. 也是返回 数据

print(ret)

结果: 111 222

 

send和__next__()区别:

1. send和next()都是让⽣生成器向下走一次

2. send可以给上一个yield的位置传递值, 不能给后一个yield发送值. 在第一次执行生成器代码的时候不能使⽤用send()

 

二.列表推导式,生成器表达式以及其他推导式.

lst = [ ]

for i int rang(1,15)

  lst.append(i)

print(lst)

替换成列表推导式:

lst = [i for i in rang(1,15)]

proint(lst)

 

列表推导式的常见写法:

[结果 for 变量 in 可迭代对象]

 

帅选模式:

[结果 for 变量 in 可迭代对象 if 条件 ]

#获取1-100内所有的偶数

lst = [i for i in rang(1,101) if i % 2 == 0]

print(lst)

 

 生成器表达式和列表推导式的语法基本上是一样的. 只是把[ ]替换成( )

gen = (i for i in rang(10))

print(gen)

结果:打印出来的是生成器gen的内存地址.

gen = (i for i in rang(10))

for i in gen

print(i)   #我们可以使用for循环来循环这个生成器:

 

生成器表达式也可以进行筛选:

gen = (i for i in rang(1,100)  if i % 3 == 0 )

for num in gen:

print( num )

 

⽣生成器表达式和列列表推导式的区别:

1. 列列表推导式比较耗内存. ⼀一次性加载. ⽣生成器表达式⼏几乎不占⽤用内存. 使⽤用的时候才分 配和使⽤用内存

2. 得到的值不⼀一样. 列列表推导式得到的是⼀一个列列表. ⽣生成器表达式获取的是⼀一个⽣生成器.

 

def func()

  print(111)

  yield 222

g = func( )            #生成器

g1 = (i for i in g)   

g2 = (o for i in g1)   #生成器g1中的数据, g1的数据来源是g 但是g 已近取完了,g1 也就没有数据了

print(list(g))

print(list(g1))   #生成器g1 ,但是g1 的数据来源与g

print(list(g2))    #生成器g1中的数据, g1的数据来源是g 但是g 已近取完了,g1 也就没有数据了.

 

 

# day14作业默写
# 1,整理今天的博客,写课上代码,整理流程图。
# 2,用列表推导式做下列小题
# (1) 过滤掉长度小于3的字符串列表,并将剩下的转换成大写字母

# lis = ["abc","zc","ahdd","a","df","jshdh"]
# new_list = [i.upper() for i in lis if len(i) >= 3]
# print(new_list)

# (2) 求(x,y)其中x是0-5之间的偶数,y是0-5之间的奇数组成的元祖列表
# lis = [(x,y) for x in range(0,6) for y in range(1,6) if x % 2 == 0 and y % 2 != 0]
# print(lis)
# (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]]
# lis = [ i[2] for i in M ]
# print(lis)

# # (4) 求出50以内能被3整除的数的平方,并放入到一个列表中。

# lis = [i**2 for i in range(1,51) if i % 3 == 0]
# print(lis)

# (5) 构建一个列表:['python1期', 'python2期', 'python3期', 'python4期', 'python6期', 'python7期', 'python8期', 'python9期', 'python10期']

# lis = ["python%s" % i for i in range(1,11)]
# print(lis)

# (6) 构建一个列表:[(0, 1), (1, 2), (2, 3), (3, 4), (4, 5), (5, 6)]

# lis = [(i,i+1) for i in range(6)]
# print(lis)

# (7) 构建一个列表:[0, 2, 4, 6, 8, 10, 12, 14, 16, 18]

# lis = [i for i in range(0,19) if i % 2 == 0]
# print(lis)

# (8) 有一个列表l1 = ['alex', 'WuSir', '老男孩', '太白']将其构造成这种列表['alex0', 'WuSir1', '老男孩2', '太白3']

# l1 = ['alex', 'WuSir', '老男孩', '太白']
# lis = [i+str(l1.index(i)) for i in l1]
# print(lis)

# (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]]
#
# lis = [[el.get("timestamp"),el.get('values')] for el in x.get("Values") ]
# print(lis)

 

posted @ 2018-07-18 20:18  Anna_kc  阅读(234)  评论(0编辑  收藏  举报