python基础之高级特性

python基础之高级特性

切片:
切片是针对列表、元组、字符串而言,其他数据结构没有所谓切片。如下:
a = [0,1,2,3,4,5,6,7,8,9,10]
a[0:2]  --- [0,1]
a[2:6]  --- [2,3,4,5]
a[0:10:2]  --- [0,2,4,8]
切片的形式,可以总结为:var[x:y:z]
var:表示列表、元组、字符
x:表示开始的下标
y:表示结束的下标
z:表示数据获取时的间隔数。
有个问题,大家可能会问,x指向下标的开始,y指向下标的结束,为何包括了开始的数据而不包括结束的数据。如:
a[0:2] --- [0,1], 为何没有下标为2的数据呢,其实很好理解,如下图:

下标就是地址的开始,相当于内存块的首地址,此时下标0-2,下标2对应内存块开始,故没在0-2之间。所以不会有下标2的内容。
现在,我们来定义下切片,你说我们要取a的前3个字段,我们可以用循环,取出他们的数据。这个处理繁复点,还有什么不同呢?
如:
    for i in range(3):
        print(a[i])
    print(a[0:3])
for循环取出数据,取出的数据是int,而a[0:3]还是列表。这就是最本质的问题,
1、切片不改变数据类型
2、切片是取出其中部分或则全部元素,组成一个新集合。

列表生成式:
什么是列表生成式,就是专门生成列表的表达式。表达式特点是,元素放在最前面,后面跟踪for循环,并用‘[]’或则list()来调用。如:
[x for x in range(0, 11) if x%2 == 0] --- [0, 2, 4, 6, 8, 10]
list(x for x in range(0, 11) if x%2 == 0) --- [0, 2, 4, 6, 8, 10]
为了简约也就是所谓的优雅,大家都是'[]'。
但是list()功能更加强大些,可以直接把集合转化为列表,不用列表表达式,如:
list(range(1, 11))  --- [1, 2, 3, 4, 5, 6, 7, 8, 9, 10]

生成器:
什么是生成器,其内部实现了__next__,__iter__的对象。通俗来讲,列表生成式是一次性把元组全部生成并发在内存中,如果要生成一个很大的列表,比如10000个元组的,这样多的元素要占用多大的内存。为了省空间,就有生成器出现了,他会生成一个对象,但是这个对象的不存元素,而是保存算法,通过调用next()函数调用算法来计算当前元素的值,并保存状态,下次调用会根据上次调用的状态自动计算下个元素的值。
表现形式,有两种,一种就是列表生成式修改为括号形式,变为生成器,如:
g = (x for x in range(1, 11))
此时type(g) --- <class 'generator'>,取值可以为:
next(g) --- 1
next(g) --- 2
......
next(g) --- 10
next(g) --- error:StopIteration
最后,没有元素后,包StopIteration错误。其实我们可以用for循环来取值,而不用担心StopIteration错误,如:
for ss in g:
    print(ss)
但是,我们若要定义比较复杂的生成器,无法用一个表达式表示,这时就要用到yield了,在函数中,如:
def printStep():
    print('one step')
    yield 1
    print('two step')
    yield 2
    print('three step')
    yield 3
我们调用函数,如下:
g = printStep()
next(g)   --- one step 
              1
next(g)   --- two step 
              2
此时和第一种情况一致,可以用for循环来取值,其值就是yield后面返回的。
最后,我们来说下yield,英文意义为屈服、退让的意思。其实在函数里使用这个,表示此出退出cpu执行,不过在执行时顺便返回值并记录当前状态,下次再次调用时,从记录的状态开始执行。
可迭代对象与迭代器:
可迭代对象,就是包含__iter__的对象,可用for循环来取值。可用以下来检查是否是可迭代对象:
form collections import Iterable
isinstance(obj, Iterable)
obj,表示具体的对象,如 a = [1, 2, 3], isinstance(a, Iterable)
什么是迭代器呢?同时包含__next__,__iter__的对象。

所以说,生成器也是迭代器,是一种特殊的迭代器。

补充说明,可迭代对象可以转化为迭代器,使用该函数iter()即可。如:
a = [1, 2, 3]
b = iter(a)
 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值