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

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

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

    [LV.1]初来乍到

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

    EDA365欢迎您登录!

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

    x
    完全理解 Python 迭代对象、迭代器、生成器之容器
    1 Q8 t) b4 {4 h- M( G
    5 ]7 O7 T  A- G: u- \$ L1 T% B5 Q
    在了解Python的数据结构时,容器(container)、可迭代对象(iterable)、迭代器(iterator)、生成器(generator)、列表/集合/字典推导式(list,set,dict comprehension)众多概念参杂在一起,难免让初学者一头雾水。
    ' c0 U3 Y1 p# a$ i  x4 \7 s容器(container). F9 H1 e2 d) x. l, `7 R
    容器是一种把多个元素组织在一起的数据结构,容器中的元素可以逐个地迭代获取,可以用in, not in关键字判断元素是否包含在容器中。通常这类数据结构把所有的元素存储在内存中(也有一些特例,并不是所有的元素都放在内存,比如迭代器和生成器对象)在Python中,常见的容器对象有:. y: f- {, f/ J' F, S2 X
    list, deque, ....( d# `; K7 T+ m* Q$ s# w: B
    set, frozensets, ....0 \" ?3 V! a- v# X" P
    dict, defaultdict, OrderedDict, Counter, ..../ u* O, n; [- t
    tuple, namedtuple, …
      W* D0 e2 X! q9 hstr
    # t0 ]  P+ @9 R7 d* n
    3 x) I6 @' A! f9 x容器比较容易理解,因为你就可以把它看作是一个盒子、一栋房子、一个柜子,里面可以塞任何东西。从技术角度来说,当它可以用来询问某个元素是否包含在其中时,那么这个对象就可以认为是一个容器,比如 list,set,tuples都是容器对象:
    , H8 ^& a- c  Z! \1 `>>> assert 1 in [1, 2, 3] # lists$ S; d2 Y' x. X1 B9 {
    >>> assert 4 not in [1, 2, 3]4 y! V3 D+ I2 c" t' S% @
    >>> assert 1 in {1, 2, 3} # sets
    ; ~2 Z* i2 t$ ?' U2 ~5 |4 M5 h; h>>> assert 4 not in {1, 2, 3}# x5 U2 i% i) f4 e+ m0 U& P
    >>> assert 1 in (1, 2, 3) # tuples
    # z( ]5 g* }) e>>> assert 4 not in (1, 2, 3)
    6 O, z0 J' U" W2 z: j) I
    $ N) O$ \% Q' u. Z8 d# i! o: O  `询问某元素是否在dict中用dict的中key:  n# x6 ]( ]; A, z; `7 @( ]
    >>> d = {1: 'foo', 2: 'bar', 3: 'qux'}# r) D- L" Q9 v" G
    >>> assert 1 in d  D+ d0 l; _* x7 @( t. L" Z2 \
    >>> assert 'foo' not in d # 'foo' 不是dict中的元素* k& Z0 Q) e( K; |) ^! q& s

    : @# Q) w$ c& E+ t/ O9 ?. [询问某substring是否在string中:9 q" X- ?, B: o7 W8 \; L
    >>> s = 'foobar'
    # k" l$ i: J& D. S" G' \; e>>> assert 'b' in s
    ' l/ h& w3 a7 u) U2 |+ ?>>> assert 'x' not in s
    6 F" @: `3 T9 ^# e>>> assert 'foo' in s0 N; F+ G3 {: d* J* A

    ' y" i  G# \9 t% W" s8 u尽管绝大多数容器都提供了某种方式来获取其中的每一个元素,但这并不是容器本身提供的能力,而是可迭代对象赋予了容器这种能力,当然并不是所有的容器都是可迭代的,比如:Bloom filter,虽然Bloom filter可以用来检测某个元素是否包含在容器中,但是并不能从容器中获取其中的每一个值,因为Bloom filter压根就没把元素存储在容器中,而是通过一个散列函数映射成一个值保存在数组中。
    : {; f+ ?2 v1 S4 i- V3 [' ?0 E( ?& c  [
    您需要登录后才可以回帖 登录 | 注册

    本版积分规则

    关闭

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

    EDA365公众号

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

    GMT+8, 2025-10-6 19:11 , Processed in 0.140625 second(s), 23 queries , Gzip On.

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

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

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