python学习笔记4.3-python高级之元素的分解

  1. 序列分解为单独的变量 1.1 将一个包含N个元素的元组或者序列分解成为N个单独的变量。 在python中任何序列或者元素都可以通过一个简单的赋值来分解为单独的变量,唯一的要求是变量的总数和结构要与序列相吻合
p = (4,6,8)
x,y,z = p
print('x is',x)
print('y is',y)
print('z is',z)

屏幕输出的结果是:

x is 4
y is 6
z is 8

需要注意的是,如果元素的数量不匹配,将得到一个错误的提示:

p = (4,6,8)
y,z = p
print('y is',y)
print('z is',z)

错误提示:

Traceback (most recent call last):
  File "D:/home/temp/temp1.py", line 2, in <module>
    y,z = p
ValueError: too many values to unpack (expected 2)

1.2 分解操作丢弃特定的元素值 实际上不仅仅是元组或者列表,只要对向恰好是可迭代的,那么久可以执行分解操作,包括字符串,文件、迭代器和生成器。

p = 'nihao'
y,z,_,_,_, = p
print('y is',y)
print('z is',z)

屏幕输出:

y is n
z is i

事实上,从这个例子中我们也可以看出,如果是想丢弃某一些值,留下我们需要的特定值,我们可以才用一些用不到的变量名,例如_ 。(这不是最好的办法,下面会介绍一种更好的办法)

  1. 从任意长度的可迭代对象中分解元素 2.1 在1中我们发现了从对象中分解出N个元素,如果对象中元素数量大于N,则会抛出‘分解值过多(too many values to unpack)’的异常,python中,我们可以用‘*表达式’来解决这个问题。 *这个标号在python中表示不确定个数,例如在函数的参数不确定的时候用*args来代替(https://cloud.tencent.com/developer/article/1010503),在元素分解的时候也可以用。
p = 'nihao'
y,*q,z = p
print('y is',y)
print('q is',q)
print('z is',z)

屏幕输出:

y is n
q is ['i', 'h', 'a']
z is o

从例子可以看出,*修饰表达式的时候python处理的办法是将不确定个数的部分用一个列表来表示。很显然需要注意的问题是,这种方法不能再两端都用这种方法:

p = 'nihao'
*y,q,*z = p
print('y is',y)
print('q is',q)
print('z is',z)

屏幕输出:

  File "D:/home/temp/temp1.py", line 2
    *y,q,*z = p
    ^
SyntaxError: two starred expressions in assignment

其实很好理解,python不知道那一部分是确定的,所以无法处理。 2.2 多个‘*表达式’连用 有时候需要将多个‘*表达式’连用,以达到更加好的效果。

p = [20,88,'nihao',[7,8,2012]]
*y,(*_,z) = p
print('y is',y)
print('z is',z)

屏幕输出:

y is [20, 88, 'nihao']
z is 2012

这样就能精确的得到我们想要的元素。从中我们可以发现,一般这样用的场合是需要分解得到的元组在对象的一个还可以在分的对象中(子对象)。

元素分解是在编程中经常遇到的问题,采用这些方法可以是我们的代码精简,可阅读性强。

本文参与腾讯云自媒体分享计划,欢迎正在阅读的你也加入,一起分享。

发表于

我来说两句

0 条评论
登录 后参与评论

相关文章

来自专栏用户2442861的专栏

JavaScript正则表达式下——相关方法

http://www.cnblogs.com/dolphinX/p/3486136.html

371
来自专栏深度学习思考者

Python学习(五)——列表操作全透析

  列表是以类的形式实现的。“创建”列表实际上是将一个类实例化。因此,列表有多种方法可以操作。Python列表操作的函数和方法 列表操作包含以下函数: ...

17210
来自专栏前端知识分享

第173天:面向对象——数据类型检测的四种方法

使用typeof检测数据类型,首先返回的都是一个字符串,其次字符串中包含了对应的数据类型,例如:"number"、"string"、"boolean"、"und...

622
来自专栏深度学习之tensorflow实战篇

golang 格式“占位符”%d,%f,%s等应用类型

golang 的fmt 包实现了格式化I/O函数,类似于C的 printf 和 scanf。 红色部分为常用占位符 ? ? ? ? ? ? ? 对于 ...

3597
来自专栏IMWeb前端团队

javascript Array.prototype.sort 排序浅谈

每个 Array 的实例都自带sort 函数,本文对sort函数的用法做一些探讨。 基本用法 1.数组元素为字符串的排序: var fruit = ['cher...

2097
来自专栏小白的技术客栈

Python内置数据结构之字符串

字符串 今天跟大家来说一说Python中的字符串数据结构。 ? 上文回顾 让我们回顾一下可变类型及不可变类型: 不可变数据类型:str、int、tuple ...

3718
来自专栏海天一树

小朋友学Python(7):输入与输出

一、print与input print "a =", a = input() print "b =" b = input() print "c =", c = ...

26610
来自专栏mathor

C++ reverse函数的用法

4572
来自专栏Petrichor的专栏

Python: 全局变量 & 局部变量的使用

  码Python代码时,想用全局变量,报了错。所以上网查了相关文档,总结出 以下几点 :

762
来自专栏noteless

java continue break 关键字 详解 区别 用法 标记 标签 使用 示例 联系

java continue break 关键字 详解 区别  用法 标记  标签 使用 示例 联系   跳出循环 带标签的continue和break 嵌套循环...

731

扫码关注云+社区