Python高级特性(切片 迭代 列表生成式 生成器 迭代器)学习笔记

在Python中,代码不是越多越好,而是越少越好。代码不是越复杂越好,而是越简单越好。
基于这一思想,Python中有非常有用的高级特性,1行代码能实现的功能,决不写5行代码。请始终牢记,代码越少,开发效率越高。

切片

(Slice)

  1. 切片操作符在python中的原型是 [start:stop:step] ,即:[开始索引:结束索引:步长值] ->
    开始索引:默认从0开始。序列从左向右方向中,第一个值的索引为0,最后一个为-1

    结束索引:切片操作符将取到该索引为止,不包含该索引的值;

    步长值:默认是一个接着一个切取(值为1),如果为2,则表示进行隔一取一操作。步长值为正时表示从左向右取,如果为负,则表示从右向左取。步长值不能为0 。

Sequence[start:end:step] python的序列切片中,第一个:隔离了 起始索引 和 结束索引,第二个:隔离了 结束索引 和 步长
step为正,则从左到右切片,如果 start > end,则为空
step为负,则从右到左切片,如果 start < end,则为空
start 和 end 填空,前者表示最开始,后者表示最后一个, 同时为空的时候,表示取所有。至于方向,取决于 step
可以总结一句规律,step 为正表示从左到右切片,反之为右到左。
如:L[a:b:c] ->表示,从索引a开始每隔c个间隔取,直到索引b为止,但不包括索引b。

  1. 只写[:]就可以原样复制一个list。字符串也可以用切片操作,Python没有针对字符串的截取函数,只需要切片一个操作就可以完成。

迭代

可以通过for循环来遍历,这种遍历我们称为迭代(Iteration)。任何可迭代对象都可以作用于for循环,包括我们自定义的数据类型,只要符合迭代条件,就可以使用for循环。

  1. 在Python中,迭代是通过for … in来完成的,而很多语言比如C或者Java,迭代list是通过下标完成的。

  2. enumerate函数 :Python内置的enumerate函数可以把一个list变成索引-元素对,这样就可以在for循环中同时迭代索引和元素本身。

#enumerate把list表索引
for i,value in enumerate(['A','B','C']):
    print(i,value)

输出:
0 A
1 B
2 C

列表生成式

列表生成式(range())即List Comprehensions,是Python内置的非常简单却强大的可以用来创建list的生成式。

  1. list() 方法用于将元组转换为列表。
    注:元组(tuple)与列表(list)是非常类似的,区别在于元组的元素值不能修改,元组是放在括号中,列表是放于方括号中。

  2. 运用列表生成式,可以快速生成list,可以通过一个list推导出另一个list,而代码却十分简洁。

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

执行表达式 for 变量(k,v) in 集合(range())
  1. isinstance() 函数来判断一个对象是否是一个已知的类型,类似 type()。

isinstance() 与 type() 区别:
type() 不会认为子类是一种父类类型,不考虑继承关系。
isinstance() 会认为子类是一种父类类型,考虑继承关系。
如果要判断两个类型是否相同推荐使用 isinstance()。

isinstance() 函数用法:

isinstance([1,2,3], Iterable) # list是否可迭代

生成器

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

  1. 创建L和g的区别仅在于最外层的[]和(),L是一个list,而g是一个generator。定义generator的另一种方法。如果一个函数定义中包含yield关键字,那么这个函数就不再是一个普通函数,而是一个generator。虽然执行流程仍按函数的流程执行,但每执行到一个 yield 语句就会中断,并返回一个迭代值,下次执行时从 yield 的下一个语句继续执行。

  2. generator保存的是算法,每次调用next(g),就计算出g的下一个元素的值,直到计算到最后一个元素,没有更多的元素时,抛出StopIteration的错误。

  3. generator和函数的执行流程不一样。函数是顺序执行,遇到return语句或者最后一行函数语句就返回。而变成generator的函数,在每次调用next()的时候执行,遇到yield语句返回,再次执行时从上次返回的yield语句处继续执行。

  4. for循环调用generator时,发现拿不到generator的return语句的返回值。如果想要拿到返回值,必须捕获StopIteration错误,返回值包含在StopIteration的value中。关于如何捕获错误,查看后面的错误处理。

  5. 对于函数改成的generator来说,遇到return语句或者执行到函数体最后一行语句,就是结束generator的指令,for循环随之结束。
    注:请注意区分普通函数和generator函数,普通函数调用直接返回结果;generator函数的“调用”实际返回一个generator对象。

  #斐波拉契数列(Fibonacci),除第一个和第二个数外,任意一个数都可由前两个数相加得    到:1, 1, 2, 3, 5, 8, 13, 21, 34, ...
  代码如下:
#使用生成器:generator
def fib(max):
    n,a,b = 0,0,1
    while n < max:
        yield (b)
        a,b = b,a+b #把a赋值给n会导致n的个数随fib数增长
        n = n+1
        return 'done'
for n in fib(5): #循环迭代
    print(n)

获取return的返回值’done’

while True:
    try:
        x = next(g)
        print('g:', x)
    except StopIteration as e:
        print('Generator return value:', e.value)
        break

迭代

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

  1. 可以直接作用于for循环的数据类型有以下几种:
    一类是集合数据类型,如list、tuple、dict、set、str等;一类是generator,包括生成器和带yield的generator function。

这些可以直接作用于for循环的对象统称为可迭代对象:Iterable。可以使用isinstance()判断一个对象是否是Iterable对象。

  1. iter()函数:生成器都是Iterator对象,但list、dict、str虽然是Iterable,却不是Iterator。把list、dict、str等Iterable变成Iterator可以使用iter()函数.

16.Python的Iterator对象表示的是一个数据流,Iterator的计算是惰性的,只有在需要返回下一个数据时它才会计算。

总结
凡是可作用于for循环的对象都是Iterable类型;

凡是可作用于next()函数的对象都是Iterator类型,它们表示一个惰性计算的序列;

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

学习网站: www.liaoxuefeng.com

  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值