Python Log6 高级特性:切片 迭代 列表生成式 生成器 迭代器

切片

取一个list或者一个tuple的元素是很常见的。在Python中,提供了切片(slice)操作符,可以大大简化操作。

list
切片

L[0:3],表示从索引0开始取,取到索引为3,但不包括3,取出三个元素。另外如果第一个是0,还可以省略,写成L[:3]。

倒数切片
可以三个:

扩展:

tuple也是一种list,唯一不同是不可变。所以也可以进行切片,只是操作对象仍是tuple。

字符串‘XXX’,也可以看成list,每个元素就是一个字符。因此也可以进行切片,操作的结果仍然是字符串。

在很多编程语言中,针对字符串提供了很多截取函数,起目的就是对字符串切片。


迭代

如果给定一个list或者tuple,可以通过for循环来遍历这个list或tuple,这种遍历成为迭代(lteration)。

在Python中,迭代是通过for…in来完成的,而很多语言比如C语言,迭代list是通过下标完成的。list这种数据类型虽然有下标,但是其他可迭代对象,没有下标也可以进行迭代。比如dict就可以迭代。

dict的迭代,key

默认下dict迭代的是key。如果要迭代value,可以用for value in d.values(),如果要同时迭代key和value,可以用for k,v in d.items()。

迭代value
迭代k,v

由于字符串也是可迭代对象,因此,也可以作用于for循环。

迭代字符串

所以,当我们使用for循环时,只要作用一个可迭代对象,for循环就可以正常运行。

可以通过collections模块的lterable类型来判断。

测试‘abc’是不是可迭代对象

另外,如果一定要实现下标循环,Python内置enumerate()函数可以把list变成索引-元素对,这样就可以在for循环中同时迭代索引和元素本身。

enumerate()函数

for循环里,同时引用两个变量,在Python中是很常见的。

在for中同时引用两个变量

列表生成式

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

比如要生成一个list[1,2,3,4,5,6,7,8,9,10],可以用list(range(1,11)):

但如果要生成[1*1,2*2,3*3……,10*10],可以通过循环。

循环实现

也可以通过list生成式,

list生成式

还可以在后面加if条件语句,这样可以进行筛选,

可以加if判断语句进行删选

还可以使用两层循环,生成全排列,

两层循环

利用list生成式可以写出非常简洁的代码。例如,列出当前目录下的所有文件和目录名,可以通过一行代码实现:

引入os库

for循环可以同时使用两个甚至更多变量,因此列表生成式也可以使用两个变量来生成list,

使用两个变量,value为int报错

注:如果list中既包含字符串,又包含整数,由于非字符串类型没有lower()方法,所以列表生成式会报错。使用内置函数isinstance函数可以判断。


生成器

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

创建一个generator,第一种,只要把列表生成式的[]改成(),就可以了。

generator

与list不同,g是一个generator。我们可以直接打印出list的每一个元素,但是我们要打印出generator时,可以通过next()函数,获得generator的下一个返回值。

next()

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

因为generator也是迭代对象,所以可以使用for循环实现迭代。

for循环实现

如果推算的算法比较复杂,用类似列表生成式的for循环无法实现时,还可以用函数实现。

比如斐波拉契数列用列表生成式写不出来是,但是通过函数可以。

函数实现斐波拉契数列

※注:

a , b = b , a+b

理解为:

t = (b,a+b) #t是一个tuple

a = t[0]

b = t[1]

不用写出临时变量t就可以实现。

输出数列的前N个数

fib函数实际上是定义了斐波拉契数列的推算规律,可以从第一个元素开始,推算出后续任意元素,这种逻辑很类似generator。我们需要把print(b),改成yield b就可以实现了。

yield实现
generator

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

我们再看fib的例子,我们在循环过程中不断调用yield,就会不断中断。当然需要设置一个条件来跳出循环,不然就会产生一个无限的数列出来。

同样的,我们把函数改成generator,也基本不会用next()来获取下一个返回值,而是直接使用for循环来迭代

但是在调用generator的时候,发现拿不到他的return语句的返回值。如果想拿到返回值,必须捕获StopIteration错误,返回值包含在StopIteration的value中。


迭代器

可以直接作用for:

一类是集合数据类型,如list、tuple、dict、set、str等;

一类是generator,包括生成器和带yield的generator function。

这些可以直接作用与for循环的统称为可迭代对象:Iterable。

我们可以用isinstance()函数进行判断是否为Iterable。

同样,可以被next()函数调用,并且不断返回下一个值的对象叫做迭代器:Iterator。

我们也可以用isinstance()函数进行判断。

为什么list、dict、str等数据类型不是Iterator?

这是因为Python的Iterator对象表示的是一个数据流,Iterator对象可以被next()函数调用,并不断返回下一个数据,直到没有数据时抛出StopIteration错误。

可以把这个数据流看做是一个有序序列,但我们却不能提前知道序列的长度,只能不断通过next()函数实现按需计算下一个数据,所以Iterator的计算是惰性的,只有在需要返回下一个数据时它才会计算。

Iterator甚至可以表示一个无限大的数据流,例如全体自然数。而使用list是永远不可能存储全体自然数的。

Iterable和Iterator
最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 205,033评论 6 478
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 87,725评论 2 381
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 151,473评论 0 338
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 54,846评论 1 277
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 63,848评论 5 368
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 48,691评论 1 282
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 38,053评论 3 399
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 36,700评论 0 258
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 42,856评论 1 300
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 35,676评论 2 323
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 37,787评论 1 333
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 33,430评论 4 321
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 39,034评论 3 307
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 29,990评论 0 19
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 31,218评论 1 260
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 45,174评论 2 352
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 42,526评论 2 343