随机数
函数名称 | 函数功能 | 参数说明 |
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:位的长度生成器
生成器是这样一个函数,它记住上一次返回时在函数体中的位置。对生成器函数的第二次(或第 n 次)调用跳转至该函数中间,而上次调用的所有局部变量都保持不变。
生成器不仅“记住”了它数据状态;生成器还“记住”了它在流控制构造(在命令式编程中,这种构造不只是数据值)中的位置。
生成器的特点:
生成器是一个函数,而且函数的参数都会保留。
迭代到下一次的调用时,所使用的参数都是第一次所保留下的,即是说,在整个所有函数调用的参数都是第一次所调用时保留的,而不是新创建的
生成器表达式示例:
–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)