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

来源:互联网 发布:linux 设置命令别名 编辑:程序博客网 时间:2024/05/17 06:49

随机数

函数名称函数功能参数说明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)

阅读全文
'); })();
0 0
原创粉丝点击
热门IT博客
热门问题 老师的惩罚 人脸识别 我在镇武司摸鱼那些年 重生之率土为王 我在大康的咸鱼生活 盘龙之生命进化 天生仙种 凡人之先天五行 春回大明朝 姑娘不必设防,我是瞎子 拆迁安置房可以买卖吗 现在适合做什么小买卖 北京经济适用房可以买卖吗 2018年公租房租满5年买卖政策 千万别买名图 名图怎么样值得买吗 千万别买名龙堂主机 买名图后悔了 正品名器哪里买 易买吧返利网 穷人就买轩逸经典吧 买沃尔沃的是傻了吧 买吧app 为什么买平安福很多人后悔啊 现在买什么手机好啊 买什么手机好啊 买排骨吃不香啊 孩子一般买什么保险好啊 买啊 日本啥东西值得买 日本有啥好东西值得买 牙疼买啥药 十万左右买啥车 五万左右能买啥车 2018三万块能买啥车 男人熬夜上夜班买啥吃好 2018年买国五车能开几年 国五车还能买吗 2019年买国五车明智吗 2019年买国五车能开几年 二手国三车还能买吗 现在买国五车合适吗 2018年买国五车明智吗 2019年买国v还是国vi 国4车还能买吗 现在买车买国5还是国6 护眼灯买国a还是买国aa 秦pro2019国六为什么没人买 国5车还能买吗 国五车 建议买国六还是国五的车