您的位置:首页 > 编程语言 > Python开发

python笔记(二)一些特别语法

2017-08-24 13:15 225 查看
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教程
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签:  python