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()函数:将一个可迭代对象里的每个元素做排序,返回一个列表。