您的位置:首页 > 编程语言 > Python开发

python学习-Day15-python生成式和生成器、迭代器、装饰器

2017-11-03 14:36 671 查看

列表生成式:一次性生成所有数据,然后保存在内存中。适合少量数据(有节操的程序员依旧不要选择)

li = [x*x for x in xrange(1, 11) if x%2 == 0]print (li)

\\上下两种表达方式过程结果是一样的。
def funca():
a = []
for x in xrange(1, 11):
if x%2 == 0:
a.append(x*x)
return a
print(funca())

[4, 16, 36, 64, 100]

[4, 16, 36, 64, 100]

生成器:返回一个可迭代的对象,及“generator”对象,必须通过循环才可以一一取出所有对象

可迭代对象:可以通过循环调用出来的对象。列表[]、元组()、元组{}、字典、生成式、生成器

通过列表生成式,可以直接创建一个列表。但是受到内存限制,列表容量也有限,而且创建一个包含100万个元素的列表不仅占用很大存储空间,重要的是我们仅仅需要访问其中几个元素,那么绝大多数元素占用的空间会白白浪费。

所以,如果列表元素可以按照某种算法推算出来,那我们就可以再循环的过程中不断推算出后面的元素,不必创建完整的list,节省大量的空间。再python中这样这种一遍循环一遍计算的机制,成为生成器

创建生成器最简单的方法:把原来生成式的 [] 换成 () 就可以了。

lt = (x*x for x in xrange(1, 11) if x%2 == 0)
print(lt)
print(type(lt))

<generator object <genexpr> at 0x0368A710>

<type 'generator'>

print(lt.next())		\\生成器的取值,是通过next()或者是循环的方式进行的。
print(lt.next())
print ('#' * 30)
for i in lt:
print (i)

4

16

##############################

36

64

100

函数中定义列表生成器:

def fib(n):
sum = 0
i = 0
while(i<n):
sum = sum + i
i += 1
print (sum)
fib(5)

def fib(n):
sum = 0
i = 0
while(i<n):
sum = sum + i
i += 1
 yield (sum)print(type(fib(5)))
for e in fib(5):
print(e)


<type 'generator'>

0

1

3

6

10

重点:yield
上面两个的结果是一样的,不同在于:包含yield语句的函数会被特地编译成生成器,当函数被调用时,他们返回一个生成器对象,这个对象支持迭代器接口,每当遇到yield关键字的时候,可以理解为函数的return语句,yield后面的值,就是返回的值。但是不像一般的函数return后退出,生成器函数再生成值后会自动挂起并暂停他们的执行和状态,他的本地变量将保存状态信息,这些信息在函数恢复时将再度有效,下次从yield下面的部分开始执行。

解释:

1、因为以上函数有关键字yield,所以生成的是一个生成器。

2、for循环调用生成器,当执行到yield时,返回sum的值,sum为0,此时暂停并记录sum的值

3、打印sum的值,然后继续往下执行,此时跳入下一个循环while(1<5)=

4、直到遇到yield的时候,返回sum的值

5、反复执行3、4步骤,直到循环结束,最终退出程序

(生成式与生成器?) 二者的区别:

一个直接返回了表达式的结果列表,另一个是一个对象,该对象包含了对表达式结果的计算引用,通过循环可以直接输出。

生成器不会一次性列出所有的数据,当你用到的时候,再列出,更加节约内存的使用率。

迭代器:(生成器)必须通过next()调用的,并不断返回下一个值的对象



装饰器:

参考
https://www.zhihu.com/question/26930016
作业:用函数实现9*9乘法口诀

def funcx():
for i in xrange(1, 10):
for j in xrange(1, i+1):
print "%s * %s = %s" % (j, i, i*j),	\\这里最后必须有找个‘,’逗号,否则会每一个单独成为一行

print '\n'
funcx()

1 * 1 = 1

1 * 2 = 2 2 * 2 = 4

1 * 3 = 3 2 * 3 = 6 3 * 3 = 9

1 * 4 = 4 2 * 4 = 8 3 * 4 = 12 4 * 4 = 16

1 * 5 = 5 2 * 5 = 10 3 * 5 = 15 4 * 5 = 20 5 * 5 = 25

1 * 6 = 6 2 * 6 = 12 3 * 6 = 18 4 * 6 = 24 5 * 6 = 30 6 * 6 = 36

1 * 7 = 7 2 * 7 = 14 3 * 7 = 21 4 * 7 = 28 5 * 7 = 35 6 * 7 = 42 7 * 7 = 49

1 * 8 = 8 2 * 8 = 16 3 * 8 = 24 4 * 8 = 32 5 * 8 = 40 6 * 8 = 48 7 * 8 = 56 8 * 8 = 64

1 * 9 = 9 2 * 9 = 18 3 * 9 = 27 4 * 9 = 36 5 * 9 = 45 6 * 9 = 54 7 * 9 = 63 8 * 9 = 72 9 * 9 = 81

大神范例:融合之前的一系列知识点

def func(n):
for i in xrange(1,n):
yield " ".join(["{0}*{1}={2}".format(x,i,x*i) for x in xrange(1,i+1) ])
for i in func(10):
print i

记录学习。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息