迭代器
#使a中每项+1
a = [0, 1, 2, 3, 4, 5, 6, 7, 8, 9]
for index,i in enumerate(a):
a[index] = i + 1
a = map(lambda x:x+1, a) #构建匿名函数
a = [i+1 for i in range(10)] #重新构造了一个列表(列表生成)
生成器
L = [x*x for x in range(10)]
g = (x*x for x in range(10)) #generator
生成器操作
next(g) #调出g中下一个元素的值,当没有元素时,抛出StopIteration的错误
for n in g:
print(n)
'''
迭代器Iterator,生成器是Iterator的对象可以被next()函数调用并不断返回下一个数据,直到没有数据时抛出StopIteration错误。可以把这个数据流看做是一个有序序列,但我们却不能提前知道序列的长度,只能不断通过next()函数实现按需计算下一个数据,所以Iterator的计算是惰性的,只有在需要返回下一个数据时它才会计算。
Iterator甚至可以表示一个无限大的数据流,例如全体自然数。而使用list是永远不可能存储全体自然数的
'''
#斐波拉契数列
def fib(max):
n,a,b = 0,1,1
while n < max:
print(b)
a,b =b, a+b
n = n+1
return 'done'
yield函数
def fib(max):
n,a,b = 0,0,1
while n < max:
#print(b)
yield b #generator写法,在每次调用next(g)/g.__next__()的时候执行,遇到yield语句返回,再次执行时从上次返回的yield语句处继续执行
a,b = b,a+b
n += 1
return 'done'
data = fib(10)
print(data)
print(data.__next__())
print(data.__next__())
#用循环调用generator时,发现拿不到generator的return语句的返回值。如果想要拿到返回值,必须捕获StopIteration错误,返回值包含在StopIteration的value中:
while True:
try:
x = next(data)
print('data:',x)
except StopIteration as e:
print('Generator return value:', e.value)
break
yield实现单线程情况下实现并发运算
import time
def consumer(name):
print('%s 吃饭!'%name) #引用name变量,注意字符前无逗号 ,
while True:
fan = yield
print('饭 %s 来了,被 %s 吃了!'%(fan,name))
def producer(name):
c = consumer('A')
c2 = consumer('B')
c.__next__()
c2.__next__()
print('准备做饭!')
for i in range(10):
time.sleep(0.5)
print('做好了')
c.send(i)
c2.send(i) #将i值传递到yield中
producer('cook')
装饰器
作业
模拟实现一个ATM + 购物商城程序
额度 15000或自定义
实现购物商城,买东西加入 购物车,调用信用卡接口结账
可以提现,手续费5%
每月22号出账单,每月10号为还款日,过期未还,按欠款总额 万分之5 每日计息
支持多账户登录
支持账户间转账
记录每月日常消费流水
提供还款接口
ATM记录操作日志
提供管理接口,包括添加账户、用户额度,冻结账户等。。。
用户认证用装饰器