13.python的函数(四)——高级特性

本文介绍了 Python 中的列表操作与生成器的使用技巧,包括切片、迭代、列表生成式及生成器的定义与应用。通过具体示例展示了如何高效地处理数据。

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

1)切片

就是索引,之前在数据类型里面介绍过了。这里补充一下其他的索引形式。

 L[:10]   #前10个数
 L[-10:]  #后10个数
 L[10:20] #前11-20个数
 L[:10:2] #前10个数,每两个取一个
 L[::5]   #所有数,每5个取一个
2)迭代

所谓迭代就是用for循环对一个列表或者元组进行遍历。在python中通常用for~in 来遍历元素。这个在for循环中已经介绍过了。

下面说一下,字典的遍历。因为字典与其他几种常用的数据类型不同,它是非顺序集合。示例代码如下:

#!/usr/bin/env python3
# -*- coding: utf-8 -*-
i={'a':1,'b':2,'c':3}
for key in i:
    print key

这是对key进行遍历,也可以对value进行遍历。这里要用到iteritems()函数。示例代码:

#!/usr/bin/env python3
# -*- coding: utf-8 -*-
i={'a':1,'b':2,'c':3}
for value in i.iteritems():
    print value

输出结果如下:

C:\Python27\python.exe C:/Users/Administrator/PycharmProjects/练习.py
('a', 1)
('c', 3)
('b', 2)
同样也可以对键对进行遍历,示例代码如下:
#!/usr/bin/env python3
# -*- coding: utf-8 -*-
i={'a':1,'b':2,'c':3}
for k,v in i.iteritems():
    print k,v

输出结果如下:

C:\Python27\python.exe C:/Users/Administrator/PycharmProjects/练习.py
a 1
c 3
b 2

这里的结果就很明显了。

另外注意一点:

python中经常见到,for循环中引入两个变量。示例代码如下:

for x,y in [(1,1),(2,4),(3,9)]:
    print x,y
结果如下:
C:\Python27\python.exe C:/Users/Administrator/PycharmProjects/练习.py
1 1
2 4
3 9
3)列表生成式

顾名思义,就是python中可以生成各种列表的式子。这里我们要用到for..in。这里介绍几种常见的,

a=[1,2,3,4,5]
print[x*x for x in a]

生成以下列表:

[1, 4, 9, 16, 25]

还可以加入if判断来筛选特定的数。

a=[1,2,3,4,5]
print[x*x for x in a if x%2==1] #取余判断奇偶

生成如下列表:

[1, 9, 25]

还可以使用双重循环,生成全排列:

print[m+n for m in 'ABC' for n in 'XYZ']
['AX', 'AY', 'AZ', 'BX', 'BY', 'BZ', 'CX', 'CY', 'CZ']
关键在[]这个列表符号。


4)生成式

生成式的设定是为了让程序充分利用内存空间。当我们遇到图像处理一类的数据时,需要大量的空间。但是直接定义列表的话。太占用空间了。因而,需要一种可以根据算法自动生成空间的式子,这种一边循环一边计算的机制,称为生成器(Generator)。

生成器有两种定义方式。第一种就是直接将列表生成式中的【】,换成()。示例代码如下:

i=[1,2,3,4,5]
(x*x for x in i)

那么如何将其中的元素打出来呢?可以用next()方法。

i=[1,2,3,4,5]
L=(x*x for x in i)
print L.next()
print L.next()

结果如下:

1
4

但是如果是一个很大的数据的话,得多少print?我们想到了用for。代码如下:

i=[1,2,3,4,5]
L=(x*x for x in i)
for x in L:
    print(x)

这里要注意,这里generator保存的是算法。我们如果在本段程序之后,再尝试着打印一次元素。

我们可以看到:


这里说明,generator已经打印完毕。无法再计算了。

第二种,将循环中的print改为yield

我们由上面可以知道,可以利用循环来generate。比如我们要generate一个斐波那契数列,示例代码如下:

def func(x):
    n,a,b=0,0,1
    while n<x:
        print b
        a, b = b, a + b
        n=n+1
func(5)

这里我们可以将print改成yield,就可以了。

但是直接改成 后,出现一个错误。generator object func at 0x01F603F0>。

经过查找资料,在一个国外论坛上看到一个高票回答,原话是这样的“In Python 3, print() is a function, not a statement.A generator expression is like a list comprehension, except it creates an object that produces results when you iterate over it, not when you create it.”在我理解就是生成器这个东西是一边算,一边输出的。而且输出的是描述。print这个东西是一个函数,比较死脑筋。它只对其描述进行了打印。然后就这样了。敲打

这里有一点要注意:

yield 这个东西比较奇葩,程序执行到这里的话就会返回,然后下次执行的话会返回到上次yield 返回的地方。再向下一句执行。

希望有志同道合的小伙伴关注我的公众平台,欢迎您的批评指正。



评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值