1.列表生成式:通过简洁的语法可以对一组元素进行过滤


格式:[exp for val in collection if condition]


例子1:

a = [x*x for x in xrange(1,10) if x%2 == 0]

print(a)


1)append():

该方法用于在列表末尾添加新的对象,语法格式:

list.append(obj)


def funcA():

   list1 = []

   for x in xrange(1,10):

       if x%2 == 0:

          list1.append(x*x)

   return list1

print funcA()

结果:

[4, 16, 36, 64]

[4, 16, 36, 64]


说明:extend 表示把该对象里面的所有元素逐个地追加到列表的后面,参数需是可迭代对象!



2.生成器:一边循环,一边计算


方式一

把生产式中的[ ]修改成()


例子:

a = (x*x for x in xrange(1,10) if x%2 == 0)

print(a.next())

print(a.next())

for i in a:

   print(i)

结果:

4

16

36

64


方式二

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


说明:yield 是一个类似 return 的关键字,带有yield的函数不仅仅只用于for循环中,而且可用于某个函数的参数


例子2:

def sum(x):

   i=0

   sum=0

   while i<x:

       sum+=i

       i+=1

       yield (sum)

for y in sum(5):

   print(y)

print(type(sum(5)))


结果:

0

1

3

6

10

<type'generator'>


3.生成式和生成器的区别

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

 当表达式的结果数量较少的时候, 使用列表生成式还好, 一旦数量级过大, 那么列表生成式就会占用很大的内存。

  而生成器并不是立即把结果写入内存, 而是保存的一种计算方式, 通过不断的获取, 可以获取到相应的位置的值,所以占用的内存仅仅是对计算对象的保存。


例子:

1)列表生成式,这里是中括号

[x*x for x in range(0,10)]  


结果:

[0, 1, 4, 9, 16, 25, 36, 49, 64, 81] 


2)生成器, 这里是小括号

(x*x for x in range(0,10))  


结果:

<generator object <genexpr> at 0x7f0b072e6140>


生成器使用时,需如下执行:

g = (x*x for x in range(0,10)) 

for n in g: 

print n


结果:

0

1

4

9

16

25

36

49

64

81


4.print、return和yield的区别

def func1():

   for i in range(1, 5):

       print i

def func2():

   for i in range(1, 5):

       return i

def func3():

   for i in range(1, 5):

       yield i

func1()

print func2()

print func3()


说明:

1.print并不会阻断程序的执行

2.func2()方法中的循环执行第一次就被return结束掉(后面的2、3、4就不会有返回的机会了)

3.yield你可以通俗的叫它"轮转容器",可用现实的一种实物来理解:水车,先yield来装入数据、产出generator object、使用next()来释放;好比水车转动后,车轮上的水槽装入水,随着轮子转动,被转到下面的水槽就能将水送入水道中流入田里


例子:

def func3():

   for i in range(1,5):

       yield i   #装入


gob = func3()    #generator 类型

print next(gob)  #1    释放的第一个装入的数据,(先入先出)

print next(gob)  #2

print next(gob)  #3

print next(gob)  #4

print next(gob)  #报错





例子:九九乘法表


def jiujiu1(m):

   for i in xrange(1,m+1):

       print "%d * %d = %d " % (m,i,m*i),

def jiujiu2():

   for j in xrange(1,10):

       print

       jiujiu1(j)

jiujiu2()


结果:

1 * 1 = 1 

2 * 1 = 2  2 * 2 = 4 

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

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

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

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

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

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

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