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

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 None

g=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**3

a=[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=t
3 a=t[0]
4 b=t[1]
5 print(a)
6 print(b)
结果为:
123
8

4.  随机数(random)

4.1  生成随机数

1 import random
2 print(random.random())   显示结果为:
0.4752407699919545

4.2

import random
print(random.randint(1,8))#  这里是包括8的  产生一个1到8之间随机的整数
print(random.randrange(1,3))#这里是不包括3的

4.3

import random
print(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

原文地址:https://www.cnblogs.com/mars527/p/5893832.html