【备注:本文是学习http://blog.youkuaiyun.com/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作为第二个参数,依次累进,直到序列为空,所以最终返回的结果只有一个数
【热爱工作,热爱生活】