找回密码
 注册
关于网站域名变更的通知
查看: 381|回复: 3
打印 上一主题 下一主题

完全理解 Python 迭代对象、迭代器、生成器之容器

[复制链接]
  • TA的每日心情
    开心
    2019-11-20 15:00
  • 签到天数: 2 天

    [LV.1]初来乍到

    跳转到指定楼层
    1#
    发表于 2018-11-14 13:23 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式

    EDA365欢迎您登录!

    您需要 登录 才可以下载或查看,没有帐号?注册

    x
    完全理解 Python 迭代对象、迭代器、生成器之容器
    % ?+ O, {3 w7 M3 `3 _
    ; S- p6 e8 Z; o, @: j8 v
    在了解Python的数据结构时,容器(container)、可迭代对象(iterable)、迭代器(iterator)、生成器(generator)、列表/集合/字典推导式(list,set,dict comprehension)众多概念参杂在一起,难免让初学者一头雾水。
    * C8 t7 H7 F1 Y$ u容器(container)
    ( e" E+ n$ Y; p9 L4 K0 t* B容器是一种把多个元素组织在一起的数据结构,容器中的元素可以逐个地迭代获取,可以用in, not in关键字判断元素是否包含在容器中。通常这类数据结构把所有的元素存储在内存中(也有一些特例,并不是所有的元素都放在内存,比如迭代器和生成器对象)在Python中,常见的容器对象有:; Z' O- n. k  ^3 w
    list, deque, ....$ V' N' z7 m( @& b8 m
    set, frozensets, ....3 [3 k# B: {9 V% ~! w0 K
    dict, defaultdict, OrderedDict, Counter, ....
    ) f6 n) ]0 _) m; y% Ftuple, namedtuple, …
    0 b# j1 A( l& _$ s( Z, R4 ^str
    5 {& U, v3 {' H0 S3 W
    3 q' o3 h2 }# k2 U2 c, S. `* A容器比较容易理解,因为你就可以把它看作是一个盒子、一栋房子、一个柜子,里面可以塞任何东西。从技术角度来说,当它可以用来询问某个元素是否包含在其中时,那么这个对象就可以认为是一个容器,比如 list,set,tuples都是容器对象:
    7 L' \+ ?4 d, n" s/ w>>> assert 1 in [1, 2, 3] # lists
    * e2 l5 @' _. o' w  h>>> assert 4 not in [1, 2, 3]' i6 G! t3 |! h7 a' h9 J! ^& b
    >>> assert 1 in {1, 2, 3} # sets0 c0 u4 h) l& `$ I; e/ L4 Y+ {
    >>> assert 4 not in {1, 2, 3}
    * J  N. v" R% T. g4 t5 o: o6 M>>> assert 1 in (1, 2, 3) # tuples
    : j- H# ~' ^1 j4 H: ~>>> assert 4 not in (1, 2, 3)7 Q, @: E) Q$ x
    5 O8 T% e/ G4 @% e( b8 j  x2 W  w
    询问某元素是否在dict中用dict的中key:
    # o, {3 X0 k7 e2 V0 `>>> d = {1: 'foo', 2: 'bar', 3: 'qux'}9 N/ D. K+ b/ v+ g) p7 v
    >>> assert 1 in d
    1 e4 K' g3 I+ h5 {# H  z>>> assert 'foo' not in d # 'foo' 不是dict中的元素) P; Q, L5 r' \

    6 V  G0 W/ Y! e; ~( w- u/ r% [询问某substring是否在string中:
    5 b4 G1 _& x4 ?>>> s = 'foobar'
    0 g' B7 e' c$ P" C2 G0 F>>> assert 'b' in s
    7 d2 @6 a: j/ X' h>>> assert 'x' not in s/ S& w) s3 q, {% S' I; w
    >>> assert 'foo' in s
    4 h6 K; o% V- E9 w7 S  g$ ^- I5 l# u
    尽管绝大多数容器都提供了某种方式来获取其中的每一个元素,但这并不是容器本身提供的能力,而是可迭代对象赋予了容器这种能力,当然并不是所有的容器都是可迭代的,比如:Bloom filter,虽然Bloom filter可以用来检测某个元素是否包含在容器中,但是并不能从容器中获取其中的每一个值,因为Bloom filter压根就没把元素存储在容器中,而是通过一个散列函数映射成一个值保存在数组中。

    - f8 y# g# d7 w, X( |- ]
    您需要登录后才可以回帖 登录 | 注册

    本版积分规则

    关闭

    推荐内容上一条 /1 下一条

    EDA365公众号

    关于我们|手机版|EDA365电子论坛网 ( 粤ICP备18020198号-1 )

    GMT+8, 2025-7-24 01:17 , Processed in 0.125000 second(s), 23 queries , Gzip On.

    深圳市墨知创新科技有限公司

    地址:深圳市南山区科技生态园2栋A座805 电话:19926409050

    快速回复 返回顶部 返回列表