首页 > 代码库 > 生成器,迭代器,列表生成式,随机数

生成器,迭代器,列表生成式,随机数

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

 

生成器,迭代器,列表生成式,随机数