生成器
- 使用场景
在使用列表时,很多时候我们不会一下子使用数据,通常都是一个一个使用;当数据较大的时候,定义一个列表会是程序内存占用突然增大,为了解决此类问题,python中引用了生成器 - 生成方式:
方式一:将列表生成式的[]改为()即可
lt=(i for i in range(3))
print(lt)
方式2:在函数中使用yield关键字
def test(n):
lt = []
for i in range (1,n+1):
lt.append(i)
return lt
print(test(10))
- 使用说明:
生成器对象保存的是特定数据的生成算法,而不是特定的所有数据
使用任意一种方式操作,都是单次的
生成器可以做的操作:遍历、next、转换为列表
迭代器
- 定义:能够使用for-in进行遍历,并且可以使用next函数进行迭代的对象
- 说明:
生成器就是一种特殊的迭代器
判断一个对象是否是迭代器
from collections import Iterator
#判断是否是迭代器
print(isinstance(lt,Iterator))
- 字符串及容器类型的对象都不是迭代器,他们都是可迭代对象
可迭代对象
- 定义:可以使用for-in遍历的对象,都是可迭代对象
- 说明:
- 前面学习过的字符串及容器类型的对象都是可迭代对象
- 迭代器一定是可迭代对象
- 判断一个对象是否是可迭代对象
from collections import Iterable, Iterator
lt = [1, 2, 3]
# 判断是否是可迭代对象
print(isinstance(lt, Iterable))
# 判断是否是迭代器
print(isinstance(lt, Iterator))
iter:可以将可迭代对象转换为迭代器
random
import random
# 生成指定范围内的随机整数
print(random.randint(1, 10))
# 生成0~1之间的随机小数
print(random.random())
# 生成指定范围内的随机整数,可以指定步幅
print(random.randrange(1, 10, 2))
lt = [1, 2, 3, 4, 5, 6, 7]
# 从容器对象或字符串中随机挑选一个元素
print(random.choice(lt))
# print(random.choice('ashdaiapo'))
# 从容器对象中随机挑取指定个数的元素
print(random.sample(lt, 3))
# 从容器对象中随机挑取一个元素,sample函数个数为1的情况
print(random.choices(lt))
# 打乱一个列表
random.shuffle(lt)
print(lt)
高级函数
- map
参数:
func :一个函数
iter:一个可迭代对象
功能:
将可迭代对象遍历,每个元素都是用该函数处理一遍,然后返回,保存这种算法的迭代器
使用:
from collections import Iterator
lt = [1, 2, 3, 4, 5]
def pingfang(n):
return n * n
# 返回map对象,是一个迭代器
# ret = map(pingfang, lt)
ret = map(lambda x: x*x, lt)
print(isinstance(ret, Iterator))
print(list(ret))
# print(next(ret))
# print(next(ret))
- filter
参数:
function:一个函数
iterable:可迭代对象
功能:
使用function依次作用与可迭代对象中的每个元素,当返回结果为Ture时保留该元素。返回filter对象,是一个迭代器。
- reduec
参数
function:一个函数
sequence:一个序列
功能:
首先从序列中取出前两个元素,作为function的参数处理一下
处理完的结果与下一个元素再使用function处理一下
处理结束,将处理完的结果返回
- 示例
rom functools import reduce
lt = [1, 2, 3, 4, 5]
def add(a, b):
return a + b
# ret = reduce(add, lt)
# ret = reduce(lambda x, y: x*y, lt)
ret = reduce(lambda x, y: x*10 + y, lt)
print(ret)