python高级特性

1.切片
切片可以取list、tuple、string的元素
python语言中把字符串看做一个tuple,因此可以通过for in 循环取出所有的字符,同样可以通过切片取出一部分字符
list/tuple/string变量名[a:b:c]
a表示开始取得索引位置,b表示结束的索引位置(不包括在内,因此可以比最后的索引大1,即swift中的endindex)
c表示间隔多少个取值,可以是负数,倒着取值
a、b可以省略,表示取到终点,c可以省略,默认为1
被取得变量是什么类型,取完还是什么类型

2.如1中所述,for循环的对象可以是多种类型,这些类型叫做可迭代对象。
当我们使用for循环时,只要作用于一个可迭代对象,for循环就可以正常运行
如何判断一个对象是可迭代对象:通过collections模块的Iterable类型判断
python内置函数isinstance():判断一个变量是否是已知的类型,具体见内置函数页
其中没有iterable(可迭代类型),需要我们手动导入。
from collections import Iterabl

然后用instance(a,iterable)来判断是否是可迭代对象(可用if),然后打印:
for 变量(可多个) in 可迭代对象(此时会自动给变量赋值) print(变量)

如果对象中没有这么多变量,则出现错误
ValueError: not enough values to unpack (expected m, got n)

对于dict需要说明的是,其中对象只有一个即key,value需要写
for i in dict.values()
(这与swift不同,swift中把key与value作为两个变量)
dict.values实际上也是一个迭代器 迭代的时候不可以少(),此类函数如reversed都是如此,输出需要()
输出key与value用到dict.items()
否则提示:
TypeError: 'builtin_function_or_method' object is not iterable该函数或方法不可迭代

3.列表生成式(省略循环步骤生成一个list)

[要生成的式子关于x的函数 for x in range(a, b)]

for循环后面还可以加上if判断
还可以使用多层循环,如:
>>> [m + n for m in 'ABC' for n in 'XYZ'] ['AX', 'AY', 'AZ', 'BX', 'BY', 'BZ', 'CX', 'CY', 'CZ']

4.生成器generator(为了节省空间不计算只储值)
在Python中,可以简单地把列表生成式改成generator,也可以通过函数实现复杂逻辑的generator。
(1)把列表生成式改成generator:把列表生成式[]变为()即可得到
(2)定义函数时将print()改为yield

怎么打印出generator的每一个元素呢?
如果要一个一个打印出来,可以通过next()函数获得generator的下一个返回值直到出现StopIteration的错误
或用循环打印

是generator和函数的执行流程不一样。函数是顺序执行,遇到return语句或者最后一行函数语句就返回。而变成generator的函数,在每次调用next()的时候执行,遇到yield语句返回,再次执行时从上次返回的yield语句处继续执行。如果用for、print()执行,实际上也相当于不断地next()、遇到yield返回、再次next()。(这点在迭代器中会继续提到)
因此你会发现,如果一直用next()、或者循环调用函数,你无法得到结束语句return中的信息(从执行顺序理解)

a = (x for x in range(10)) next(a) 0 next(a) 1 next(a) 2 next(a) 3 next(a) 4

for m in a:\ print(m) 5 6 7 8 9

generator中元素用过后不可以再调用

如何得到return语句:如果想要拿到返回值,必须捕获StopIteration错误,返回值包含在StopIteration的value中:

except StopIteration as e: print('Generator return value:', e.value) break

在except里面用except Exception as e 接受异常,然后把这个e打印出来看

5.迭代器

可以直接作用于for循环的数据类型有以下几种:
(1)集合数据类型,如list、tuple、dict、set、str等;
(2)generator,包括生成器和带yield的generator function。
这些可以直接作用于for循环的对象统称为可迭代对象:Iterable。

Python的for循环本质上就是通过将对象变为一个迭代器再不断调用next()函数实现的。

而可以被next()函数调用并不断返回下一个值的对象称为迭代器:Iterator。
可迭代对象不一定是迭代器。
可以使用isinstance()判断一个对象是否是Iterator对象
from collections import Iterator isinstance((x for x in range(10)), Iterator) True isinstance([], Iterator) False isinstance({}, Iterator) False isinstance('abc', Iterator) False

生成器都是Iterator对象,但list、dict、str虽然是Iterable,却不是Iterator。
把list、dict、str等Iterable变成Iterator可以使用iter()函数:

isinstance(iter([]), Iterator) True isinstance(iter('abc'), Iterator) True

why:可以把迭代器这个数据流看做是一个有序序列,但我们却不能提前知道序列的长度,只能不断通过next()函数实现按需计算下一个数据,所以Iterator的计算是惰性的,只有在需要返回下一个数据时它才会计算。
Iterator甚至可以表示一个无限大的数据流
所以list、tuple、string已知长度,不能看做iterator

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

推荐阅读更多精彩内容

  • 一、高级特性切片 对这种经常取指定索引范围的操作,用循环十分繁琐,因此,Python提供了切片(Slice)操作符...
    zzj丶阅读 553评论 0 1
  • 1、切片(slice)L[0:3]表示,从索引0开始取,直到索引3为止,但不包括索引3。即索引0,1,2,正好是3...
    bjchenli阅读 245评论 0 0
  • 掌握了Python的数据类型、语句和函数,基本上就可以编写出很多有用的程序了。 比如构造一个1, 3, 5, 7,...
    齐天大圣李圣杰阅读 1,425评论 0 1
  • python高级特性 iteration迭代 对list,tuple的遍历被称为迭代。对list实现类似Java那...
    咚咚董dyh阅读 579评论 0 0
  • 许久,一直在酝酿一个关于老师的题材,却不知如何提笔…… 直到一日与朋友聊天,说起老师这个职业,朋友漏出一脸的不屑:...
    我是周太太阅读 1,294评论 17 5