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 条评论
登录 后参与评论

相关文章

来自专栏Ryan Miao

ehcache报错

jfinal2.0+tomcat7+ehcache2.6.11+Linux Linux version 2.6.18-164.el5 (mockbuild@x8...

3749
来自专栏跟着阿笨一起玩NET

c# 使用timer定时器操作,上次定时到了以后,下次还未执行完怎么处理

------解决方案-------------------------------------------------------- 开始的时候,禁用定时器,你...

3011
来自专栏一个会写诗的程序员的博客

java.base.jmod

/Library/Java/JavaVirtualMachines/jdk-9.jdk/Contents/Home/jmods$ jmod list java....

1162
来自专栏linux驱动个人学习

高通Audio中ASOC的machine驱动

ASoC被分为Machine、Platform和Codec三大部分,其中的Machine驱动负责Platform和Codec之间的耦合以及部分和设备或板子特定的...

1K4
来自专栏WOLFRAM

向日葵中的数学之美

1923
来自专栏MelonTeam专栏

Bitmap 源码阅读笔记

导语: Android 系统上的图片的处理,跟Bitmap 这个类脱不了关系,我们有必要去深入阅读里面的源码,以便在工作中能更好的处理Bitmap相关的问题...

2608
来自专栏我和未来有约会

简练的视图模型 ViewModel

patterns & practices Developer Center 发布了 Unity Application Block 1.2 for Silver...

2339
来自专栏Hadoop数据仓库

Oracle sqlldr 如何导入一个日期列

1. LOAD DATA INFILE * INTO TABLE test FIELDS TERMINATED BY X'9' TRAILING NULLCO...

1866
来自专栏marsggbo

Udacity并行计算课程 CS344 编程作业答案

892
来自专栏Petrichor的专栏

Dataset 列表:机器学习研究

In computer vision, face images have been used extensively to develop face recog...

1771

扫码关注云+社区