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

来源:互联网 发布:oracle sql state 编辑:程序博客网 时间:2024/05/29 11:03

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

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 aprint(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
记录学习。

原创粉丝点击