Python学习笔记——高级特性
2016-09-01 01:05
597 查看
继续之前的学习,下面是一些高级特性。
http://www.liaoxuefeng.com/wiki/0014316089557264a6b348958f449949df42a6d3a2e542c000/0014317568446245b3e1c8837414168bcd2d485e553779e000
1. 切片
取指定索引范围的操作,可以通过切片(slice)来实现。
如L[0:3]表示从列表索引0开始,到索引3(但不包含)的子集。
如果第一个索引是0,可以省略,如L[:3]。
Python也支持倒数切片,如L[-2:],L[-2:-1]。
切片还有第三个参数,表示每隔xx个取一个,如L[::5]表示每5个取一个。
如果都省略,则可以复制一个列表出来,如L[:]。
tuple同样也可以进行切片操作,不过结果是tuple。
字符串也可以进行切片操作,结果是字符串。
2. 迭代
Python可以通过for...in来迭代可迭代的对象。
对于dict,默认是遍历key,如果要遍历value,可以用for value in dict.values();如果要同时遍历,可以用for key, value in dict.items()。
可通过collections模块的Iterable类型来判断是否可以迭代,使用方法如下:
如果想像Java那样对list按下标进行遍历,可以使用enumerate函数,如下:
3. 列表生成式
写列表生成式式,把要生成的元素放前面,后面跟for循环,还可以加上if判断,甚至多层for循环。
比如下面的例子:
有了列表生成式,代码可以写的很简洁,比如输出当前目录下的所有文件和目录名:
4. 生成器
一边循环一边计算的机制。
第一种方法:把列表生成式的[]改成()。
第二种方法:使用yield关键字。
生成器和函数的执行流程不一样,生成器在每次调用next()时执行,遇到yield语句返回,再次执行时从上次返回的yield语句处再次执行。
使用for循环调用生成器时,是拿不到返回值的。如果想拿到返回值,必须捕获StopIteration错误,返回值包含在StopIteration的value中,如下:
杨辉三角的实现方式:
5. 迭代器
可以直接作用于for循环的对象称为可迭代对象:Iterable,可以使用isinstance()判断一个对象是否是Iterable对象。
可以被next()函数调用并不断返回下一个值得对象称为迭代器:Iterator,可以使用isinstance()判断一个对象是否是Iterator对象。
将list、dict、str等Iterable变为Iterator可以使用iter()。
Iterator的计算是惰性的,只有在需要返回下一个数据的时候才进行计算。
http://www.liaoxuefeng.com/wiki/0014316089557264a6b348958f449949df42a6d3a2e542c000/0014317568446245b3e1c8837414168bcd2d485e553779e000
1. 切片
取指定索引范围的操作,可以通过切片(slice)来实现。
如L[0:3]表示从列表索引0开始,到索引3(但不包含)的子集。
如果第一个索引是0,可以省略,如L[:3]。
Python也支持倒数切片,如L[-2:],L[-2:-1]。
切片还有第三个参数,表示每隔xx个取一个,如L[::5]表示每5个取一个。
如果都省略,则可以复制一个列表出来,如L[:]。
tuple同样也可以进行切片操作,不过结果是tuple。
字符串也可以进行切片操作,结果是字符串。
2. 迭代
Python可以通过for...in来迭代可迭代的对象。
对于dict,默认是遍历key,如果要遍历value,可以用for value in dict.values();如果要同时遍历,可以用for key, value in dict.items()。
可通过collections模块的Iterable类型来判断是否可以迭代,使用方法如下:
from collections import Iterable isinstance('abc', Iterable)
如果想像Java那样对list按下标进行遍历,可以使用enumerate函数,如下:
for i, value in enumerate(['a', 'b', 'c']): print(i, value)
3. 列表生成式
写列表生成式式,把要生成的元素放前面,后面跟for循环,还可以加上if判断,甚至多层for循环。
比如下面的例子:
[x * x for x in range(1, 11)] # [1, 4, 9, 16, 25, 36, 49, 64, 81, 100] [x * x for x in range(1, 11) if x % 2 == 0] # [4, 16, 36, 64, 100] [m + n for m in 'ABC' for n in 'XYZ'] # ['AX', 'AY', 'AZ', 'BX', 'BY', 'BZ', 'CX', 'CY', 'CZ']
有了列表生成式,代码可以写的很简洁,比如输出当前目录下的所有文件和目录名:
import os [d for d in os.listdir('.')]
4. 生成器
一边循环一边计算的机制。
第一种方法:把列表生成式的[]改成()。
g = (x * x for x in range(1, 11))
第二种方法:使用yield关键字。
生成器和函数的执行流程不一样,生成器在每次调用next()时执行,遇到yield语句返回,再次执行时从上次返回的yield语句处再次执行。
def odd(): yield 1 yield 3 yield 5 o = odd() next(o) # 1 next(o) # 3 next(o) # 5
使用for循环调用生成器时,是拿不到返回值的。如果想拿到返回值,必须捕获StopIteration错误,返回值包含在StopIteration的value中,如下:
while True: try: next(g) except StopIteration as e: print(e.value) break
杨辉三角的实现方式:
def triangle(): L = [1] while True: yield L L = [1] + [L[m] + L[m+1] for m in range(0, len(L)-1)] + [1] n = 0 for t in triangles(): print(t) n = n + 1 if n == 10: break # 输出 # [1] # [1, 1] # [1, 2, 1] # [1, 3, 3, 1] # [1, 4, 6, 4, 1] # [1, 5, 10, 10, 5, 1] # [1, 6, 15, 20, 15, 6, 1] # [1, 7, 21, 35, 35, 21, 7, 1] # [1, 8, 28, 56, 70, 56, 28, 8, 1] # [1, 9, 36, 84, 126, 126, 84, 36, 9, 1]
5. 迭代器
可以直接作用于for循环的对象称为可迭代对象:Iterable,可以使用isinstance()判断一个对象是否是Iterable对象。
from collections import Iterable isinstance('a', Iterable) # True
可以被next()函数调用并不断返回下一个值得对象称为迭代器:Iterator,可以使用isinstance()判断一个对象是否是Iterator对象。
from collections import Iterator isinstance('a', Iterator) # False
将list、dict、str等Iterable变为Iterator可以使用iter()。
Iterator的计算是惰性的,只有在需要返回下一个数据的时候才进行计算。
相关文章推荐
- Python动态类型的学习---引用的理解
- Python3写爬虫(四)多线程实现数据爬取
- 垃圾邮件过滤器 python简单实现
- 下载并遍历 names.txt 文件,输出长度最长的回文人名。
- install and upgrade scrapy
- Scrapy的架构介绍
- Centos6 编译安装Python
- 使用Python生成Excel格式的图片
- 让Python文件也可以当bat文件运行
- [Python]推算数独
- Python中zip()函数用法举例
- Python中map()函数浅析
- Python将excel导入到mysql中
- Python在CAM软件Genesis2000中的应用
- 使用Shiboken为C++和Qt库创建Python绑定
- FREEBASIC 编译可被python调用的dll函数示例
- Python 七步捉虫法