首页 > 代码库 > 生成器,迭代器,列表生成式,随机数
生成器,迭代器,列表生成式,随机数
1.生成器
1.1 2016-09-22 18:52:55
生成器是一次生成一个值的特殊类型函数。可以将其视为可恢复函数。调用该函数将返回一个
可用于生成连续x值的生成器【Generator】,简单的说就是在函数的执行过程中,
yield语句会把你需要的值返回给调用生成器的地方,然后退出函数,下一次调用生成器函数的时候
又从上次中断的地方开始执行,而生成器内的所有变量参数都会被保存下来供下一次使用。
1 s=[x*2 for x in range(100)]2 print(s)3 l=[1,2,3]4 a=l[1]5 b=l[2]6 print(a)7 print(b)
1.1 生成器一共2种创建方式
(1) (x*2 for i in range(5))
(2) yield
1.1.1首先我们来看一个例子
s=(x*2 for x in range(100))print(s) #<generator object <genexpr> at 0x000000E30D087888> 这是一个生成器对象,现在拿到的仅仅是一个对象,值取不到,要取值的话可以这样
s=[x*2 for x in range(100)]
l=[1,2,3]a=l[1]b=l[2]print(a)print(b)
1 # s=(x*2 for x in range(5)) 2 # 3 # print(s) #<generator object <genexpr> at 0x0000000000A0C0F8> 4 # print(next(s)) # 等价于s.__next__() in Py2: s.next()因为有好多公司还是用的2版本 5 # print(next(s)) 6 # print(next(s)) 7 # print(next(s)) 8 # print(next(s)) 9 10 # print(next(s))# 只有5个超过就会报错 StopIteration
生成器就是一个可迭代对象
#生成器就是一个可迭代对象(Iterable)
# s=(x*2 for x in range(5))
# for i in s:# print(i) 第一次 打印的i是0,但是第二次打印的时候 第一次的i就被当成垃圾处理了,就是一次只有一个i
关于这一块 我有点迷糊,后续会补充
def foo(): print(‘ok‘) yield 1 print(‘ok2‘) yield 2 return Noneg=foo()print(g)#<generator object foo at 0x0000000000B3D0A0>a=next(g)b=next(g)print(a,b)#next(g)# for i in foo():# while True:# i=next(foo())## print(i)
1.1.2可迭代对象
1 #什么是可迭代对象(对象拥有iter方法的成为可迭代对象) 2 l=[1,2,3] 3 l.__iter__() 4 5 t=(1,2,3) 6 t.__iter__() 7 8 d={‘name‘:‘123‘} 9 d.__iter__()10 11 for i in [1,2,3]:12 print(i)
1.1.3 来看一下菲波那切数列的 一个例子
1 # 0 1 1 2 3 5 8 13 21 2 def fib(max): 3 n, before, after = 0, 0, 1 4 while n < max: 5 print(before) 6 #yield before 7 before,after=after,before+after 8 n = n + 1 9 g=fib(8)10 print(g)#<generator object fib at 0x0000000000B3D0A0>
1 # def bar(): 2 # print(‘ok1‘) 3 # count=yield 1 4 # print(count) 5 # 6 # yield 2 7 # 8 # b=bar() 9 # # b.send(None)#next(b) 第一次send前如果没有next,只能传一个send(None)10 # next(b)11 # # print(s)12 # ret=b.send(‘eeee‘)13 # print(ret)
(2) yield伪并发
1 import time 2 3 # def consumer(name): 4 # print("%s 准备吃包子啦!" %name) 5 # while True: 6 # baozi = yield 7 # 8 # print("包子[%s]来了,被[%s]吃了!" %(baozi,name)) 9 10 11 # def producer(name):12 # c = consumer(‘A‘)13 # c2 = consumer(‘B‘)14 # c.__next__()15 # c2.__next__()16 # print("alex开始准备做包子啦!")17 # for i in range(10):18 # time.sleep(1)19 # print("做了2个包子!")20 # c.send(i)21 # c2.send(i)22 # producer("alex")
3.列表生成式
def f(n): return n**3a=[f(x) for x in range(10)]print(a)print(type(a))
结果显示为:
[0, 1, 8, 27, 64, 125, 216, 343, 512, 729]<class ‘list‘>
1 t=[‘123‘,8]2 a,b=t3 a=t[0]4 b=t[1]5 print(a)6 print(b)
结果为:
123
8
4. 随机数(random)
4.1 生成随机数
1 import random2 print(random.random()) 显示结果为:
0.4752407699919545
4.2
import randomprint(random.randint(1,8))# 这里是包括8的 产生一个1到8之间随机的整数
print(random.randrange(1,3))#这里是不包括3的
4.3
import randomprint(random.choice("hello"))#产生这个字符的一个随机字母
print(random.choice([[1,23],1,5])) # 产生这个列表中的随机一个值
print(random.sample([‘123‘,4,[1,2]],2)) #随机取出2个元素
4.4 产生一个5位的验证码(字母加数字)
1 def v_code(): 2 code=‘‘ 3 for i in range(5): 4 add=random.choice([random.randrange(10),chr(random.randrange(65,91))]) 5 # if i==random.randint(0,3): 6 # add = random.randrange(10) 7 # 8 # else: 9 # add=chr(random.randrange(65,91))10 code+=str(add)11 print(code)12 v_code()
结果为:随机一个
FR2HN
生成器,迭代器,列表生成式,随机数
声明:以上内容来自用户投稿及互联网公开渠道收集整理发布,本网站不拥有所有权,未作人工编辑处理,也不承担相关法律责任,若内容有误或涉及侵权可进行投诉: 投诉/举报 工作人员会在5个工作日内联系你,一经查实,本站将立刻删除涉嫌侵权内容。