pyhton中有几个高级特性,也可以说语法糖。这些特性可以减少我们在一些场景中特殊操作的代码量。
切片操作(指定范围内的索引访问)
平时在C++中如果我需要访问一个序列中某个范围内的数组,一般是避免不了用循环的。
而在python中提供了指定索引范围的操作
比如
R=[1,2,3,4,5]
#遍历可以使用下面的方法
R[0:5]
#>>[1,2,3,4,5]
#代表的意思是取前5个元素,从下标0开始取,一直到5,但不包括5。
#如果了解C++中的STL的话,可以关联起来理解,上述方法对于区间操作是前闭后开的
还可以设置隔几个取一个元素
R=[1,2,3,4,5]
#遍历可以使用下面的方法
R[0:5:2]
#>>[1,3,5]
#代表的意思是取前5个元素,隔一个元素输出一个
#如果了解C++中的STL的话,可以关联起来理解,上述方法对于区间操作是前闭后开的
python中的切片操作可以大大的方便我们提取序列中的元素,生成新的额序列,一行代码就替换了很多的循环,不仅如此还可以对字符串和元组使用切片操作。
迭代操作(抽象程度很高的循环)
python中的循环使用的是for ... in ...
的结构
这个in就比较有意思了,只要是可以循环访问的对象,都可以使用for来进行迭代操作。
python中可以使用isinstance()
函数来判断一个函数是否可以进行迭代操作。
使用前需要先导入一个Iterable模块
from collections import Iterable
r = [1,2,3,4,5]
print(isinstance(r,Iterable))
#输出:True
同时python的for可以使用两个参数来同时迭代下标索引和元素本身
r = ['A','B','C','D','E']
for i,value in r:
print(i,value)
#输出
0 A
1 B
2 C
3 D
4 E
最后补充
默认情况下,dict迭代的是key。如果要迭代value,可以用for value in d.values(),如果要同时迭代key和value,可以用for k, v in d.items()。
列表生成式
这个特性非常有意思,我们可以来编写语句来生成列表
如要生成一个从0到10的列表
[x for x in range(11)]
只需要一行话就可以生成了,而且可读性还很高
还可以使用if语句来细化生成的规则
如下:
[x * x for x in range(1, 11) if x % 2 == 0]
[4, 16, 36, 64, 100]
还有可以用来生成全排列
下面我写个三种循环生成1 2 3 的三个数字的全排列
print([m+n+k for m in '123' for n in '123' for k in '123' if m!=n and n!=k and m!=k])
更多的,还可以进行过滤操作
L1 = ['Hello', 'World', 18, 'Apple', None]
print([x for x in L1 if isinstance(x,str)])
#输出:['Hello', 'World', 'Apple']
生成器(规则)
上面说到的列表生成式,一旦执行就会生成一个完整的符合生成式规则的列表
但有的时候我们只希望定义生成规则,而不希望一次性全部生成的操作呢,python也提供了一种叫生成器的特性,可以实现一边循环一边计算。
生成一个生成器的方法,就是把一个列表生成式的[]
换成()
l1=(x * x for x in range(1, 11) if x % 2 == 0])
这样l1就是一个生成器了
我们可以使用循环来调用这个生成器来获得每一次的运算结果,而且结果是迭代的
l1=(x * x for x in range(1, 11) if x % 2 == 0])
for n in l1:
print(n)
生成器中保存的运算规则,也可以说保存的是一个算法,也就是说我们也可以使用一个函数编写生成器。
但是呢函数不具有生成器那种迭代演算的性质。pytho中提供了一个yield
关键字
这使得含有yield关键字的函数变成一个生成器。
这里引用一下廖雪峰教程的斐波拉契数列的例子:
def fib(max):
n, a, b = 0, 0, 1
while n < max:
yield b
a, b = b, a + b
n = n + 1
return 'done'
当调用fib()时,运行到yield
会返回,当下一次调用的时候会继续在yield
处继续执行,而不是重新在函数入口处执行。这样就可以达到了生成器的功能,一边迭代一边运算。每次调用fib()遇到yield
都会中断返回,再次执行又会继续在上一次yield
处往下执行
最后贴上个人写的打印杨辉三角的程序
def triangles():
a=[1]
while True:
yield a
a.append(0)#加多个0,下面的运算才不会溢出
a=[a[x]+a[x-1] for x in range(len(a))]
n=0
for t in triangles():
print(t)
n = n+1
if n==10:
break
当生成器无法输出时,会抛出一个StopIteration
错误,我们可以使用异常来接收这个错误。
迭代器
最后这个特性,个人觉得只需要理解清除Iterator
对象和Iterable
对象的区别及对应的类型就好。
具体来说可以使用isinstance(对象,Iterable)
函数判断就可以了,其实也不需要特别的去记。
真要记的话,也可以看这个对象能不能用next()
函数调用不断返回下一个值,可以的就是Iterator
对象,对应的就是上面所说的生成器。
参考资料:廖雪峰python教程