【备注:本文是学习http://blog.csdn.net/ithomer/article/details/8907268过程中记下的笔记】
【EX:所注为代码示例】
【Tips:所注为标识,可能是一个小技巧】
一.进阶05 循环设计
1.range()的应用
EX:
>>> m = [1,2,3,4,5,6] >>> for i in range(0,len(m),2)://利用range(起始位置,总长,每次跳跃步长)取值 print m[i] 1 3 5
Tips:字典是无序的,不支持下标索引,所以对于字典的循环应该用key值进行循环
EX:
>>> M = {'a':1,'b':2,'c':3} >>> for key in M: print key,M[key] a 1 c 3 b 2
2.enumerate()的应用 实现同时输出下标与元素
EX:
>>> m = [1,2,3,4,5,6] >>> for(index,int) in enumerate(m): print index,int 0 1 1 2 2 3 3 4 4 5 5 6
3.zip的应用 实现几个等长序列的同时输出,注:如果各序列不等长则输出长度以众序列中最短者为标准
EX:
>>> ta = [1,2,3,4] >>> tb = [3,4,5] >>> tc = [6,7,8] >>> for (a,b,c)in zip(ta,tb,tc): print(a,b,c) (1, 3, 6) (2, 4, 7) (3, 5, 8)
※zip也可将众序列组合起来,也就是包裹起来,在使用时可以进行解包裹
EX:
>>> s = zip(ta,tb,tc)//将上面的ta,tb,tc包裹起来组合成一个 >>> s [(1, 3, 6), (2, 4, 7), (3, 5, 8)] >>> sa,sb,sc = zip(*s)//解包裹 >>> sa (1, 2, 3) >>> sb (3, 4, 5) >>> sc (6, 7, 8)
二.进阶06 循环对象
1.什么是循环对象
我理解的循环对象就相当于C++里的迭代器,可以取其下一个元素,直到遇到“StopIteration”错误就停止,相当于迭代器的end()
实质上,我们所说的循环对象在python内部实现时就是将其转化为迭代器iterator来实现的
EX:
>>> f = open("D:aa.txt",'w')//新建一个txt文件 >>> f.write("hello\n")//写入两行内容 >>> f.write("world\n") >>> f.close() >>> f = open("D:\\aa.txt")//用open()方法打开文件,open函数返回一个循环对象,赋给f,那么f现在就是一个循环对象 >>> f.next()//使用循环对象的next()方法,next()方法返回新一行的内容 'hello\n' >>> f.next() 'world\n' >>> f.next() Traceback (most recent call last)://直到遇到StopIteration错误,停止 File "<pyshell#38>", line 1, in <module> f.next() StopIteration
这样我们就手动遍历输出txt文件的内容,下面 我们写一个for循环输出:
>>> for line in open("D:\\aa.txt")://for循环自动调用open()返回的循环对象的next()方法,然后将返回的文本内容赋值给line print line hello world
2.生成器 实现用户自定义循环对象
生成器的写法类似于函数,只不过带有一个以上yield语句,在执行生成器时,在遇到yield语句时,生成器暂停执行并返回一个中间结果(返回yield语句后紧跟的东西)
在生成器next方法被调用时,他会准确的从刚才暂停的地方继续执行直到结束时抛出StopIteration异常
3.生成器表达式 用一个表达式所表达的生成器
我们先定义一个生成器:
>>> def simpleGen(): for i in range(5)://用了一个循环生成了5个yield语句 yield i >>> for i in simpleGen()://使用该生成器 print i 0 1 2 3 4
其实我们可以把上面定义生成器的语句写为一个表达式,完成同样的功能: G = (x for x in range(5))
效果检测:
>>> for i in G: print i 0 1 2 3 4
4.表推导 实现快速生成表即序列
方法1:用循环生成表 方法二:用表推导的方式,其实就是“表生成表达式”,用一个表达式生成表
>>> for i in range(5): >>> L = [i for i in range(5)]
L.append(i) >>> L
[0, 1, 2, 3, 4]
>>> L
[0, 1, 2, 3, 4]
三、进阶07 函数对象
1.在前面我们学习到Python是一个面向对象语言,那么就离不开对象。我们所定义的函数,其实也是一个对象。既然是对象,那么就具有属性、可以作为参数传给别的函数
2.定义函数的方法:way1:def way2:lambda
这两个方法的效果其实是一样的,都是生成了一个函数对象
EX:>>> def func(a,b): 等价于>>> func = lambda x,y:x+y
return a+b >>> print func(3,4)
7
>>> func(3,4)
7
3.几个操作函数对象的方法
3.1 map()函数
EX: >>> re = map((lambda x:x**2),[1,2,3,4]) >>> re [1, 4, 9, 16]
如上所示,map函数有两个参数,一个是函数对象,另一个是一组序列。函数执行过程:将序列中的元素便利传入参数1的函数中,将函数返回的结果存入=左边的序列中
EX:
>>> re = map(func,[1,2,3,4],[2,3,4,5]) >>> re [3, 5, 7, 9]
3.2 fliter()
EX:
>>> def func(a): if a>10: return True else: return False >>> res = filter(func,[1,2,31,30,21,31]) >>> res [31, 30, 21, 31]
如上所示,filter的意思是滤去,所以其函数的意思是“滤去返回值为false的值”,存储参数2中调用func函数后返回值为True的元素
3.3reduce()
EX:
>>> res = reduce((lambda x,y:x+y),[1,2,3,4]) >>> res 10
该函数只能传入两个参数,filter累进地将函数作用于各个参数。所谓“累进”就是第一次调用lambda返回的函数对象时传入1,2两个元素,下一次调用时将上一次的运算结果作为第一个参数,将序列中的2作为第二个参数,依次累进,直到序列为空,所以最终返回的结果只有一个数
【热爱工作,热爱生活】