Python中非常有用的高级特性,1行代码能实现的功能,决不写5行代码。请始终牢记,代码越少,开发效率越高。
1、切片slice。
L = [1, 2, 3, 4, 5]
L[0:3]=[1,2,3]
表示,从索引0
开始取,直到索引3
为止,但不包括索引3
。即索引0
,1
,2
,正好是3个元素。 如果第一个索引是0
,还可以省略
倒数切片
L[-2:]=[4,5]从倒数第二个数 到 最后一个数
L = list(range(100))# 创建一个0-99的数列L
L[:10:2]# 前10个数,每两个取一个
L[::5]# 所有数,每5个取一个
iterable.[::-1] # 字符串翻转。非常有用!!
tuple也是一种list,只是不可变,支持切片操作,操作的结果仍是tuple
字符串
'xxx'
也可以看成是一种list,每个元素就是一个字符。因此,字符串也可以用切片操作,只是操作结果仍是字符串,相当于其他编程语言里的字符串截取函数 substring等
2、Python的
for
循环抽象程度要高于Java的for
循环,因为Python的for
循环不仅可以用在list或tuple上,还可以作用在其他可迭代对象上。list这种数据类型虽然有下标,但很多其他数据类型是没有下标的,但是,只要是可迭代对象,无论有无下标,都可以迭代 ,比如dict就可以迭代,字符串也可迭代。
for key in d: #迭代key
for value in d.values():#迭代value
for k, v in d.items():#key,value都迭代
for ch in 'ABC': #字符串,分别打印A,B,C</span>
3、 判断一个对象是可迭代对象,方法是通过collections模块的Iterable类型判断:
4、 Python内置的
enumerate
函数可以把一个list变成索引-元素对,这样就可以在for
循环中同时迭代索引和元素本身:
5、
for
循环里,同时引用了两个变量,在Python里是很常见的,比如下面的代码:
6、列表生成式: Python内置的非常简单却强大的可以用来创建list的生成式
生成list
[1, 2, 3, 4, 5, 6, 7, 8, 9, 10]
可以用list(range(1, 11))
筛选出仅偶数的平方
字符串的拼接用‘+’
列出当前目录下的所有文件和目录名
>>> import os # 导入os模块,模块的概念后面讲到
>>> [d for d in os.listdir('.')] # os.listdir可以列出文件和目录,路径可以修改如e:/sublime/python
['.emacs.d', '.ssh', '.Trash', 'Adlm', 'Applications']
最后把一个list中所有的字符串变成小写:
>>> L = ['Hello', 'World', 'IBM', 'Apple']
>>> [s.lower() for s in L]
['hello', 'world', 'ibm', 'apple']
for 前面的表达式就是所需要做的操作,对迭代中的每一个item进行该操作,if判断进行筛选,写在列表生成式的最后,最后返回操作后的结果。
7、生成器generator:解决需要存储列表所有元素的内存难题, 在循环的过程中不断推算出后续的元素, 不必创建完整的list,从而节省大量的空间。
创建generator的方法:
- 列表生成式的
[]
改成(),next()函数获取generator的每一个元素,其实一般很少用该函数,用for循环会更加方便。
>>> g = (x * x for x in range(10))
>>> for n in g:
... print(n) 函数定义中使用yield
关键字:会中断的print
生成斐波那契数列无法用列表生成式来完成,因为列表生成式只能操作当前迭代的元素,而无法操作列表中的两个元素。可以用函数打印出来,并储存前n个数的列表,考虑利用生成器:
def fib(max):
n, a, b = 0, 0, 1
while n < max:
yield b #
函数打印时为print(b)
a, b = b, a + b
n = n + 1
return 'done'
获取前max个元素用for也是非常方便,因为generator是可以迭代的
>>> for n in fib(6):
... print(n)
def triangles():
L=[1]
yield L
while True:
L=[1]+[L[i]+L[i+1] for i in range(len(L)-1)]+[1]
yield L
n = 0
for t in triangles():
print(t)
n = n + 1
if n == 10:
break
8、迭代器对象Iterator
凡是可作用于
for
循环的对象都是Iterable
类型(可迭代);
凡是可作用于
next()
函数的对象都是Iterator
类型,它们表示一个惰性计算的序列;
集合数据类型如
list
、dict
、str
等是Iterable
但不是Iterator
,不过可以通过iter()
函数获得一个Iterator
对象。
迭代器
Iterator
都是可迭代的Iterable
。
>>> isinstance('abc', Iterator)
False
>>> isinstance(iter('abc'), Iterator)
True
声明:学习廖雪峰的Python教程——Python高级特性章节后的学习笔记,感谢Micheal Liao.