Python高级编程--生成器、迭代器、高阶函数

1.生成器(generator)

当列表元素可以按照某种算法推算出来,就可以在循环过程中不断推算后续的元素,而不必创建完整的列表,从而大量节省空间。在Python中,这种一边循环一边计算的机制,成为生成器。

list1 = [x for x in range(1,10)]
print(list1) #[1,2,3,4,5,6,7,8,9]

生成器不会保存该列表,只是在需要列表元素时才返回值,从而节省空间。

2.创建和遍历生成器

创建:

①通过列表生成式来创建

g1 = (x for x in range(10) if x%2==0)
print(g1)

②通过函数来创建生成器,关键字yield一般用于创建生成器,返回后面变量值给生成器。

#创建斐波那契数列:1,1,2,3,5....
def test1():
    a,b = 0,1
    while True:
        yield b
        a,b = b,(a+b)

g = test1()
print(g)
print(next(g))

遍历:

①next()方法,生成器保存的是算法,每次调用next()就计算出下一个元素,且会保存游标的位置,直到计算到最后一个元素,没有更多元素时,就抛出Stoplteration异常。

②采用for循环

g1 = (x for x in range(10) if x%2==0)
print(g1)
print(next(g1))
for i in g1:
    print(i)

③使用object内置的__next__函数遍历,与第一种方法区别不大

g = (x for x in range(10) if x%2==0)
print(g.__next__()) #输出0

④使用send()函数,但第一个值必须使用send(None)

g = (x for x in range(10) if x%2==0)
print(g.send(None)) #输出0
print(g.send('')) #输出2

3.迭代器

可以直接用for循环遍历的,称为可迭代对象Iterable。可使用isinstance()判断一个对象是否是Iterable。

from collections.abc import Iterable
a = (1,2)
b = [1,2]
print(isinstance(a,Iterable)) #True
print(isinstance(b,Iterable)) #True

可被next()函数调用,并不断返回下一个值的对象称为迭代器Iterator。可使用isinstance()判断。

生成器属于迭代器。迭代器表示一个数据流,不确定数据长度。

可以将列表、字典和字符串等变为迭代器:

from collections.abc import Iterator
a = (1,2)
b = [1,2]
c = 'abc'
print(isinstance(iter(a),Iterator)) #True
print(isinstance(iter(b),Iterator)) #True
print(isinstance(iter(c),Iterator)) #True

4.函数式编程/面向函数编程/高阶函数 

函数式编程允许把函数本身作为参数传入另一个函数,还允许返回一个函数。

函数本身也是一个变量,如可将求绝对值函数abs()赋值给变量:

f=abs
print(abs)
#输出结果:<built-in function abs>
print(f(-9)) #9

满足以下条件之一,称为高阶函数:①一个函数的参数是函数②一个函数的返回值是函数

5.匿名函数

即没有名字的函数,形式: lambda[list] : 表达式

后面接表达式而不是函数体,此函数的返回值是表达式的结果值。

fun = lambda x,y : x+y
print(fun(10,20)) #30

6.常用的高阶函数

①map()函数:把一个可迭代对象中的每个元素转换成一个新的元素,最后返回一个迭代器。

list1 = [1,2,3,4,5]
a = map(lambda x:x**2,list1)
print(map(lambda x:x**2,list1)) #生成一个迭代器
print(next(a)) #1

②reduce():把一个可迭代对象中的每个元素做处理,最后返回一个处理之后的值。

形式:reduce(function,sequence[,initial])

function:有两个参数的函数

sequence:一组数据,可迭代对象

initial:可选的初始参数

reduce()函数先使用function函数对sequence的第1、2个元素进行操作;如果存在initial参数,则会以sequence中的第一个元素和initial作为参数,用作调用,得到的结果再与sequence中的下一个数据用function函数调用,最后得到结果。

from functools import reduce
list1 = [1,2,3,4,5]
print(reduce(lambda x,y:x+y,list1)) #15

③filter()函数:依次作用于传入的每个元素,根据返回值是Ture还是False决定元素的保留与丢弃。

filter(function,iterable)

list1 = [1,2,3,4,5,6]
print(list(filter(lambda x:x%2==0,list1)))
#[2, 4, 6]

④max()与min()函数

⑤sorted()函数:将一个可迭代对象里的每个元素做排序,返回一个列表。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

长得丑就要多读书

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值