zoukankan      html  css  js  c++  java
  • 元组的记录作用以及拆包

    元组在结构上更像是不可变的列表,但是它的作用不仅如此,在《流畅的Python》中有一句解释: 元组其实是对数据的记录:元组中的每个元素都存放了记录中一个字段 的数据,外加这个字段的位置。正是这个位置信息给数据赋予了意义。

    如果只把元组理解为不可变的列表,那其他信息——它所含有的元素的 总数和它们的位置——似乎就变得可有可无。但是如果把元组当作一些字段的集合,那么数量和位置信息就变得非常重要了。

    >>> lax_coordinates = (33.9425, -118.408056) ➊
    >>> city, year, pop, chg, area = ('Tokyo', 2003, 32450, 0.66, 8014) ➋
    >>> traveler_ids = [('USA', '31195855'), ('BRA', 'CE342567'), ➌
    ... ('ESP', 'XDA205856')]
    >>> for passport in sorted(traveler_ids): ➍
    ... print('%s/%s' % passport) ➎
    ...
    BRA/CE342567
    ESP/XDA205856
    USA/31195855
    >>> for country, _ in traveler_ids: ➏
    ... print(country)
    ...
    USA
    BRA
    ESP

    ❶ 洛杉矶国际机场的经纬度。

    ❷ 东京市的一些信息:市名、年份、人口(单位:百万)、人口变化 (单位:百分比)和面积(单位:平方千米)。

    ❸ 一个元组列表,元组的形式为 (country_code, passport_number)。

    ❹ 在迭代的过程中,passport 变量被绑定到每个元组上。

    ❺ % 格式运算符能被匹配到对应的元组元素上。

    ❻ for 循环可以分别提取元组里的元素,也叫作拆包(unpacking)。因 为元组中第二个元素对我们没有什么用,所以它赋值给“_”占位符。

    元组的拆包:

    上述Demo中:把元组 ('Tokyo', 2003, 32450, 0.66, 8014) 里 的元素分别赋值给变量 city、year、pop、chg 和 area,而这所有的 赋值我们只用一行声明就写完了。同样,在后面一行中,一个 % 运算符 就把 passport 元组里的元素对应到了 print 函数的格式字符串空档 中。这两个都是对元组拆包的应用。

    元组拆包可以应用到任何可迭代对象上,唯一的硬性要求 是,被可迭代对象中的元素数量必须要跟接受这些元素的元组的空 档数一致。

    最好辨认的元组拆包形式就是平行赋值,也就是说把一个可迭代对象里 的元素,一并赋值到由对应的变量组成的元组中。就像下面这段代码:

    >>> lax_coordinates = (33.9425, -118.408056)
    >>> latitude, longitude = lax_coordinates # 元组拆包
    >>> latitude
    33.9425
    >>> longitude
    -118.408056

    另外一个很优雅的写法当属不使用中间变量交换两个变量的值:

    >>> b, a = a, b

    还可以用 * 运算符把一个可迭代对象拆开作为函数的参数:

    >>> divmod(20, 8)                   # divmod函数接受两个参数,除数和被除数,返回一个元组,第一个元素是相除结果整数,第二个元素是余数 
    (2, 4)
    >>> t = (20, 8)
    >>> divmod(*t)
    (2, 4)
    >>> quotient, remainder = divmod(*t)
    >>> quotient, remainder
    (2, 4)

    下面是另一个例子,这里元组拆包的用法则是让一个函数可以用元组的 形式返回多个值,然后调用函数的代码就能轻松地接受这些返回值。比 如 os.path.split() 函数就会返回以路径和最后一个文件名组成的元 组 (path, last_part):

    >>> import os
    >>> _, filename = os.path.split('/home/luciano/.ssh/idrsa.pub')
    >>> filename
    'idrsa.pub'

    在进行拆包的时候,我们不总是对元组里所有的数据都感兴趣,_ 占位 符能帮助处理这种情况,上面这段代码也展示了它的用法。

    除此之外,在元组拆包中使用 * 也可以帮助我们把注意力集中在元组的 部分元素上。

    用*来处理剩下的元素

    在 Python 中,函数用 *args 来获取不确定数量的参数算是一种经典写 法了。 于是 Python 3 里,这个概念被扩展到了平行赋值中:

    >>> a, b, *rest = range(5)
    >>> a, b, rest
    (0, 1, [2, 3, 4])
    >>> a, b, *rest = range(3)
    >>> a, b, rest
    (0, 1, [2])
    >>> a, b, *rest = range(2)
    >>> a, b, rest
    (0, 1, [])

    在平行赋值中,* 前缀只能用在一个变量名前面,但是这个变量可以出 现在赋值表达式的任意位置:

    >>> a, *body, c, d = range(5)
    >>> a, body, c, d
    (0, [1, 2], 3, 4)
    >>> *head, b, c, d = range(5)
    >>> head, b, c, d
    ([0, 1], 2, 3, 4)

    另外元组拆包还有个强大的功能,那就是可以应用在嵌套结构中。

    积一时之跬步,臻千里之遥程
  • 相关阅读:
    创建表空间tablespace,删除
    oracle表分区的,分区操作,分区查询,子分区查询
    oracle表分区创建
    git代码提交步骤,教程
    Spring整合Quartz实现动态定时器,相关api,定时器添加,删除,修改
    spring + quartz定时任务,以及修改定时任务
    oracle表分区详解
    Navicat for Oracle 绿色版 连接 Oracle 12c
    spring 整合maven 定时任务调度,多个任务写法
    Unity3D 之UGUI制小地图
  • 原文地址:https://www.cnblogs.com/wangbaojun/p/10620925.html
Copyright © 2011-2022 走看看