生成器,迭代器,列表生成式,随机数
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