Python3学习笔记之高级特性

高级特性

参考链接:廖雪峰的官方网站



切片

  • 切片操作符用于取指定索引范围的操作,如:
>>> L = ['Michael', 'Sarah', 'Tracy', 'Bob', 'Jack']
>>> L[0:3]
['Michael', 'Sarah', 'Tracy']

L[0:3]表示取0、1、2三个元素,L[1:3]表示取1、2两个元素

  • 由于python支持为负数的索引,因此切片也支持:
>>> L[-2:-1]
['Bob']
  • 要取最后n个元素,采用L[-n:]的写法:
>>> L = list(range(100))
>>> L
[0, 1, 2, 3, ..., 99]
>>> L[-10:]
[90, 91, 92, 93, 94, 95, 96, 97, 98, 99]

采用L[-10:0]的写法是得不到数的

  • 按照每n个取元素的操作:
>>> L[:10:2]
[0, 2, 4, 6, 8]

这表示前10个数,每两个取一个

  • 切片操作对tuple和字符串都适用
  • 代码示例:
x = "abcdefg"
print("1) " + x[0])
print("2) " + x[-1])        #从右到左下标是-1,-2,-3,...-n
print("3) " + x[0:3])       #左闭右开区间[0, 3)
print("4) " + x[1:3])
print("5) " + x[:5])        #默认起点为0
print("6) " + x[4:])        #默认终点为最后一个字符(包含最后一个字符)
print("7) " + x[:])         
print("8) " + x[-3:-1])
print("9) " + x[-1:])


1) a
2) g
3) abc
4) bc
5) abcde
6) efg
7) abcdefg
8) ef
9) g
  • 列表的切片会生成新的对象:
>>> a = [1, 2, 3, 4]
>>> b = a[:]
>>> b[0] = 5
>>> b += [10,]
>>> a
[1, 2, 3, 4]
>>> b
[5, 2, 3, 4, 10]
  • 但切片操作是浅拷贝,子对象没有被拷贝,关于浅拷贝与深拷贝,可移步我的另一片博客:浅拷贝与深拷贝
>>> a = [1, [2], 3]
>>> b = a[:]
>>> a += [4,]
>>> a
[1, [2], 3, 4]
>>> b
[1, [2], 3]
>>> a[1] += [3,]
>>> a
[1, [2, 3], 3, 4]
>>> b
[1, [2, 3], 3]

迭代

  • 对dict的key进行迭代:for key in d,对dict的value进行迭代:for value in d.values(),对dict的key和value进行迭代:for k, v in d.items()
  • Python中for循环可以作用于任何可迭代对象,判断是否可迭代的方法:
>>> from collections import Iterable
>>> isinstance('abc', Iterable) # str是否可迭代
True
>>> isinstance([1,2,3], Iterable) # list是否可迭代
True
>>> isinstance(123, Iterable) # 整数是否可迭代
False
  • enumerate函数可以把list变成索引-元素对:
>>> for i, value in enumerate(['A', 'B', 'C']):
...     print(i, value)
...
0 A
1 B
2 C

列表生成式

  • 列表生成式可用于创建满足特殊要求的list:
>>> [x * x for x in range(1, 11) if x % 2 == 0]
[4, 16, 36, 64, 100]
>>> [m + n for m in 'ABC' for n in 'XYZ']
['AX', 'AY', 'AZ', 'BX', 'BY', 'BZ', 'CX', 'CY', 'CZ']

生成器

  • 把列表生成式的[]改成()就创建了一个生成器:
>>> g = (x * x for x in range(10))
>>> g
<generator object <genexpr> at 0x1022ef630>

利用生成器可以不必创建完整的list,而是把元素的值通过算法推算出来,可以使用for循环来获得生成器中的元素

>>> L1 = (x * x for x in range(1, 5))
>>> for L in L1:
...     print(L)
... 
1
4
9
16
  • 如果一个函数定义中包含yield关键字,那么这个函数就是一个生成器
  • 生成器和函数的执行流程不同:函数是顺序执行,遇到return或最后一条语句就返回;生成器在每次调用next()时执行,遇到yield返回,再次执行时从上次返回的yield语句处继续执行(同样可以使用for循环)
def odd(n):
    i = 1
    while i <= n:
        print('step:', i)
        yield 2 * (i - 1) + 1
        i += 1


for L in odd(4):
    print(L)

step: 1
1
step: 2
3
step: 3
5
step: 4
7
  • 使用for循环调用生成器时获得不了生成器的return语句的返回值,要获得返回值就需要捕获StopIteration错误,返回值包含在StopIterationvalue

迭代器

  • 可直接作用于for循环的对象统称为可迭代对象Iterable;可被next()函数调用并不断返回下一个值的对象成为迭代器Iterator
  • 生成器都是Iterator,但listtuplestr虽然是Iterable,却不是Iterator,可以使用iter()函数来把它们这些Iterable变成Iterator
>>> isinstance([], Iterator)
False
>>> isinstance('abc', Iterator)
False
>>> isinstance(iter([]), Iterator)
True
>>> isinstance(iter('abc'), Iterator)
True
  • Python的Iterator对象表示的是一个数据流,它可以被next()函数不断调用并返回下一个值,直到没有数据时抛出StopIteration错误。这个数据流可看成一个未知长度的有序序列,只有在调用next()时才能得到下一个数据t、dict、str等是Iterable但不是Iterator,不过可以通过iter()函数获得一个Iterator对象。

猜你喜欢

转载自blog.csdn.net/chenf1999/article/details/81240316
今日推荐