前言:
说几句,坐标CQ,爬虫工程师的需求在这个二线城市真的是太少了。
正文:
#列表生成式
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.4: 装饰器的作用 ?
最后给自己的开源项目wukongqueue拉一波星星,如果您不嫌麻烦,动动小手就可以了~谢谢!(有兴趣可进一步交流)