读廖雪峰的 Python 教程小结--------Python高级特性
来源:互联网 发布:泰安中商网络 编辑:程序博客网 时间:2024/05/24 23:15
python的高级特性主要有
- 切片
- 迭代
- 列表生成器
- 生成器
- 迭代器
切片
切片就像他的名字那样,切成一片一片的。
看看例子就懂了
>>>L=[0,1,2,3,4,5,6,7]#第1位到第3位(0-2):0,1,2>>>L[0:3]#第3位到第5位(2-4):2,3,4>>>L[2:5]#从第1位开始到第5位(0-4):0,1,2,3,4>>>L[:5]#从第2位到最后一位(2-7):2,3,4,5,6,7>>>L[2:]#所有>>>L[:]#从倒数第2到最后(6-7):6,7>>>L[-2:]#从第1位到倒数第2(0-6):0,1,2,3,4,5>>>L[:-2]#所有,每两位取1位>>>L[::2]#从第2位到第5位,每两位取一次>>>L[1:5:2]#倒序输出>>>L[::-1]
list、tuple等等都可以用切片
列表生成器
列表生成器是循环的简化版吧,我个人觉得
简单来说就是用中括号括住表达式
看例子:
#生成列表list,range()生成从1到10的序列>>>L = list(range(1,11))>>>[x*x for i in L]#遍历L,若是2的倍数就输出i*i>>>[x*x for i in L if i%2==0]
也可以双重循环,但是python主张简单,所以如果是双重循环不如用for形式
生成器
生成器generator,与列表生成器样子很类似,
他是一步一步的生成下一个值的(一边循环一边计算),直到计算到最后一个元素,没有更多的元素时,抛出StopIteration的错误。
#列表生成器>>> L = [x * x for x in range(10)]>>> L[0, 1, 4, 9, 16, 25, 36, 49, 64, 81]#生成器>>> g = (x * x for x in range(10))>>> g<generator object <genexpr> at 0x1022ef630>
>>> next(g)0>>> next(g)1>>> next(g)4>>> next(g)9>>> next(g)16>>> next(g)25>>> next(g)36>>> next(g)49>>> next(g)64>>> Traceback (most recent call last): File "<stdin>", line 1, in <module>StopIteration
这样每次都要next(),看上去都很痛苦了,然而直接用for也可以,并且通过for循环来迭代它,并且不需要关心StopIteration的错误。
>>> g = (x * x for x in range(10))>>> for n in g:... print(n)... 0149162536496481
上面看到的只是生成器最简单的调用方式,这里要介绍yield语句,他在很多地方都有运用,在生成器中,如果一个函数定义中包含yield关键字,那么这个函数就不再是一个普通函数,而是是一个generator:
而generator的函数,在每次调用next()的时候执行,遇到yield语句返回,再次执行时从上次返回的yield语句处继续执行
例如: r = yield b 这个表达式分成两部分
首先 yield b 返回b
然后 r = yield 获取值赋给r
迭代与迭代器
- list或者tuple等通过for循环这种遍历,称为遍历
- 凡是可以用for循环遍历的对象,称为可迭代对象(Iterable)
- 可以被next(值的对象,称为迭代器(Iterator)
判断是否可迭代对象
>>> from collections import Iterable>>> isinstance('abc', Iterable) # str是否可迭代True>>> isinstance([1,2,3], Iterable) # list是否可迭代True>>> isinstance(123, Iterable) # 整数是否可迭代False
生成器都是Iterator对象,但list、dict、str虽然是Iterable,却不是Iterator。
把list、dict、str等Iterable变成Iterator可以使用iter()函数:
>>> isinstance(iter([]), Iterator)True>>> isinstance(iter('abc'), Iterator)True
你可能会问,为什么list、dict、str等数据类型不是Iterator?
这是因为Python的Iterator对象表示的是一个数据流,Iterator对象可以被next()函数调用并不断返回下一个数据,直到没有数据时抛出StopIteration错误。可以把这个数据流看做是一个有序序列,但我们却不能提前知道序列的长度,只能不断通过next()函数实现按需计算下一个数据,所以Iterator的计算是惰性的,只有在需要返回下一个数据时它才会计算。
Iterator甚至可以表示一个无限大的数据流,例如全体自然数。而使用list是永远不可能存储全体自然数的。
- 读廖雪峰的 Python 教程小结--------Python高级特性
- 读廖雪峰的 Python 教程小结--------Python基础
- 读廖雪峰的 Python 教程小结--------Python函数
- 廖雪峰Python教程学习笔记三-高级特性
- 廖雪峰的Python教程
- 廖雪峰Python教程阅读笔记——3. 高级特性
- 廖雪峰Python的研读笔记(一) Python基础、函数、高级特性
- 廖雪峰python教程
- 廖雪峰python学习笔记4:高级特性
- 廖雪峰的Git、Python教程
- 廖雪峰的0Python教程
- 廖雪峰的Python教程-网络编程
- 廖雪峰的Python教程-电子邮件
- 廖雪峰的Python教程-生成器
- Python练习 - 廖雪峰教程
- 廖雪峰 Python教程 笔记
- 廖雪峰python教程之python基础
- 廖雪峰Python教程1轮还没学明白的(3) -- 面向对象高级编程 -- 定制类 -- __getattr__之链式调用
- 素数 快速幂 gcd.lcm
- java编程思想笔记---并发优先级
- 【JavaSE笔记】集合(一)_Collection
- HDU 1056HangOver
- Servlets & JSP
- 读廖雪峰的 Python 教程小结--------Python高级特性
- windows 使用GDI+
- D
- kmp&扩展kmp&manacher&最大最小表示法模板
- HDU-1203 I NEED A OFFER! 动态规划
- Pdf.js 解决电子印章问题(最新)
- 01背包问题和完全背包问题
- KMP详解
- 算法-链表反转操作