美文网首页
Python步步飞升之Python高级特征

Python步步飞升之Python高级特征

作者: 双流小二郎 | 来源:发表于2019-02-14 17:45 被阅读0次

Python步步飞升之Python高级特征

1. 前言

Python有句著名的话,叫做"Life is short, you need Python",人生苦短啊,代码越少,效率越高,这也是我喜欢Python的原因。这篇文章学习一下Python语言的高级特征: Slicing(切片),Iterable(迭代),List Comprehensions(列表生成式),Generator(生成器)和Iterator(迭代器)。

2. Slicing(切片)

Python切片的功能主要用于方便地获取List/Tuple/String等object中元素。

2.1 循环生成新list

比如有个List如下,需要获取前3个元素

l = ['a','b','c','d','e','f','g']

我们可能会有笨方法,用循环来取

newL = []
n = 3
for i in range(n):
    newL.append(l[i])

2.2 List切片

用切片就可以这样简单的获取

>>> l[0:3]
['a', 'b', 'c']
>>> l[:3]
['a', 'b', 'c']
>>> l[3:]
['d', 'e', 'f', 'g']

l[0:3]的意思是从索引0开始到索引3,不包括索引3。如果第一个索引是0,则可省略;省略第二个索引,代表取到最后一个索引。

2.3 Tuple, String切片

对tuple,string同样效果,因为这俩也可以看做一个list

>>> t=('a', 'b', 'c')
>>> t[1:3]
('b', 'c')
>>> s='abcdefg'
>>> s[1:3]
'bc'

2.4 负数索引

索引为负数时,代表倒着取。比如说-1代表最后一个index。

>>> l[-1]
'g'
>>> l[-2:-1]
['f']
>>> l[:-2]
['a', 'b', 'c', 'd', 'e']

2.5 slice类

Python提供了一个slice类

>>> abcObj = slice(0,3)
>>> l[abcObj]
['a', 'b', 'c']

2.6 简单应用

截取字符串,python中没有类似substring,substr的函数或方法,切片功能可以胜任。
获取s中字符e之后的字符串

>>> s
'abcdefg'
>>> s[s.index('e')+1:]
'fg'

反转字符串

>>> s[::-1]
'gfedcba'

3. Iterable(迭代)

3.1 定义

能够用for来循环的对象,叫做可迭代对象。
比如list,tuple,string

>>> s='123'
>>> for i in s:
...     print(i)
...
1
2
3

3.2 迭代dict

>>> d = {'a': 1, 'b': 2}
>>> for k in d:
...     print(k)
...
a
b
>>> for v in d.values():
...     print(v)
...
1
2
>>> for i in d.items():
...     print(i)
...
('a', 1)
('b', 2)

3.3 判断

可以用collections.Iterable判断是否为可迭代对象

>>> from collections import Iterable
>>> isinstance(d, Iterable)
True
>>> isinstance(5, Iterable)
False

4. List Comprehensions(列表生成式)

4.1 定义

Python内置用以创建list的表达式

4.2 例子1

比如说有个list

l = ['a','b','c']

我们要两两有序交互生成一个新的list

newL = ['ab', 'ac', 'ba', 'bc', 'ca', 'cb']

使用以下方式实现

>>> newL = []
>>> for x in l:
...     for y in l:
...         if x!= y:
...             newL.append(x+y)
...
>>> newL
['ab', 'ac', 'ba', 'bc', 'ca', 'cb']

使用列表生成式简化

>>> newL = [x+y for x in l for y in l if x != y]
>>> newL
['ab', 'ac', 'ba', 'bc', 'ca', 'cb']

可以说简单一行,人生苦短啊。

4.3 例子2

再比如说,有一个到10的自然数数列,想要计算一个平方的数列

>>> l = list(range(10))
>>> l
[0, 1, 2, 3, 4, 5, 6, 7, 8, 9]
>>> [x*x for x in l]
[0, 1, 4, 9, 16, 25, 36, 49, 64, 81]
>>> [x*x for x in l if x%2 == 0]
[0, 4, 16, 36, 64]

5. Generator(生成器)

5.1 定义

生成器和list类似,但只有在需要返回下一个数据时它才会计算,而不用如list一样有容量限制,节省空间。

5.2 生成器返回数据

  • 通过next()函数返回元素
>>> next(g)
'ab'
>>> next(g)
'ac'

当最后一个元素返回后继续调用会返回StopIteration错误

>>> next(g)
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
StopIteration
  • 生成器是Iterable,可以用for来循环元素,这样可以杜绝StopIteration错误
>>> for x in g:
...     print(x)
...
ba
bc
ca
cb

5.3 两种方法创建一个生成器

  • 把一个列表生成式的[]改成()
    例如
>>> l = ['a','b','c']
>>> newL = [x+y for x in l for y in l if x != y]
>>> newL
['ab', 'ac', 'ba', 'bc', 'ca', 'cb']
>>> g = (x+y for x in l for y in l if x != y)
>>> g
<generator object <genexpr> at 0x03134130>
  • 5.3 通过用yield替换函数中return实现
    变成generator的函数,在每次调用next()的时候执行,遇到yield语句返回,再次执行时从上次返回的yield语句处继续执行。
>>> def odd():
...     yield 1
...     yield 3
...     yield 5
>>> o = odd()
>>> next(o)
1
>>> next(o)
3
>>> next(o)
5

6. Iterator(迭代器)

6.1 定义

可以被next()函数调用并不断返回下一个值的对象称为迭代器:Iterator。
Iterator的计算是惰性的,只有在需要返回下一个数据时它才会计算。

6.2 转变Iterable为Iterator

生成器是迭代器,list是Iterable但不是Iterator。
可以使用iter()函数将Iterable修改为Iterator。

>>> from collections import Iterator
>>> l = [1,2,3]
>>> next(l)
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
TypeError: 'list' object is not an iterator
>>> g = iter(l)
>>> next(g)
1

6.3 判断对象是否为Iterator

>>> isinstance(l, Iterator)
False
>>> isinstance(g, Iterator)
True

7. 结语

如有疑问,欢迎留言共同探讨。

相关文章

网友评论

      本文标题:Python步步飞升之Python高级特征

      本文链接:https://www.haomeiwen.com/subject/svcyeqtx.html