Python之高级特性
3.高级特性
3.1切片
L = list(range(100))
L[0:3]表示,从索引0开始取,直到索引3为止,但不包括索引3
如果第一个索引是0,还可以省略 L[:3]
也支持取倒数元素 L[-2:] 取L集合的倒数2位元素
L[10:20] 取前11-20个数:
L[:10:2]取前10个数,每两个取一个
L[::5] 所有数,每五个取1个
'ABCDEFG'[:3]
Python没有针对字符串的截取函数,只需要切片一个操作就可以完成,非常简单
3.2 迭代
python中不管迭代对象有无下标,都可以进行迭代
那么如何判断一个对象是否可迭代呢?from collections import Iterable
isinstance('abc', Iterable) ;
在Java里可以迭代下标,python里可以使用enumerate 函数迭代索引和元素的
for i, value in enumerate(['A', 'B', 'C']):
... print(i, value)
3.3 列表生成,是Python内置的非常简单却强大的可以用来创建list的生成式。
L = []
>>> for x in range(1, 11):
... L.append(x * x)#使用循环
#使用列表生成式
[x*x for x in range(1,11)if x%2 == 0] #要生成的元素x*x放置前面
#使用2层循环,生成全排列
[m+n for m in 'ABC' for n in 'XYZ']
import os # 导入os模块,模块的概念后面讲到
>>> [d for d in os.listdir('.')] # os.listdir可以列出文件和目录
#for循环其实可以同时使用两个甚至多个变量,比如dict的items()可以同时迭代key和value:
d = {'x': 'A', 'y': 'B', 'z': 'C' }
>>> for k, v in d.items():
... print(k, '=', v)
#列表生成式也可以使用两个变量来生成list:
d = {'x': 'A', 'y': 'B', 'z': 'C' }
>>> [k + '=' + v for k, v in d.items()]
['y=B', 'x=A', 'z=C']
#list中所有的字符串变成小写:
L = ['Hello', 'World', 18, 'Apple', None]
>>> [s.lower() for s in L if isinstance(s,str) == True]
3.4 生成器
列表的空间是有限的,在python中,一边循环一边计算的机制 generator
g = (x * x for x in range(10))
for n in g:
print(n)
#著名的斐波拉契数列(Fibonacci),除第一个和第二个数外,任意一个数都可由前两个数相加得到:1, 1, 2, 3, 5, 8, 13, 21, 34, ...
def fib(max):
n, a, b = 0, 0, 1
while n < max:
print(b)
a, b = b, a + b
n = n + 1
return 'done'
#上面的函数和generator仅一步之遥。要把fib函数变成generator,只需要把print(b)改为yield b就可以了:
#generator函数 在执行过程中,遇到yield就中断,下次又继续执行。
##杨辉三角
def triangles():
L = [1] #定义一个list[1]
while True:
yield L
L = [L[i] + L[i + 1] for i in range(len(L) - 1)]
L.insert(0,1)
L.append(1)
if(len(L)>10):
break
#生成一个generator对象,然后通过for循环迭代输出每一行
a=triangles(10)
for i in a:
print(i)
3.5迭代器
直接作用于for循环的数据类型有以下几种:
一类是集合数据类型,如list、tuple、dict、set、str等;
一类是generator,包括生成器和带yield的generator function。
Iterable 这些可以直接作用于for循环的对象统称为可迭代对象:Iterable。
可以使用isinstance()判断一个对象是否是Iterable对象:
isinstance({}, Iterable) #True
Iterator 可以被next()函数调用并不断返回下一个值的对象称为迭代器:Iterator
可以使用isinstance()判断一个对象是否是Iterator对象:
isinstance((x for x in range(10)), Iterator) #True
isinstance('abc', Iterator) #False
-------------------------------------------------------------
是因为Python的Iterator对象表示的是一个数据流,Iterator对象可以被next()函数调用并不断返回
下一个数据,直到没有数据时抛出StopIteration错误。可以把这个数据流看做是一个有序序列,
但我们却不能提前知道序列的长度,只能不断通过next()函数实现按需计算下一个数据,
所以Iterator的计算是惰性的,只有在需要返回下一个数据时它才会计算。
-------------------------------------------
集合数据类型如list、dict、str等是Iterable但不是Iterator,不过可以通过iter()函数获得一个Iterator对象。