1.迭代器原理及使用
迭代器原理:
迭代器是访问集合元素的一种方式。迭代器对象从集合的第一个元素开始访问,直到所有的元素被访问完结束。迭代器只能往前不会后退,不过这也没什么,因为人们很少在迭代途中往后退。另外,迭代器的一大优点是不要求事先准备好整个迭代过程中所有的元素。迭代器仅仅在迭代到某个元素时才计算该元素,而在这之前或之后,元素可以不存在或者被销毁。这个特点使得它特别适合用于遍历一些巨大的或是无限的集合,比如几个G的文件
特点:
访问者不需要关心迭代器内部的结构,仅需通过next()方法不断去取下一个内容
不能随机访问集合中的某个值 ,只能从头到尾依次访问
访问到一半时不能往回退
便于循环比较大的数据集合,节省内存
1 #! /usr/bin/env python 2 # -*- coding:utf-8 -*- 3 4 # linux中的cat就类似于迭代的形势,读一行显示一行,减少内存利用率,速度快 5 6 names = iter([‘leon‘,‘jack‘,‘list‘,‘offer‘]) 7 print(names) 8 print(names.__next__()) 9 print(names.__next__()) 10 print(names.__next__()) 11 print(names.__next__()) 12 # print(names.next()) 2.7这么写此方法
1 迭代器 2 作为遍历集合 ===,一般通过for循环间接使用 3 4 循环 5 1.while 6 索引,下标取数据,随意取值 7 2.for 8 a)执行迭代器,获取一个对象 9 b) 执行对象的next方法 10 11 引出: 12 iter(迭代器),获得一个具有next方法的对象 13 --->顺序去取 14 15 需求: 16 li = [11,22,33,44,55] 17 打印元素 18 19 i = len(li) 20 # i = 0 -->False,其他为Ture 21 start = 0 22 while i>start 23 print(li[start]) 24 start += 1 25 #while 使用索引(下标随意取数据),start为变量,所有的语言几乎都支持while循环的方式,但写起来麻烦 26 27 #于是出现for: 28 29 for item in li: 30 print(item) 31 32 obj = iter(li) 33 print(obj._next_()) 34 #使用本质,创建一个for循环 35 36 obj = iter(li) 37 while True: 38 try: 39 item = obj._next_() 40 print(item) 41 except Exception: 42 pass 43 44 45 #for循环的本质: 46 1.创建一个特殊的东西(迭代器),获取到一个具有next方法的对象 47 2.依据这个东西去操作列表li中的内容 48 49 50 迭代器 = iter() 51 执行迭代器返回一个对象,对象是含有next方法(操作列表中的内容)
2.生成器的使用
生成器generator
定义:一个函数调用时返回一个迭代器,那这个函数就叫做生成器(generator),如果函数中包含yield语法,那这个函数就会变成生成器
代码:
1 #! /usr/bin/env python 2 # -*- coding:utf-8 -*- 3 4 # 定义:一个函数调用时返回一个迭代器,那这个函数就叫做生成器(generator),如果函数中包含yield语法,那这个函数就会变成生成器 5 def cash_out(amount): 6 while amount >0: 7 amount -= 1 8 yield 1 # 注意与return的区别,yield退出循环又能再进去 9 print("擦,又来取钱了。。。败家子!") 10 11 ATM = cash_out(5) 12 13 print("取到钱 %s 万" % ATM.__next__()) 14 print("花掉花掉!") 15 print("取到钱 %s 万" % ATM.__next__()) 16 print("取到钱 %s 万" % ATM.__next__()) 17 print("花掉花掉!") 18 print("取到钱 %s 万" % ATM.__next__()) 19 print("取到钱 %s 万" % ATM.__next__()) 20 print("取到钱 %s 万" % ATM.__next__()) #到这时钱就取没了,再取就报错了 21 print("取到钱 %s 万" % ATM.__next__())
#! /usr/bin/env python # -*- coding:utf-8 -*- def cash_money(amount): while amount >0: amount -=100 yield 100 print("又来取钱了") # 注意与return的区别,yield退出循环又能再进去 atm = cash_money(500) print(type(atm)) print(atm.__next__()) print(atm.__next__()) print("断点插入,嘻哈测试") print(atm.__next__())
3.使用yield实现单线程中的异步并发效果
作用:
yield的主要效果就是可以使函数中断,并保存中断状态,中断后,代码可以继续往下执行,过一段时间还可以再重新调用这个函数,从上次yield的下一句开始执行。
另外,还可通过yield实现在单线程的情况下实现并发运算的效果
1 #! /usr/bin/env python 2 # -*- coding:utf-8 -*- 3 4 import time 5 def consumer(name): 6 print("%s 准备吃包子啦!" %name) 7 while True: 8 baozi = yield 9 10 print("包子[%s]来了,被[%s]吃了!" %(baozi,name)) 11 12 def producer(name): 13 c = consumer(‘A‘) 14 c2 = consumer(‘B‘) 15 c.__next__() 16 c2.__next__() 17 print("开始准备做包子啦!") 18 for i in range(10): 19 time.sleep(1) 20 print("做了2个包子!") 21 c.send(i) # 通过send方法传给yield接收 22 c2.send(i) 23 24 producer("leon")
4.装饰器原理介绍和基本实现
5.装饰器实现
6.实现带参数的复杂装饰器
7.递归原理及实现
8.通过递归实现斐波那契数列
9.算法基础之二分查找
10.算法基础之2维数组90度旋转
11.正则表达式基础
原文:http://www.cnblogs.com/leon2012/p/5182546.html