python入门学习之高级特性

一 前言

  学习高级特性的时候也许会感觉到有些许的难,这些新的特性在以前c/c++中是没有遇到过的,而且c/c++也不支持这样简便但又强大的语法。

二 切片

  谈到切片,可以想像到切萝卜,拿到萝卜的某一段,用这个来比喻这里的切片非常贴切。python中的切片操作就是取list或者tuple中的某一段。

  比如,有以下定义的list:

#define a listl=[‘luffy’,’corey’,’nancy’,’jeffrey’,’kyle’,’avery’,’jason’,’sunny’]

  取其前3个元素的方法有两种,代码如下:

>>> l[:3][‘luffy’, ‘corey’, ‘nancy’]>>> l[0:3][‘luffy’, ‘corey’, ‘nancy’]

  也就是说,从0开始的话可以省略。

  取第2个到第4个元素的代码如下:

>>> l[1:5][‘corey’, ‘nancy’, ‘jeffrey’, ‘kyle’]

  取倒数第2个直到最后一个的代码如下:

>>> l[-2:][‘jason’, ‘sunny’]

  在不知道list长度的情况下取整个list的内容,代码如下:

>>> l[:][‘luffy’, ‘corey’, ‘nancy’, ‘jeffrey’, ‘kyle’, ‘avery’, ‘jason’, ‘sunny’]

  在整个list中每2个取1个:

>>> l[::2][‘luffy’, ‘nancy’, ‘kyle’, ‘jason’]

  在list中前6个中每2个取1个:

>>> l[:5:2][‘luffy’, ‘nancy’, ‘kyle’]

  在实际的编辑代码中,经常可以把这里的切片操作中的指向list的变量替换成list本身,如下所示:

>>> [‘luffy’, ‘corey’, ‘nancy’, ‘jeffrey’, ‘kyle’, ‘avery’, ‘jason’, ‘sunny’][:3][‘luffy’, ‘corey’, ‘nancy’]

  tuple和字符串都可以看成是一个list,故上述语法也是可以对其使用的。

三 列表生成式

  列表生成式(list comprehensions)是python中内置的非常强大的用来创建list的生成式。

  最简单的例子,我们要创建一个从1到10的列表,可以用

list(range(1,11))

这样简简单单的一行代码搞定。但是要生成更复杂的列表该怎么办呢?

  生成[1×1,2×2,3×3,…,10×10]这样的列表该怎么办呢?使用循环当然是可以实现的,但是代码过于复杂,使用列表生成式则只需要如下一行代码:

>>> [x*x for x in range(1,11)][1, 4, 9, 16, 25, 36, 49, 64, 81, 100]

  如果再加上只计算偶数的平方,那也不复杂,只需要在for循环后面加上if判断条件即可。

>>> [x*x for x in range(1,11) if x % 2 == 0][4, 16, 36, 64, 100]

  还可以使用两层循环,

>>> [x+y for x in ‘abc’ for y in ‘xyz’][‘ax’, ‘ay’, ‘az’, ‘bx’, ‘by’, ‘bz’, ‘cx’, ‘cy’, ‘cz’]

  写了这么多的列表生成式,我想大家也都明白了这语法的由来。其实也就是将正常的语法反转,将最里层的计算放在最前面。如最后一个列表生成式可以写成如下正常的语法:

for x in ‘abc’: for y in ‘xyz’: print(x+y)

四 生成器

  有了列表生成式,我们可以直接创建一个列表,但是如果考虑到内存限制时,我们就不能创建元素个数很多的列表了,那此时我们该怎么办呢?

  python提供一个叫做生成器的机制,通过生成器可以推算出后续的元素,这样就不用一次创建出所有的元素。要创建一个生成器,有两种方法:

  第一种方法:把列表生成式的[]改成(),就创建了一个generator。

  如下面代码所示:

>>> g=(x for x in range(10))>>> print(next(g))0

  要获取生成器的第一个元素,可以直接对g调用next函数。当然,也可以使用for循环来遍历整个生成器下一步生成的数据。

  第二种方法:如果推算的方法过于复杂,列表生成式无法实现时,就可以通过函数来实现。相对于从列表生成式到generator,从函数到generator也很简单,只需要先写好函数,然后再在某个位置上加上yield关键字就可以了。

  比如,生成一个fibonacci数列的函数如下:

def fib(max): n, a, b = 0, 0, 1 while n < max: print(b) a, b = b, a + b n = n + 1 return 'done'

要把这个函数转换成generator,只需要把print(b)这行代码替换成yield b就可以了。

def fib(max): n, a, b = 0, 0, 1 while n < max: yield b a, b = b, a + b n = n + 1 return 'done'

含有yield关键字的函数就不再是一个函数了,而是一个generator。要注意的是,generator的执行流程与函数不一样,在遇到yield时返回,当下次再调用时再从上次返回的yield处继续执行。

五 迭代器

  可以直接作用于for循环的对象统称为可迭代对象:iterable,可以使用isinstance()判断一个对象是否是iterable对象。生成器不仅可以由for循环进行遍历,还可以使用next()遍历。我们把可以被next()函数调用并不断返回下一个值的对象统称为迭代器:iterator。

  这里要区分一个iterable和iterator,list,dict,str都是iterable,但不是iterator(可以使用iter()函数把iterable变成iterator)。iterator可以是一个无限大的数据流,不能提前知道整个序列的长度,这些都是iterable不能达到的要求。

六 后记

  这里提到的都是我在python中才学习到的一些编程的新特性。如有错误之处,敬请留言!!!

以上就是python入门学习之高级特性的内容,更多相关文章请关注php中文网(www.php1.cn)!

Posted in 未分类

发表评论