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) 收藏 举报
浙公网安备 33010602011771号