龙空技术网

每天python 从任意长度可迭代对象中分解元素

珺毅同学 176

前言:

现在兄弟们对“python用星号输出字母h”大体比较珍视,各位老铁们都需要知道一些“python用星号输出字母h”的相关文章。那么小编同时在网络上收集了一些有关“python用星号输出字母h””的相关文章,希望小伙伴们能喜欢,大家一起来了解一下吧!

[浮云]​从某个可迭代对象中分解出N个元素,但是这个可迭代元素的长度可能超过了N,这会导致出现“分解值过多的异常”(too many values to unpack)。

​解决方法

​[太阳]python中星号表达式,“ * 表达式 ” 可以用来解决这个问题。

比如说有一门课程,决定在期末作业成绩中去掉第一个和最后一个,只对中间剩下的成绩做平均统计。如果作业有5个,可以简单的将5个都分解出来。如果有30个呢?是不是计算就变得很复杂了。

采用 * 表达式方法,就会变得很简单。

def drop_first_last(grades):		first,*middle,last = grades		return avg(middle)

再举一个例子,假设有一些用户记录,记录由姓名和电子邮件地址组成,后面跟着任意数量的电话号码。可以这样分解记录:

>>record = ('Dave','dave@example.com','773-555-1212','847-525-1122')>>name,email,*phone_numbers = record>>name输出:‘Dave’>>email输出:'dave@example.com'>>phone_numbers输出:['773-555-1212','847-525-1122']

分析:不管需要分解出多少个电话号码,变量phone_numbers一直是列表,而这是毫无意义的。如此一来,对于任何用到了变量phone_numbers的代码都不必对它可能是一个列表的情况负责,或者额外做任何形式的类型检查。

​[太阳] * 修饰的变量也可以位于列表的第一个位置。

例如,用一系列的值来代表公司过去8个季度的销售额。如果想对最近一个季度的销售额同前7个季度的平均值作比较,可以这样操作:

*trailing_qtrs,current_qtr = sales_recordtrailing_avg = sum(trailing_qtrs) / len(trailing_qtrs)return avg_comparison(trailing_avg,current_qtr)

我们来看一下添加上数据在解释器层面是怎么执行的:

>>*trailing,current = [10,8,7,1,9,5,10,3]>>trailing输出:[10,8,7,1,9,5,10]>>current输出:3

这样就很好理解了。

​[中国赞]进阶

对于分解未知或者任意长度的可迭代对象,这种扩展的分解操作可谓是量身定做的工具。

通常,这类可迭代对象中会有一些已知的组件或者模式,利用 *表达式 分解可迭代对象可以轻松利用这些模式。

​[太阳]*形式的语法在迭代一个变长的元组序列时尤其好用。

例如,假设有一个带标记的元组序列:

records = [('foo',1,2),('bar','hello'),('foo',3,4),]def do_foo(x,y):	print('foo',x,y)def do_bar(s):	print('bar',s)for tag,*args in records:	if tag == 'foo':    	  do_foo(*args)	elif tag == 'bar':    	  do_bar(*args)

​​[太阳]当和某些特定的字符串处理操作相结合,比如拆分操作,这种*形式的语法所支持的分解操作也是十分方便。

>>line = 'nobody:*:-2:-2:Unprivileged User:/var/empty:/usr/bin/false'>>uname,*fields,homedir,sh = line.split(':')>>uname输出:'nobody'>>homedir输出:'/var/empty'>>sh输出:'/use/bin/false'

有时候可能想分解出某些值然后再丢弃他们。在分解的时候,不能只是指定一个单独的 * ,

可以使用几个常用的来表示带丢弃的变量名。

>>record = ('ACME',50,123,(12,18,2021))>>name,*_,(*_,year) = record>>name输出:'ACME'>>year输出:2012

​[太阳]*分解操作和各种函数式语言中的列表处理功能有着一定的相似性。

例如有一个列表,可以像下面这样轻松的将其分解为头部和尾部:

>>items = [1,10,7,4,5,9]>>head,*tail = items>>head输出:1>>tail输出:[10,7,4,5,9]

​[太阳]在编写执行这类拆分功能的函数时,人们可以假设这是为了实现某些精巧的递归算法。

>>def sum(items):...   head,*tail = items...   return head+sum(tail) if tail else head...>>sum(items)

本文较为详细地讲述了python在可迭代对象中分解元素时 *表示的用法。

学习更多的python小技巧,记得关注哦~[玫瑰]

标签: #python用星号输出字母h