Python的高级特性

Python的高级特性

Python与许多编程语言一样,提倡代码简单精炼。

因此正确的使用高级特性,可以达到简化代码的目的。

切片

a=[‘java’,’spark’,’python’,’hadoop’,’hbase’,’kafka’]

求:取前4个元素,我们以前的写法为:

>>>b=[]

>>>for  i in range(4)

>>>     b.append(a[i])

>>>b

[‘java’,’spark’,’python’,’hadoop’]

Python提供了切片的操作符,可以简化操作,上述代码只需要一行即可完成

a[m:n]从m开始取,取出n-m个元素

a[0:4]表示从索引0开始取,到索引4结束,取出0,1,2,3这4个元素。当索引从0开始时,0可以省掉,写成a[:3]

python也直接倒着切片,如a[-4:0]即a[-4:]可以取出倒数4个元素

还支持隔几个取一位

B=[0,1,2,3,4,5,6,7,8,9,10]

取其中的偶数B[::2]

而tuple作为list的一种,唯一区别是tuple的元素是不可变的,因此同样可以进行切片操作。

 

迭代

给定一个数组或元组,可以通过for循环来遍历这个集合,这种遍历称为迭代。

在python中,迭代是通过for…in来完成的,循环访问数组中的每一个变量。

只要是可迭代对象,无论有无下标,都可以迭代,比如dict就可以迭代,由于是无序的,因此迭代出的结果顺序很可能不一样。

>>>d={‘a’:1,’b’:2,’c’:3}

>>>for  key in d 

>>>       print(key)

是迭代key,for value in d.values() 是迭代value的。

for k,v in d.items()是要同时迭代key和value的。

for只要作用于可迭代对象,for循环就可以正常运行。那么如何判断对象是否为可迭代对象呢:可以用collections模块的Iterable类型判断:

>>>from collections import Iterable

>>>isinstance(“abc”,Iterable)

此方法用户判断abc是否为可迭代对象,答案当然是True。

 

列表生成式与列表成功器

列表生成式:会将所有的结果全部计算出来,把结果存放到内存中,如果列表中的数据比较多,就会占用过多的内存空间,可能会导致MemoryError内存错误或者导致程序运行时出现卡顿。

列表生成器:会创建一个列表生成器对象,不会一次性的把所有结果都计算出来,如果需要获取数据,可以使用next()函数来获取,但需要注意,一旦next()函数获取不到数据,会导致出现StopIteration异常错误,可以使用for循环遍历列表生成器,获取所有数据。

这种一边循环一边计算的机制,称为生成器:generator

列表生成式生成列表:

如果要生成[1*1,2*2,3*3,…..,10*10]的数,一般的计算方式是:

>>>a=[]

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

>>>       a.append(i*i)

而列表生成式会简化计算过程:

>>>[x*x for x in range(1,11)]

当然还可以增加简单的表达式,比如上述数据,只要生成偶数

>>>[x*x for x in range(1,11) if x%2==0]

还可以做双层循环

>>>[a+b for a in ‘ABC’ for b in ‘DEF’]

列表生成器

1)    使用类似列表生成式的方式构造生成器,只是把[]改为(),就创建了一个generator

G1=(2*n+1 for n in range(3,6))

2)    使用包含yield的函数构造生成器,如果一个函数定义中包含yield关键字,那么这个函数就不在是一个普通函数,而是一个generator,最难理解的就是generator和函数的执行流程不一样。函数是顺序执行,遇到return语句或者最后一行函数语句就返回。而变成generator的函数,在每次调用next()的时候执行,遇到yield语句返回,再次执行时从上次返回的yield语句处继续执行。

def my_range(start,end):

for n in range(start,end):

    yield 2*n+1

要调用生成器产生新的元素,有两种方式:

1)调用内置的next()方法

使用next()方法遍历生成器时,最后是以抛出一个StopIeration异常结束,因此提倡使用循环遍历生成器,来遍历值就不需要使用next()方法了

2)调用生成器对象的send()方法

 

 

输出结果:

 

next()会调用yield,但不会给他传值

send()会调用yield,也会给他传值(该值将成为当前yield表达式的结果值)

生成器与列表生成式对比:

列表生成式是直接创建一个新的list,它会一次性的把所有数据都存放到内存中,会存在以下问题:

1) 内存容量有限,因此列表容量是有限的

2) 当列表中的数据量很大时,会占用大量的内存空间,如果我们仅仅需要访问前面有限个元素时,就会造成内存资源的极大浪费

3) 当数据量很大时,列表生成式的返回时间会很慢。

posted on 2018-12-25 18:44  yangwan613  阅读(93)  评论(0)    收藏  举报

导航