A股上市公司传智教育(股票代码 003032)旗下技术交流社区北京昌平校区

 找回密码
 加入黑马

QQ登录

只需一步,快速开始

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 返回的地方。再向下一句执行。
---------------------
【转载,仅作分享,侵删】
作者:quinn1994
原文:https://blog.csdn.net/quinn1994/article/details/79586473


1 个回复

倒序浏览
奈斯
回复 使用道具 举报
您需要登录后才可以回帖 登录 | 加入黑马