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

pyhton中有几个高级特性,也可以说语法糖。这些特性可以减少我们在一些场景中特殊操作的代码量。

切片操作(指定范围内的索引访问)

平时在C++中如果我需要访问一个序列中某个范围内的数组,一般是避免不了用循环的。
而在python中提供了指定索引范围的操作
比如

R=[1,2,3,4,5]
#遍历可以使用下面的方法
R[05]
#>>[1,2,3,4,5]
#代表的意思是取前5个元素,从下标0开始取,一直到5,但不包括5。
#如果了解C++中的STL的话,可以关联起来理解,上述方法对于区间操作是前闭后开的

还可以设置隔几个取一个元素

R=[1,2,3,4,5]
#遍历可以使用下面的方法
R[05: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教程

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值