#列表生成式 print list(range(11)) #列表生成式第二种写法 a = [x for x in range(11)] #使用内置filter函数过滤列表a中不满足lambda函数的元素,即过滤掉奇数,留下偶数 print filter(lambda x: x%2==0 , a) #[0, 2, 4, 6, 8, 10] ''' 列表生成式直接生成一个列表,所有元素对象被立即创建在内存中,当元素过多时,势必会占用过多内存, 不可取,要用到生成器,它即时创建一个生成器对象,未创建任何元素 ''' #生成器来生成一个列表,它不会立即创建大量的对象在内存中 b = (x for x in range(11)) #生成器的缺点,没有列表的方法,如append、len、index等等 #print len(b) #抛出异常,生成器没有__len__属性,查看不了列表长度 #通过next方法来访问其元素 print b.next(),b.next() #0 1 #可通过循环打印出所有的元素 for i in b:print i ''' 第二种生成器写法,使用yield:迭代器 封装于函数内 ''' def generator_(n): for i in range(n): yield i #此时这个函数已经是一个生成器了 print generator_(11).next() #使用内置函数filter配合匿名函数过滤掉数组中不符合条件的元素 print filter(lambda x:x%2 ==0, [1,2,3,4,5]) #[2,4] #也可以把以下函数作为第一个参数传入 def get_2(n): return n%2==0 print filter(get_2, [1,2,3,4,5]) #[2,4] ''' 扩展; 可以直接作用于for循环的数据类型有以下几种: 一类是集合数据类型,如list、tuple、dict、set、str等; 一类是generator,包括生成器和带yield的generator function。 这些可以直接作用于for循环的对象统称为可迭代对象:Iterable。 可以使用isinstance()判断一个对象是否是Iterable对象: ''' from collections import Iterable #这个是可迭代对象 for i in ['123',[],(1,),set(),{}]: print isinstance(i,Iterable) #都是true from collections import Iterator #这个是迭代器 #可以被next()函数调用并不断返回下一个值的对象称为迭代器:Iterator print isinstance((i for i in range(11)),Iterator) #True #用Iter函数把可迭代对象变成迭代器 print isinstance(iter('123'),Iterator) # reversed将可迭代对象反转为一个迭代器 print reversed([1,2,3]).next() ''' 高阶函数用法:reduce,map ''' #map #使用函数来处理序列中的元素 :包含数字的元组、列表 res = map(lambda n:n*2, range(10)) print res #[0, 2, 4, 6... #可以接收2个数序列,生成一个列表 print map(lambda x,y:(x,y) , [1,2,3],[4,5,6]) #[(1, 4), (2, 5), (3, 6)] #reduce #使用函数来累积处理序列中的元素,可实现阶乘、求数组内的数字和 print reduce(lambda x,y:x*y , [1,2,3,4]) #24 print reduce(lambda x,y:x+y , [1,2,3,4]) #10 ,sum([1,2,3])更快 print reduce(lambda x,y:x+y ,'123','123') #123123 print reduce(lambda x,y:x+y , ['x','y','z']) #xyz
NO.1 :列表生成式和生成器的区别 ?
NO.2 :如何不用任何循环快速筛掉列表中的奇数元素 ?
NO.3 :map和reduce的用法 ?