Python学习日志——初识迭代

enumerate

enumerate可以获得有序元素集的元素和对应索引下标

1 l=['Adam','Lisa','Usher','Tom']
2 for index,ele in enumerate(l):
3     print(index , ele)

输出:

(0, 'Adam')
(1, 'Lisa')
(2, 'Usher')
(3, 'Tom')

以上述为例,enumerate是把

['Adam','Lisa','Usher','Tom']

变成了类似下述数据集结构

[(0,'Adam'),(1,'Lisa'),(3,'Usher'),(4,'Tom')]

因此,迭代的每一个元素实际上是一个tuple:

for t in enumerate(L):
    index = t[0]
    name = t[1]

注意:

当使用enumerate遍历dict时

1 d = { 'Adam': 95, 'Lisa': 85, 'Tom': 59, 'Usher': 74 }
2 for index,ele in enumerate(d):
3     print(index,ele)

输出:

(0, 'Lisa')
(1, 'Usher')
(2, 'Adam')
(3, 'Tom')

当遍历dict时,因为本身dict是无序的,所以即使返回了索引的下标,但仅仅是输出的顺序而不是按照显示出来的结构顺序(个人猜测:存储顺序?),而且返回的元素,显示出来值是dict的key值

 

for

如果一个结构可进行遍历,即可使用for来循环遍历,而不必在乎其数据结构,对于“遍历”这个概念,即对于一个数据集,其中元素依次不重复返回,并且不涉及其具体数据集的结构。

range函数可以用来生成指定的有规律的数组,用法可用如下表达

range(fisrtValue,LastValue+1,step);

firstValue即数组第一个数,LastValue即最后一个数,step代表步长,可当作为一个等差数列。用数列表达如下,其中index即为索引下表

range(2,16,3);

index--ele

0--2

1--5

2--7

3--10

4--13

用数学表达如下:firstValue+step*(index-1),(最大值LastValue-1)

通过数学表达式可以看出,range函数同样可以创建单调递减的数列。

 

回到正题

可以通过for循环创建一个指定的list,表达如下。

func(x) for x in list if condition

func(x),即函数func接受x为参数后的返回值,if condition,即判断条件,返回True的x才能作为func的参数并生成一个元素,若缺失if及条件,则不进行x筛选

1 def func(x):
2     return x/5
3 print([func(x) for x in range(1,50,3) if x%2 == 0])

输出

[0, 2, 3, 4, 5, 6, 8, 9]

 

在上述基础上还有多层表达式[func(x1,x2,....) for x in L1 for x2 in L2 ..........],可用来简写多重循环

其上表达为

...

   for x2 in L2:

          for x1 in L1:

                return func(x1,x2,...)

这里做一个3位水仙花数作为例子(水仙花数是指一个 n 位数(n≥3 ),它的每个位上的数字的 n 次幂之和等于它本身(例如:1^3 + 5^3+ 3^3 = 153))

 1 print [x*100+y*10+z for x in range(1,10) for y in range (0,10) for z in range(0,10) if x*x*x+y*y*y+z*z*z == x*100+y*10+z] 

输出:

[153, 370, 371, 407]

 

待续

posted on 2018-03-11 21:50  SaltFishYe  阅读(137)  评论(0)    收藏  举报

导航