6.Python基础学习笔记——高级特性

高级特性

切片

  • 可以使用切片的类型如:list, tuple, str
  • 切片类似于其他预言中的substring()方法,但是切片更加灵活
  • 使用切片slice可以轻松访问列表中的某些元素
  • 连续切片:
    L[0:10]
    L[:]
    L[-5:0]

  • 间隔切片L[:10:2]

迭代

  • 如果给定一个list或tuple,可以使用for循环遍历这个list或tuple,这种遍历旧成为迭代iteration
  • 迭代通过for...in完成的
  • 抽象程度高,可以用于其他迭代对象上面
  • 对字典dict对象的迭代举例:
  • 遍历键:for key in dic或者for key in dic.keys()
  • 遍历值:for val in dic.values()
  • 同时遍历键值: for k, v in dic.items()

  • from collections import Iterable,Iterable是可迭代对象,判断即可。
  • 使用enumerate()函数可以获得list迭代索引:for i, v in enumerate([1,2, 3])

列表生成式

  • Python内置的非常简单却强大的可以用来创建list的生成式
  • 生成[1, 2, 3, 4....]: [x for x in range(1, 100))]
  • 生成[1*1, 2*2, 3*3,....]: [x * x for x in range(1, 10)]
  • 可以使用多重循环
  • 可以使用多个变量
  • 分支判断:[x.lower() if isinstance(x, str) else x for x in L] ['hello', 'world', 18, (12, 3), 'none', 'apple']

生成器

  • 使用列表生成式,可以非常方便地创建一个列表。但是如果创建一个100万元素的列表,但是只使用其中的若干元素,那么就会造成内存空间的浪费。
  • 使用生成器generator,不必创建完整的list,通过一边循环一边计算的机制,节省大量内存。
  • generator保存的是算法,每次调用next(g)函数,会自动计算出g的下一个元素的值,直到计算到最后一个元素,当没有元素时,会产生StopIteration异常。

创建生成器

  • 方法一:
  • 与列表生成式类似,但是需要将[]换成()。如g = (x for x in 'xyz')。使用next()内置函数可以依次获得迭代器的每个元素
  • 由于generator也是可迭代对象,所以可以使用for e in g循环访问。这样就不会担心抛出StopIteration异常了

  • 方法二:
  • 如果使用简单的类似列表生成式无法生成generator对象时,可以使用函数实现。
  • 比如复杂的推算算法,如斐波那契数列推算算法,就可以使用函数来生成对应的生成器,因为推算的方法是已知的。在函数中使用关键字yield,就让一个函数变成一个generator
  • 函数和generator执行的顺序不同。函数通常在执行到最后一行语句或者遇到return时结束。但是generator则不同;它不是顺序执行的,每次在调用next()时执行,当遇到yield语句时返回,下次执行时,从上次返回yield的语句处继续执行,以此类推。
  • 注意到,如果使用for来循环调用generator时,会发现得不到return值;所以需要捕获StopIteration异常。(e.value)

总结

  • generator非常强大。
  • 杨辉三角问题。

迭代器

  • 可以直接用于for循环的对象统一成为可迭代对象Iterable
  • 可迭代对象包括:
  • 集合数据类型:lsit, 'tuple,dict,set,str`
  • generator,生成器,和生成器函数

  • from collections import Iterable, Iterator
  • 可以被next()函数调用并不断返回下一个值的对象称为迭代器Iterator
  • 可迭代对象迭代器是不同的,注意区分isinstance([], Iterator)->False
  • 生成器都是Iterator对象,但是list, 'dict', 'str,set,tuple均不是。但是可以使用内置函数iter()转换成Iterator`。
  • Iterator对象表示的是一个数据流,Iterator对象可以被next()函数调用并不断返回下一个数据,直到没有数据时抛出异常。可以看成一个“有序序列”,只有需要,才计算下一个值,所以时懒惰的。
  • Iterator可以表示无限大的数据流,但不会占用过多的内存。

你可能感兴趣的:(6.Python基础学习笔记——高级特性)