Python之高级特性

3.高级特性

3.1切片

L = list(range(100))

L[0:3]表示,从索引0开始取,直到索引3为止,但不包括索引3

如果第一个索引是0,还可以省略  L[:3]

也支持取倒数元素 L[-2:] 取L集合的倒数2位元素

L[10:20] 取前11-20个数:

L[:10:2]取前10个数,每两个取一个

L[::5]  所有数,每五个取1个

'ABCDEFG'[:3]

Python没有针对字符串的截取函数,只需要切片一个操作就可以完成,非常简单

 

3.2 迭代

python中不管迭代对象有无下标,都可以进行迭代

那么如何判断一个对象是否可迭代呢?from collections import Iterable

isinstance('abc', Iterable) ;

在Java里可以迭代下标,python里可以使用enumerate 函数迭代索引和元素的

for i, value in enumerate(['A', 'B', 'C']):

...     print(i, value)

 

3.3 列表生成,是Python内置的非常简单却强大的可以用来创建list的生成式。

L = []

>>> for x in range(1, 11):

...    L.append(x * x)#使用循环

 

#使用列表生成式

[x*x for x in range(1,11)if x%2 == 0]  #要生成的元素x*x放置前面

#使用2层循环,生成全排列

[m+n for m in 'ABC' for n in 'XYZ']

 

import os # 导入os模块,模块的概念后面讲到

>>> [d for d in os.listdir('.')] # os.listdir可以列出文件和目录

#for循环其实可以同时使用两个甚至多个变量,比如dict的items()可以同时迭代key和value:

d = {'x': 'A', 'y': 'B', 'z': 'C' }

>>> for k, v in d.items():

...     print(k, '=', v)

#列表生成式也可以使用两个变量来生成list:

 d = {'x': 'A', 'y': 'B', 'z': 'C' }

>>> [k + '=' + v for k, v in d.items()]

['y=B', 'x=A', 'z=C']

#list中所有的字符串变成小写:

L = ['Hello', 'World', 18, 'Apple', None]

>>> [s.lower() for s in L if isinstance(s,str) == True]

 

3.4 生成器

列表的空间是有限的,在python中,一边循环一边计算的机制 generator

g = (x * x for x in range(10))

for n in g:

         print(n)

         #著名的斐波拉契数列(Fibonacci),除第一个和第二个数外,任意一个数都可由前两个数相加得到:1, 1, 2, 3, 5, 8, 13, 21, 34, ...

         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仅一步之遥。要把fib函数变成generator,只需要把print(b)改为yield b就可以了:

#generator函数  在执行过程中,遇到yield就中断,下次又继续执行。

##杨辉三角

def triangles():

    L = [1] #定义一个list[1]

    while True:

        yield L

        L = [L[i] + L[i + 1] for i in range(len(L) - 1)]

        L.insert(0,1)

        L.append(1)

        if(len(L)>10):

        break

#生成一个generator对象,然后通过for循环迭代输出每一行

a=triangles(10)

for i in a:

    print(i)

 

3.5迭代器

直接作用于for循环的数据类型有以下几种:

一类是集合数据类型,如list、tuple、dict、set、str等;

一类是generator,包括生成器和带yield的generator function。

 Iterable 这些可以直接作用于for循环的对象统称为可迭代对象:Iterable。

可以使用isinstance()判断一个对象是否是Iterable对象:

isinstance({}, Iterable)  #True

 

 Iterator  可以被next()函数调用并不断返回下一个值的对象称为迭代器:Iterator

可以使用isinstance()判断一个对象是否是Iterator对象:

isinstance((x for x in range(10)), Iterator)  #True

 isinstance('abc', Iterator)  #False

-------------------------------------------------------------

是因为Python的Iterator对象表示的是一个数据流,Iterator对象可以被next()函数调用并不断返回

下一个数据,直到没有数据时抛出StopIteration错误。可以把这个数据流看做是一个有序序列,

但我们却不能提前知道序列的长度,只能不断通过next()函数实现按需计算下一个数据,

所以Iterator的计算是惰性的,只有在需要返回下一个数据时它才会计算。

-------------------------------------------

集合数据类型如list、dict、str等是Iterable但不是Iterator,不过可以通过iter()函数获得一个Iterator对象。

posted @ 2017-11-28 18:00  smartwen  阅读(469)  评论(0编辑  收藏  举报