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) 收藏 举报