Python高级特性
Posted bwon
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了Python高级特性相关的知识,希望对你有一定的参考价值。
切片(tuple)
有了切片操作,很多地方循环就不再需要了。Python的切片非常灵活,一行代码就可以实现很多行循环才能完成的操作。
- 操作对象:list、tuple、str;替代了其他语言的截取函数,如
substring()
- 应用场景:对经常取指定索引范围的操作,用循环十分繁琐,因此,Python提供了切片(Slice)操作符,能大大简化这种操作。
- 使用方法:如
Mylist[0:5]
表示,从索引0开始,直到索引5为止;但不包括索引5,即索引0,1,2,3,4,正好5个元素。如果第一个索引是0还可以省略,如Mylist[:]
;还支持步长,如每两个取一个Mylist[::2]
迭代(Iterable)
- 定义:给定一个list或tuple,我们可以通过for循环来遍历这个list或tuple,这种遍历我们称为迭代(Iteration)
- 场景:任何可迭代对象都可以作用于for循环,包括我们自定义的数据类型,只要符合迭代条件,就可以使用for循环。
- 判断:使用函数
isinstance(object,Iterable)
判断结果反馈True为可迭代、返回False为不可迭代。
- 语法:迭代元素
for var in IterObject
,下标方式迭代for i,value in enumerate(object)
列表生成式(list generator)
- 定义:运用列表生成式,可以快速生成list,可以通过一个list推导出另一个list,而代码却十分简洁。
- 语法:如
newList = [x*x for x in oldList if x % 2 == 0]
解释为用oldList列表中偶数元素的平方生成一个新列表newList。
生成器(generator)
- 定义:在Python中,一边循环一边计算的机制,称为生成器:generator。
- 原理:generator保存的是算法,每次调用next(g),就计算出g的下一个元素的值,直到计算到最后一个元素,没有更多的元素时,抛出StopIteration的错误。
- 创建方法:
- 创建L和g的区别仅在于最外层的[]和(),L是一个list,而g是一个generator。
- 用函数构建,内部使用
yield
关键字
- 创建L和g的区别仅在于最外层的[]和(),L是一个list,而g是一个generator。
- 区别:
- 空间区别:列表生成式,是一次性重建出所有元素,并开辟内存空间;生成器是按照某种算法推算出需要的元素,能够节省大量空间。
- 函数区别:普通函数顺序执行,遇到
return
或最后一行语句返回。generator函数,每次调用next()
时候执行,遇到yield
语句返回,再执行时从上次返回的yield
处继续执行。
- 空间区别:列表生成式,是一次性重建出所有元素,并开辟内存空间;生成器是按照某种算法推算出需要的元素,能够节省大量空间。
- 语法:
g = (x * x for x in range(10))
或者如下所示:
def fib(max):
n, a, b = 0, 0, 1
while n < max:
print(b)
a, b = b, a + b
n = n + 1
return 'done'
迭代器(Iterator)
- 定义:
可以直接使用for
循环的数据类型如下:- 集合数据类型:如
list tuple dict set str
- generator类型:包括生成器和带yield的generator function
以上可以直接作用于for
循环的对象统称为可迭代对象:Iterable
- 集合数据类型:如
- 判断:是否是
Iterable
对象,可以被next()
函数调用并不断返回下一值得对象称为迭代器,可以用函数isinstance(object,Iterable)
判断。
- 转换:生成器都是
Iterator
对象,但list、dict、str
虽然是Iterable
,却不是Iterator
,把list、dict、str
等Iterable
变成Iterator
可以使用iter()
函数。
- 理解:为什么
list、dict、str
等数据类型不是Iterator
?
这是因为Python的Iterator对象表示的是一个数据流,Iterator对象可以被next()函数调用并不断返回下一个数据,直到没有数据时抛出StopIteration错误。可以把这个数据流看做是一个有序序列,但我们却不能提前知道序列的长度,只能不断通过next()函数实现按需计算下一个数据,所以Iterator的计算是惰性的,只有在需要返回下一个数据时它才会计算。Iterator甚至可以表示一个无限大的数据流,例如全体自然数。而使用list是永远不可能存储全体自然数的
以上是关于Python高级特性的主要内容,如果未能解决你的问题,请参考以下文章