首页 > 编程语言 > 详细

Day 4 Python之循序渐进4

时间:2016-02-21 18:36:11      阅读:284      评论:0      收藏:0      [点我收藏+]

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这么写此方法
迭代器iter
技术分享
 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")
yield实现在单线程的情况下实现并发运算的效果

4.装饰器原理介绍和基本实现

 

5.装饰器实现

 

6.实现带参数的复杂装饰器

 

7.递归原理及实现

 

8.通过递归实现斐波那契数列

 

9.算法基础之二分查找

 

10.算法基础之2维数组90度旋转

 

11.正则表达式基础

 

Day 4 Python之循序渐进4

原文:http://www.cnblogs.com/leon2012/p/5182546.html

(0)
(0)
   
举报
评论 一句话评论(0
关于我们 - 联系我们 - 留言反馈 - 联系我们:wmxa8@hotmail.com
© 2014 bubuko.com 版权所有
打开技术之扣,分享程序人生!