迭代器
__iter__方法返回一个迭代器,它是具有__next__方法的对象。在调用__next__方法时,迭代器会返回它的下一个值,若__next__方法调用迭代器
name = iter([‘koka‘,‘lolo‘,‘lala‘]) print(name.__next__()) print(name.__next__()) print(name.__next__())
def cash_out(amount): print("欢迎登录ATM") 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("花掉花掉!") print("取到钱 %s 万" % ATM.__next__()) print("取到钱 %s 万" % ATM.__next__()) print("取到钱 %s 万" % ATM.__next__()) #到这时钱就取没了,再取就报错了 Traceback (most recent call last): File "D:/home/new.py", line 42, in <module> print("取到钱 %s 万" % ATM.__next__()) #到这时钱就取没了,再取就报错了 StopIteration
#使用yied语句,函数就会被冻结:即函数停在那点等待被激活。函数被激活后就从停止的那点开始执行。
li = [[1,2,],[3,4],[5]] def flatten(li): for sublist in li: for item in sublist: yield item for j in flatten(li): print(j) 递归生成器: def flatten(li): try: #不要迭代类似字符串的对象, try:li + ‘‘ except TypeError:pass else:raise TypeError for sublist in li: for item in flatten(sublist): yield item except TypeError: yield li li = [[[1,2,3],[4,5],[6],[7],[8],[‘a‘],[[9,10],11],12]] ok = flatten(li) for i in ok: print(i)
#使用yield实现在单线程的情况下实现并发运算的效果 import time def consumer(name): print("%s 准备吃包子!"%name) while True: baozi = yield print("包子[%s]来了,被[%s]吃了!" %(baozi,name) def producer(name): c = consumer(‘A‘) d = consumer(‘B‘) c.__next__() d.__next__() print("开始生产包子!") for i in range(5): time.sleep(1) print("做了2个包子!") c.send(i) d.send(i) producer(‘koka‘)
装饰器:
装饰器的作用就是为已经存在的对象添加额外的功能。
装饰器: def w1(func): def inner(arg): print("通过验证!!!") return func(arg) return inner @w1
def f1(arg): print("欢迎%s来到TV页面" %arg) f1(‘abc‘)
#调用过程;
#加载w1函数
#遇见@1,执行w1函数,将f1函数传入到w1函数,
#将执行完的w1函数的返回值赋值给f1 @w1 f1=w1(f1)
#调用重新赋值的f1(arg)时,即运行w1函数内部的inner(arg)函数。
详细过程如下:
当写完这段代码后(函数未被执行、未被执行、未被执行),python解释器就会从上到下解释代码,步骤如下:
没错,从表面上看解释器仅仅会解释这两句代码,因为函数在没有被调用之前其内部代码不会被执行。
从表面上看解释器着实会执行这两句,但是 @w1 这一句代码里却有大文章,@函数名 是python的一种语法糖。
如上例@w1内部会执行一下操作:
递归:
这里的关键就是将问题分解为小部分,递归不能永远继续下去,因为它总是以最小可能性问题结束,而这些问题又存储在基本实例中。
阶乘: * 1的阶乘是1; * 大于1的数n的阶乘是n乘n-1的阶乘 def factorial(n): if n == 1: return 1 else: return n * factorial(n-1) 阶幂: * 对于任何数字x来说,power(x,0)是1; * 对于任何大于0的数来说,power(x,n)是x乘以(x,n-1)的结果。 def power(x,n): if x == 0: return 1 else: return x * power(x,n-1)
查看递归过程:
def cacl(n): print(n) if n/2 > 1: res = cacl(n/2) print("res:",res) print("N:",n) return n cacl(18) 18 9.0 4.5 2.25 1.125 N: 1.125 res: 1.125 N: 2.25 res: 2.25 N: 4.5 res: 4.5 N: 9.0 res: 9.0 N: 18
二元查找:
def search(data,find_num): mid = int( len(data) / 2) mid_value = data[mid] if len(data) == 1 and data[0] == find_num: #当列表中只有一个数时,判断该数是否存在。 print("find %s" %find_num) elif len(data) >1: if mid_value > find_num: return search(data[:mid],find_num) elif mid_value < find_num: return search(data[mid:],find_num) else: print("find %s" %data[mid]) else: print("cannot find [%s] in data_list" %find_num) if __name__ == "__main__": data = list(range(100)) search(data,0)
原文:http://www.cnblogs.com/koka24/p/5159087.html