Python学习 (三 高级特性)

本文介绍Python中列表切片、迭代、列表生成式及生成器的基本用法,展示如何高效处理数据。

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

前言:结合之前的知识,进行一些程序的编写。

3.1 切片

如题,取list或tuple的部分元素,按照某种规律,需要用到的就是:

>>> l = range(11)
>>> l
[0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10]
>>> l[:4]
[0, 1, 2, 3]
>>> l[: : 2]
[0, 2, 4, 6, 8, 10]
>>> l[-3 :]
[8, 9, 10]
>>> l[:]
[0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10]

由上可知,隔着取,去部分都可以通过:实现,而对于字符串'xxx' u'xxx',可看作是一种list,虽然说str不变,但是结合之前讲过的内容,只是指向不变,原先生成的str还在,具体见如下:

>>> 'abcd'[:]
'abcd'
>>> 'abcd'[:2]
'ab'

3.2 迭代

给定一个list或tuple,通过for循环来遍历这个list或tuple,这种遍历我们称为迭代(Iteration)。
dict也可以迭代,但是默认取的是key,如下:

>>> d = {'a':1,'b':2,'c':3}
>>> for i in d:
...     print i
...
a
c
b

顺序不一是因为dict不像list按序存储。如果要迭代value,可以用for value in d.itervalues(),如果要同时迭代key和value,可以用for k, v in d.iteritems()。这里使用的是method,当然,字符串也可以迭代。
如何判断一个对象是可迭代对象?方法是通过collections模块的Iterable类型判断:

>>> from collections import Iterable
>>> isinstance('ab',Iterable)
True
>>> isinstance((1,2),Iterable)
True
>>> isinstance(22,Iterable)
False
>>> isinstance(('a','b'),Iterable)
True

如果要对list实行下标循环,可以使用enumerate函数:

>>> for a,b in enumerate(['a','b','c']):
...     print a, b
0 a
1 b
2 c

可迭代就可以用for循环,包括我们自己定义的数据类型,这点在以后会用到。

3.3 列表生成式

列表生成式即List Comprehensions,是Python内置的非常简单却强大的可以用来创建list的生成式。
运用列表生成式,可以快速生成list,可以通过一个list推导出另一个list,而代码却十分简洁。

>>> [x*x for x in range(1,11) if x%2==0]
[4, 16, 36, 64, 100] #不能用逗号
>>> [x + "T" + y for x in 'abc' for y in 'xyz']
['aTx', 'aTy', 'aTz', 'bTx', 'bTy', 'bTz', 'cTx', 'cTy', 'cTz']
>>> l = ['Peter','Mary','Amy']
>>> m = ['apple','peach']
>>> [x + " likes " + y for x in l for y in m]#注意数据类型的一致性
['Peter likes apple', 'Peter likes peach', 'Mary likes apple', 'Mary likes peach', 'Amy likes apple', 'Amy likes peach']

如何把一个list中的所有字符串变成小写:

>>> def test(l=[]):
...     m = []
...     for x in l:
...         if isinstance(x,str):
...             m.append(x.lower())
...         else:
...             m.append(x)
...     return m
>>> l = ['Apple','BEer',1,None]
>>> test(l)
['apple', 'beer', 1, None] 
>>> [x.lower() if isinstance(x,str) else x for x in l  ]
['apple', 'beer', 1, None] #简便程度很显然,要注意的是for后面有了if就不能有else,逻辑不通,但是if...else 后面可以接for...in

3.4 生成器

生成器(generator)是一种一边循环一边计算的生成数据的方式,这样可以节约大量的存储空间。

方法一

列表生成式的状态下将[]改为(),用next()调用数据,也可以使用for循环,例子如下:

>>> [x*x for x in range(11)]
[0, 1, 4, 9, 16, 25, 36, 49, 64, 81, 100]
>>> g=(x*x for x in range(11))
>>> g=<generator object <genexpr> at 0x02B224E0>
>>> g.next()
0
>>> g.next()
1
>>> g.next()
4
>>> g.next()
9
>>> for n in g:
...     print n
16   #紧接着未算完的开始,重新获取的话需要重新定义一次
25
36
49
64
81
100

方法二

使用yield语句。示例如下:

>>> def fib(n):
...     i,a,b = 0,0,1
...     while i < n:
...         print b
...         a,b=b,a+b
...         i = i+1
>>> fib(5)
1
1
2
3
5
>>> def fib(n):
...     i,a,b = 0,0,1
...     while i < n:
...         yield b
...         a,b=b,a+b
...         i = i+1
>>>
>>> fib(5)
<generator object fib at 0x02B96968>
>>> for n in fib(5):
...     print n
...
1
1
2
3
5

如果一个函数定义中包含yield关键字,那么这个函数就不再是一个普通函数,而是一个generator。函数是顺序执行,遇到return语句或者最后一行函数语句就返回。而变成generator的函数,在每次调用next()的时候执行,遇到yield语句返回,再次执行时从上次返回的yield语句处继续执行。但是对于函数而言,一般只用for来进行调用就可以了,不使用next()方法。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值