《老鸟python 系列》视频上线了,全网稀缺资源,涵盖python人工智能教程,爬虫教程,web教程,数据分析教程以及界面库和服务器教程,以及各个方向的主流实用项目,手把手带你从零开始进阶高手之路!点击 链接 查看详情




迭代

阅读:227568746    分享到

对于所有的集合,无论是有序集合(str,tuple,list)还是无序集合(set,dict), 我们都可以通过 for 循环来遍历该集合,这种遍历我们称为迭代(Iteration)。

对于所有集合的迭代,带入的都是集合中的成员(dict 带入的是键),在 Python 中,迭代是通过 for...in 来完成的。

集合迭代

我们知道 for...in 遍历有序集合的时, 带入的是集合中的单个成员,这里的单个成员变量可以是任何类型的,比如成员本身也可以是个集合。

mylist = [1, "hello", [1, 2], (1,), {"a": 1}]

for item in mylist:
    print(item)

for...in 遍历无序集合 set 时,带入的是 set 中的单个成员, 但要注意 set 的内存结构和 dict 一样都是按 hash 表存储的,和我们创建时候给的顺序不一定一致。

myset = set(["a", "b", (1, 2)])

for item in myset:
    print(item)

for...in 遍历无序集合 dict 时,带入的并不是 dict 的单个成员变量,而是 dict 单个成员变量的 key。

mydict = {"a": 1, "b": 2, "c": 3}

for item in mydict:
    print(item)

for...in 直接遍历 dict 的 keys 函数,values 函数和 items 函数。

students_dict = {"name": "ruhua", "age": 18}

for student in students_dict.keys():
    print(student)   # 带入的是键

for student in students_dict.values():
    print(student)   # 带入的是值

for student in students_dict.items():
    print(student)   # 带入的是成员

Iterable 和 enumerate

如何判断一个对象是可迭代对象呢?方法是通过 collections 模块的 Iterable 类型判断。

from collections.abc import Iterable

myint = 2
myfloat = 2.2
mybool = True
mynone = None
mystr = "hello"
mylist = [1, 2, 3]
mytuple = (1, 2, 3)
myset = set([1, 2, 3])
mydict = {"a": 1, "b": 2, "c": 3}

print(isinstance(myint, Iterable))   # False
print(isinstance(myfloat, Iterable)) # False
print(isinstance(mybool, Iterable))  # False
print(isinstance(mynone, Iterable))  # False
print(isinstance(mystr, Iterable))   # True
print(isinstance(mylist, Iterable))  # True
print(isinstance(mytuple, Iterable)) # True
print(isinstance(myset, Iterable))   # True
print(isinstance(mydict, Iterable))  # True

如果要对集合实现类似 c++,java 等那样的下标循环怎么办呢,Python 内置的 enumerate 函数可以把一个集合变成索引-成员对,这样就可以在 for...in 中同时迭代索引和成员(dict 是键)本身。

mylist = [1, 2, 3]
mydict = {"a": 1, "b": 2, "c": 3}

for index, item in enumerate(mylist):
    print(index, item)

for index, item in enumerate(mydict):
    print(index, item)

for...in 遍历集合时,我们得到的是集合的单个成员(dict 是 key),如果集合的单个成员也是一个集合, 我们可以用多个变量来带入该成员的成员,注意带入的变量个数必须和该成员每个成员的个数一致。

mylist = [(1, 2), (3, 4), (5, 6)]
mydict = {(1, 2): 1, (3, 4): 2, (5, 6): 3}

for itemone, itemtwo in mylist:
    print(itemone, itemtwo)

for index, item in mydict:
    print(itemone, itemtwo)

for itemone, itemtwo, itemthree in mylist:  # 错误
    print(itemone, itemtwo)

注意如果想用多个变量带入集合的成员,必须确保集合的成员是个集合,且集合成员的成员个数 是一样的。

mylist = [(1, 2), (3, 4), (5, 6, 7)]

for itemone, itemtwo in mylist:  # 错误
    pass

本节重要知识点

dict 遍历注意事项。

会使用 Iterable 和 enumerate。

作业

著名公司(某易)笔试题:请使用迭代查找一个 list 中最小和最大值,并返回一个 dict, 返回值的样式为:{"min": min, "max": max}。

mylist = [4, 9, 1, 8]

# 在下面完成代码

如果以上内容对您有帮助,请老板用微信扫一下赞赏码,赞赏后加微信号 birdpython 领取免费视频。


登录后评论

user_image
feemung
2020年10月4日 02:09 回复

你是大神老鸟吗,看了你录制的视频,很厉害


user_image
陈梓瀚
2020年1月2日 15:00 回复
def findmax(mylist):
    max = mylist[0]  # 先假定第一个元素是最大值
    maxdict = {"max": max}

    for item in mylist:
        if item > maxdict["max"]:
            maxdict["max"] = item

    return maxdict


mylist = [4, 8, 9, 3]
print(findmax(mylist))

user_image
unique
2019年11月29日 22:26 回复

非常感谢,刚刚学习到生成器


user_image
Belleve-PLT
2019年4月22日 04:41 回复

写得好


user_image
貘吃馍香
2019年3月30日 00:20 回复

厉害了我的哥,终于弄明白啥是迭代了