生成器:
首先介绍一下列表生成式:a=[x for x in range(10)] >>>>>>[0, 1, 2, 3, 4, 5, 6, 7, 8, 9]
a=[x*2 for x in range(10)] >>>>>>[0, 2, 4, 6, 8, 10, 12, 14, 16, 18]
注意:前面的x和后面的x一定要相同
再比方说:
def f(n):
return n**3
a=[f(x) for x in range(10)]
print(a) 所以前面也可以是函数,但是f(x)里面的x一定要和之前的对应上。
>>>>>>[0, 1, 8, 27, 64, 125, 216, 343, 512, 729]
前面所说的是列表生成式,是[],下面要讲的生成器是用的是()。
s=(x*2 for x in range(10))
print(s)
print(s._next_()) 和print(next(s))是等价的,而且后者更常用。输出的是0
只能按顺序一个一个取,不能倒序,也不能跳着取,还不能取得超出范围,会报错(stopiteration)
生成器只能通过next去拿值。
生成器本身就是一个可迭代对象(iterable)
for i in s:
print(i)
生成器一共两种创建方式:
1、(x*2 for x in range (5))
2、yield
def foo():
print("ok")
yield 1
print("ok2")
yield 2
return None #这是默认的
g=foo()
print(g)
for i in foo():
print(i)
>>>>>>ok
1
ok2
2
为什么会这样呢?因为for循环执行的代码就相当于 for i in foo(): while ture: i=next(foo())
其中i 拿到的是yield的返回值,所以,print(i)打印出的才是1和2.for循环里本身就是可以调用next的
还有就是只要有yield就是生成器。return就是普通函数。有几个yield就会有几道菜
def bar():
print("ok1")
count=yield 1
print(count)
yield 2
b=bar()
b.send(None) #第一次send前,如果没有next,那么只能传一个send(none)
ret=b.send("eee")
print(ret)
>>>>>>ok1
eee
2
send 有next的功能,但是比next相比较而言,它还可以改变生成器的值
迭代器:
l=[1,2,3,5]
d=iter(l)
print(d) 其中,l是可迭代对象,iterable。d是迭代器,iterable。
什么是迭代器?
满足两个条件:1、有iter的方法。2、有next的方法
生成器一定是迭代器但迭代器不一定是生成器。 for 循环内部的三件事:
1、调用可迭代对象的iter方法,返回一个迭代器对象
2、不断调用迭代器对象的next方法
3、处理stopiteration 模块
时间模块
import time
print(time.time()) >>>>>>1519734027.6702034 时间戳
time.sleep(3) 不是计算时间的,只是cpu不工作
时间的格式化输出
print(time.strftime("%Y--%m--%d %H:%M:%S",time.localtime())) >>>>>>2018--02--27 20:34:26 random 随机数
print(random.random())
print(random.randint(1,8)) 包括8
print(random,choice("hello")) 选择随机元素
print(random.randrange(1,3)) 不包括3
生成随机密码的代码:
import random
def v_code():
code=""
for i in range(5):
add=random.choice([random.randrange(10),chr(random.randrange(65,91))])
code+=str(add)
print(code)
v_code()