暑期Python学习(四)
函数高级特性
切片(Slice)
切片是一个针对tuple和list方便地取元素的方法,下面举例说明:
- 取出list L中的0到3个元素
1 | L[0:3] |
当取出元素从第0个开始时,第一个数字可以缺省
1 | L[:3] |
- 取出倒数后三个元素
在Python中允许使用L[-1]
来取出倒数第一个数,因此可以这样倒着取:
1 | L[-3:] |
- 每两个数取一个数
切片的最后一个数字表示步长,步长为多少就隔几个数字。
1 | L[:10:2] |
字符串和tuple同样可以这样使用,只不过返回值为对应类型。
迭代(Iteration)
Python的迭代相比c或者Java来说,功能更强大,除了可以迭代list,还可以迭代dict这种无下标的数据类型。
想要知道一个数据能否迭代可以通过一个函数来完成:
1 | from collections.abc import Iterable |
下面说明dict如何迭代:
1 | d={'a':1,'b':2,'c':3} |
需要理解的是,这里的key,value,k,v都是for循环中的形参,没有实际意义。也就是说当in d
的时候默认就是取key
。当要迭代其他的时候只需要更改in
的后面。我猜测这可能与dict的存储方式有关。
多个元素同时迭代在其他list中也是可以实现的:
1 | l={(1,2),(3,4),(5,6)} |
列表生成式
一种快捷生成list的方式,一个例子如下:
1 | [x * x for x in range(1, 11)] |
如果想要筛选生成的值,可以在for
后加上if
作为筛选条件,注意这里是筛选条件, 因此这里和平时的if else
并不是一个东西。
1 | [x * x for x in range(1, 11) if x % 2 == 0] |
生成器
如果列表元素可以按照某种算法推算出来,那我们是否可以在循环的过程中不断推算出后续的元素呢?这样就不必创建完整的list,从而节省大量的空间。在Python中,这种一边循环一边计算的机制,称为生成器:generator。
创建generator
- 把一个列表生成式的
[]
改成()
1 | g = (x * x for x in range(10)) |
- 包含
yield
关键字
当一个函数包含yield
关键字时,他就成了一个generator函数。
1 | def fib(max): |
yield
在generator函数中起到了一个return的作用,即到yield
便返回。 在调用时,使用一个变量接受一个generator对象。
1 | f = fib(6) |
调用generator获得值
- 使用
next()
函数依次获得下一个返回值
1 | next(f) |
- 使用
for
循环
1 | g = (x * x for x in range(10)) |
迭代器
区分Iterable
和Iterator
Iterable
是可迭代的,是直接可用于for
循环的。包括dict、list、tuple、set、str、grenerator。Iterator
是迭代器,是直接可用于next()
函数的,生成器都是Iterator
对象,集合数据类型可以通过iter()
获取Interator
对象。
for
循环的本质
在Python中for
循环本质上就是一个不断调用next()
的过程。
1 | it=iter([1,2,3,4,5]) |
本博客所有文章除特别声明外,均采用 CC BY-NC-SA 4.0 许可协议。转载请注明来自 脱碳甲醛的博客!
评论