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

python 匿名函数,生成器迭代器

2017-12-24 20:01 218 查看
1. 匿名函数

a)  没有名字,lambda[agr1[,arg2…]]:expression

b)  表达式:Sum=lambda agr1,agr2:agr1+agr2;

Sum(10,20)

c)  函数可以做参数传递,

三个大数据用的函数:

foo=[2,3,2,5,6,5,52]

filter(lambdax:x%3=0,foo)//过滤留下能被三整除的数,

map(lambdax:x*2,foo)//遍历列表

mylist=map(lambda
x:x,mylist)
for i in
mylist:

    print(i)

 

reduce(lambdax,y:x+y,foo)//求foo里面的和

reduce需要导入模块  from functools import reduce

 

 

2. Sorted列表排序,小到大排序<asc>正序<dsc>倒序

Sorted(lisr,reverse=True)倒序排序,

 

 

 

 

3. 随机数:

a)  import random

       i.     random.choice(range(1-34))随机取1-33之间的1个随机数,可能重复

     ii.     random.choices(range(1-34),k=6,weight=)随机取1-33之间的1个随机数,可能重复

   iii.     random.sample(range(1,34),6)

4. sort和sorted排序的区别

a)  sort没有返回值,原来的列表顺序没了,

b)  sorted 返回一个新列表

5. 迭代器和生成器:

a)  迭代器是访问集合内的元素的一种方式,迭代器对象从集合的第一个元素开始访问,直到所有的元素都被访问一遍结束.

b)  迭代器协议:对象需要提供next()方法,它要么返回下一个对象,要么引起一个

•迭代器是访问集合内元素的一种方式。迭代器对象从集合的第一个元素开始访问,直到所有的元素都被访问一遍后结束。
•迭代器协议:对象需要要提供next()方法,它要么返回下一个对象,要么引起一个StopIteration异常
•可迭代对象:实现了迭代器协议的对象
•for,max,min,sum等使用迭代器协议访问对象

•构建迭代器的时候,以一种延迟计算(lazy evaluation)方式返回元素,这正是它的优点。比如列表含有中一千万个整数,
需要占超过400M的内存,而迭代器只需要几十个字节的空间。因为它并没有把所有元素装载到内存中,
而是等到调用 next 方法时候才返回该元素(按需调用 call by need 的方式,本质上 for 循环就是不断地调用迭代器的next方法)

•for循环实现 了迭代器
–for  i in [1,2,3,4]:

    print i
•文件对象提供迭代器协议
–with open('E:\\s133\\s131.txt') as f:

    for line in f:  #for循环使用迭代器协议访问文件

        print(line)

生成器:

•Python使用生成器对延迟操作提供了支持
•所谓延迟操作,是指在需要的时候才产生结果,而不是立即产生结果。这也是生成器的主要好处。
•Python有两种不同的方式提供生成器
–1.生成器函数:常规函数定义,但是,使用yield语句而不是return语句返回结返回一个结果,在每个结果中间,挂起函数的状态
,以便下次重它离开的地方继续执行果。yield语句一次
–2.生成器表达式:类似于列表推导,但是,生成器返回按需产生结果的一个对象,而不是一次构建一个结果列表

•使用生成器返回自然数的平方(注意返回的是多个值):
def gensquares(N):

for i in range(N):

yield i ** 2

for item in gensquares(5):

print item

使用普通函数:

def gensquares(N):

  res= []

  fori inrange(N):

      res.append(i*i)

  returnres

for item in gensquares(5):

   print item

•语法上和函数类似:
–区别:生成器使用yield语句返回一个值,而常规函数使用return语句返回一个值
•自动实现迭代器协议:
–对于生成器,Python会自动实现迭代器协议,(如for循环,sum函数)。由于生成器自动实现了迭代器协议,所以,我们可以调用它的next()方法,并且,在没有值可以返回的时候,生成器自动产生StopIteration异常
•状态挂起:
–生成器使用yield语句返回一个值。yield语句挂起该生成器函数的状态,保留足够的信息,以便之后从它离开的地方继续执行

•生成器的好处是延迟计算,一次返回一个结果。也就是说,它不会一次生成所有的结果,这对于大数据量处理,将会非常有用
–sum([ifor i inxrange(10000000000)])
–sum(ifor i in xrange(10000000000))
•对于前一个表达式还没有看到最终结果电脑就已经卡死,对于后一个表达式,几乎没有什么内存占用。

•代码简洁,易于阅读
–求一段文字中,每个单词出现的位置
def index_words(text):

    result=[]

    if text:

        result.append(0)

    for index,letter inenumerate(text,1):

        if letter == ' ':

            result.append(index)

    return result

result=index_words("Iam rong")

for a in result:

    print(a)

使用生成器的情况:

def index_words(text):

    if text:

        yield 0;

    for index,letter inenumerate(text,1):

        if letter==' ':

            yield index,letter

result=index_words('Iam rong')

for a in result:

    print(a)
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: