Python学习笔记(三)高级特性

本文详细介绍了Python中序列的切片、迭代、列表生成式及生成器等操作,并提供了实例代码帮助理解。此外,还深入探讨了如何利用这些操作提高代码效率。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

切片

L是一个list或tuple或string,对L的切片可以表示为L[a:b::c]表示从索引a开始取到b(不含)为止,每隔c个取一个。当a为0时可缺省。a、b可为负值因为[-1]表示最后一个元素以此类推。全缺省L[:]则复制list。L[::-1] 则逆序复制了一个list

迭代

list, tuple, dict(默认迭代key,顺序不定。迭代值可以用d.value()), str都是可迭代对象。可迭代对象的判断可以使用以下代码

from collections import Iterable
isinstance(a, Iterable)

enumerate()可以将list变为索引-元素对,从而在for中同时迭代索引和元素

列表生成式

列表生成式提供了一个简洁快速的方法来生成列表

[f(x) for x in L if g(x)]
使用满足g(x)的L的各元素生成对应的f(x)list

[(x,y) for x in l1 for y in l2]
两层循环,实现l1和l2的笛卡尔积

生成器

将列表生成式的[]改成()就成为了一个生成器g。生成器可以节省资源,保存的是算法,因此直接调用g返回的是对象而不是结果。因为生成器是可迭代对象,因此输出其生成的值可以用循环来输出。

生成器还有一种定义方法。函数定义中如果有yield关键字,则函数就成为一个生成器。如果最后有返回值,则使用for循环生成器不能拿到返回值。如果想拿到返回值,要在try中使用next(g)将g的生成结果逐个输出,然后用except StopIteration as e捕获错误,e.value()就是返回值

最后有一个使用生成器生成杨辉三角的习题。下一行的元素是上一行相邻元素之和,两头再追加1。进而可以考虑下一行实际上是两个上一行错位相加形成,缺少对应的加数则补0。考虑到这里的时候就可以构造出l.append(0)然后l[::-1]构造两个顺序相反的补0list,对应元素相加就可以得到下一行。然而这种方法还得构造逆序,仍然有些麻烦。
如果只使用补0之后的l,则l[i]+l[i+1]需要注意索引i+1不能越界,而且第一个1还要另外计算。但是list有个特性就是l[-1]是最后一个元素。因此使用l[i]+l[i-1]不仅解决了索引越界问题,而且还能将最后补的0用两次,可谓是一种十分简洁安全的算法

def triangle():
    l = [1]
    while True:
        yield l
    l.append(0)
        l = [l[i] + l[i-] for i in range(len(l))]

迭代器

凡是可以用next()的对象都是迭代器类型。凡是可以用for的对象都是可迭代类型。可迭代类型不一定是迭代器,如list,dict,str等。但可以使用iter(对象)来获得迭代器。因为迭代器的序列长度是未知的,其计算也是惰性的。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值