迭代器、装饰器、算法基础、
迭代器
访问集合元素的一种方式,从集合的第一个元素访问,知道所有的元素被访问完结束,只能往前不能后退,
一大优点是不要求实现准备好整个迭代过程
中的所有元素。坑爹嗲气仅仅在迭代到某个元素时才计算该元素,在这之前,该元素可以不存在或者被销毁,这个特点使得它适用于遍历一些巨大的或是无限的集合,比如几个G的文件。
特点:
- 访问者不需要关心迭代器内部的结构,仅仅通过next()方法不断的取下下一个内容
- 不能随机的访问集合中的某个值,只能从头到尾的依次访问
- 访问到一半时不能往后退
- 便于循坏比较大的数据集合,节省内存。
生成一个迭代器
def cash_out(amount):
while amount > 0:
amount -= 1
yield 1
print("擦,又来取钱了。。
败家子。")
ATM = cash_out(5)
print("取到钱 %s 万" % ATM.__next__())
print("花掉花掉!")
print("取到钱 %s 万" % ATM.__next__())
print("取到钱 %s 万" % ATM.__next__())
print("取到钱 %s 万" % ATM.__next__())
print("取到钱 %s 万" % ATM.__next__())
作用 这个yield的主要效果,就是可以使得函数中断,并保存中断状态,中断后,代码可以继续向下执行,过一段时间还可以在重新调用这个函数,从上次yield的下一句执行。
另外,还可通过yield实现在单线程的情况下实现并发运算的效果,
import time
def consumer(name):
print("%s 准备吃包子啦!" % name)
while True:
baozi = yield
print("包子[%s]来了,被[%s]吃了!" % (baozi, name))
def producer(name):
c = consumer('A')
c2 = consumer('B')
c.__next__()
c2.__next__()
print("老子开始准备做包子啦!")
for i in range(10):
time.sleep(1)
print("做了2个包子!")
c.send(i)
c2.send(i)
算法基础
要求生成一个4*4维数组并将其顺时针旋转90度
array = [[col for col in range(5)] for row in range(5)] # 初始化4维数组
for row in array
print(row)
for i, row in enumerate(array):
for index in range(i, len(row)):
tmp = array[index][i] # get each rows' data by column's index
array[index][i] = array[i][index] #
print tmp, array[i][index] # = tmp
array[i][index] = tmp
for r in array:
print r
print('--one big loop --')
冒泡排序
将一个不规则的数组按从小到大的顺序进行排序
data = [10,4,5,1,98,14,33,13,16,72,21]
print("before sort", data)
for j in range(len(data)):
tmp = 0
for i in range(len(data)-1):
if data[i] > data[i+1]:
tmp = data[i]
data[i] = data[i+1]
data[i+1] = tmp
print(data)
print("after sort", data)
时间复杂度
- 时间频度 一个算法执行所耗费的时间,从理论上不能算出来,必须主机上运行测试才能知道,但我们不可能也没有必要对每个算法上机测试,只需知道那个算法花费的时间多,那个算法花费的时间少就可以了,并且一个算法花费时间与算法中语句执行的次数成正比。
- 时间复杂度 一般情况下,算法中基本操作重复执行的次数是问题规模n的某个数量级函数,用T(n)表示,若有某个辅助函数f(n),使得n趋近于无穷大时,T(n)/f(n)的极限值不等于零的常数,则称f(n)是T(n)的同数量级函数,记作T(n)=O(f(n)),称0(f(n))为算法的渐进时间复杂度,简称时间复杂度。
指数时间
指的是一个问题解决所需要的计算时间m(n),依次输入数据的大小n而呈指数成长
for (i=1; i<=n; i++)
x++;
for (i=1; i<=n; i++)
for (j=1; j<=n; j++)
x++;