Python高级特性
author:lxy
切片、迭代、列表生成式、生成器
切片
Python中 代码越少越简单越好,
我们要取一个list中的某一部分的元素的我们可以使用判断+循环实现,在Python提供了专门的方法--切片
slice切片,用来获取list中某一段元素
tuple、str等都看做是一种list只是使用切片获取的片段还是他们原来相应的类型
例1、对list进行切片
- >>> n = [1,3,2,5,6,8]
- >>> n[0:3] #不含尾
- [1, 3, 2]
- >>> n[-2:] #可以使用倒序的方式截取
- [6, 8]
- >>>
复制代码
例2、对tuple进行切片
- >>> t = (‘a‘,‘s‘,‘d‘,‘d‘)
- >>> t[:3] #默认从0开始截取
- (‘a‘, ‘s‘, ‘d‘) #tuple切片后还是tuple
- >>>
复制代码
例3、对str进行切片
- >>> s = ‘dfsafsf‘
- >>> s[:3]
- ‘dfs‘ #字符串切片后还是字符串
- >>> #在Python中没有专门对字符串截取操作的函数,只要使用切片就可以完成
复制代码
迭代
通过for循环遍历可迭代的对象,称为迭代。
在c或Java中迭代list等是通过下标来完成的。
list这样的对象是有下标的我们可以完成迭代,而dict、str等是没有下标的通过Python的for...in一样可以完成迭代
通过itervalues()可以迭代dict的v
通过iteritems()可以迭代dict的k_V
如何判断一个对象是否可迭代
通过collections模块的iterable类型判断
例:
- >>> from collections import Iterable #获取collections模块的Iterable类型
- >>> isinstance(‘dfdas‘,Iterable) #判断是否可迭代
- True
- >>> isinstance(555,Iterable)
- False
- >>>
复制代码
在Python中实现下标循环,Python内置的enumerate函数可以把一个list变成 索引--元素
例:
- >>> for i,v in enumerate((‘s‘,‘d‘,‘g‘)):
- print(i,v)
- 0 s
- 1 d
- 2 g
- >>>
复制代码
列表生成式
range() #
1、通过range()生成一个连续的整数序列
2、通过--<表达式> <for循环> --产生列表
例1、生成一个整数序列
- >>> a = range(3)
- >>> for i in a:
- print(i)
- 0
- 1
- 2
- >>>
复制代码
例2、生成特殊的数量
- >>> c = [x*x for x in range(2,5)]
- >>> c
- [4, 9, 16]
- >>>
复制代码
列表生成中加if、嵌套
使用if进行过滤
例、
- >>> a = [x*x for x in range(5) if x>2] #加入if对x进行条件过滤
- >>> a
- [9, 16]
- >>>
复制代码
例、
- >>> [m+n for m in ‘abc‘ for n in ‘xyz‘]
- [‘ax‘, ‘ay‘, ‘az‘, ‘bx‘, ‘by‘, ‘bz‘, ‘cx‘, ‘cy‘, ‘cz‘]
- >>>
复制代码
例:使用列表生成式,列出当前目录下所有的文件夹和目录名
- >>> import os #导入os模块
- >>> [d for d in os.listdir(‘.‘)] #括号内为指定的路径
- [‘DLLs‘, ‘Doc‘, ‘include‘, ‘Lib‘, ‘libs‘, ‘Scripts‘, ‘tcl‘, ‘Tools‘]
- >>>
复制代码
生成器Generator
但是,受到内存限制,列表容量肯定是有限的。而且,创建一个包含100万个元素的列表,不仅占用很大的存储空间,如果我们仅仅需要访问前面几个元素,那后面绝大多数元素占用的空间都白白浪费了。
Python提供了这一解决方案,列表元素通过某种算法推算出,在循环的过程中不断推算出后续元素,而不必创建完整的list
Python保存的是算法,每次调用next()
创建generator
1、把列表生成式的[]改成()
2、在一个普通函数中添加了yield关键字之后,这个函数就不在是一个普通函数,而是一个generator的函数,在每次调用next()的时候执行,遇到yield语句返回,再次执行时从上次返回yield语句处继续执行。
例1、
- >>> b = (x for x in range(10))
- >>> b
- <generator object <genexpr> at 0x02CB1418>
- >>> next(b) #获取下一元素,由于generator也是可迭代的一般使用for循环进行迭代
- 0
- >>>
复制代码
例2、
- >>> def f():
- print(‘s1‘)
- yield 1
- print(‘s2‘)
- yield 2
- >>> a = f()
- >>> next(a)
- s1
- 1
- >>> next(a)
- s2
- 2
- >>> next(a)
- Traceback (most recent call last):
- File "<pyshell#11>", line 1, in <module>
- next(a)
- StopIteration #当没有yield可以执行的时候抛出错误
- >>>
复制代码
对于函数改造得到的generator,在遇到return或者函数体完成就结束了generator的指令,
例:
- >>> def f():
- print(‘s1‘)
- yield 1
- return
- print(‘s2‘)
- yield 2
- >>> for i in f():
- print(i)
- s1
- 1
- >>> >>> def f():
- print(‘s1‘)
- yield 1
- return
- print(‘s2‘)
- yield 2
- >>> for i in f():
- print(i)
- s1
- 1
- >>>
复制代码
来自群组: Java用户组