python函数-随机数-生成器-迭代器

本文探讨了Python中的随机数、生成器和迭代器。生成器是一种特殊的函数,能记住上一次调用的状态,允许在多次调用间进行跳转。生成器的特点包括参数保留,使得在所有调用中参数保持一致。通过示例展示了生成器表达式和使用场景,如在处理文本分隔和读取文件时。同时,提到了迭代器的概念,并指出在使用生成器时,一旦遍历过一次,再次遍历会引发错误。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

随机数

函数名称 函数功能 参数说明
rand(d0, d1, …, dn) 产生均匀分布的随机数 dn为第n维数据的维度
randn(d0, d1, …, dn) 产生标准正态分布随机数 dn为第n维数据的维度
randint(low[, high, size, dtype]) 产生随机整数 low:最小值;high:最大值;size:数据个数
random_sample([size]) 在[0,1)内产生随机数 size:随机数的shape,可以为元祖或者列表,[2,3]表示2维随机数,维度为(2,3)
random([size]) 同random_sample([size]) 同random_sample([size])
ranf([size]) 同random_sample([size]) 同random_sample([size])
sample([size])) 同random_sample([size]) 同random_sample([size])
choice(a[, size, replace, p]) 从a中随机选择指定数据 a:1维数组 size:返回数据形状
bytes(length) 返回随机位 length:位的长度

生成器

生成器是这样一个函数,它记住上一次返回时在函数体中的位置。对生成器函数的第二次(或第 次)调用跳转至该函数中间,而上次调用的所有局部变量都保持不变。

生成器不仅“记住”了它数据状态;生成器还“记住”了它在流控制构造(在命令式编程中,这种构造不只是数据值)中的位置。

生成器的特点

     生成器是一个函数,而且函数的参数都会保留。

     迭代到下一次的调用时,所使用的参数都是第一次所保留下的,即是说,在整个所有函数调用的参数都是第一次所调用时保留的,而不是新创建的

生成器表达式示例:

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

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

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

defindex_words(text):
    result=[]
    if text:
        result.append(0)
    for index,letter in enumerate(text,1):
        if letter == ' ':
            result.append(index)
    return result
result=index_words("I am rong")
for a in result:
    print(a)

使用生成器的情况:

defindex_words(text):
    if text:
        yield 0;
    for index,letter in enumerate(text,1):
        if letter==' ':
            yield index,letter
result=index_words('I am rong')
for a in result:
    print(a)

•生成器只能遍历一次

def get_province_population(filename):

  withopen(filename) as f: 

    for line in f:

           yield int(line)

gen = get_province_population('data.txt')

all_population =sum(gen)

for population in gen:

  printpopulation / all_population       #错误

迭代器

迭代器协议
•迭代器是访问集合内元素的一种方式。迭代器对象从集合的第一个元素开始访问,直到所有的元素都被访问一遍后结束。
•迭代器协议:对象需要要提供next()方法,它要么返回下一个对象,要么引起一个StopIteration异常
•可迭代对象:实现了迭代器协议的对象
•for,max,min,sum等使用迭代器协议访问对象
•构建迭代器的时候,以一种延迟计算(lazyevaluation)方式返回元素,这正是它的优点。比如列表含有中一千万个整数,需要占超过400M的内存,而迭代器只需要几十个字节的空间。因为它并没有把所有元素装载到内存中,而是等到调用next 方法时候才返回该元素(按需调用callby need 的方式,本质上for 循环就是不断地调用迭代器的next方法)
案例:
•for循环实现 了迭代器
–for i in[1,2,3,4]:
    print i
•文件对象提供迭代器协议
–with open('E:\\s133\\s131.txt') asf:
    for line in f:  #for循环使用迭代器协议访问文件
        print(line)

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值