Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/python-3.x/16.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python 解包时是否可以指定默认值?_Python_Python 3.x_Iterable Unpacking - Fatal编程技术网

Python 解包时是否可以指定默认值?

Python 解包时是否可以指定默认值?,python,python-3.x,iterable-unpacking,Python,Python 3.x,Iterable Unpacking,我有以下资料: >>> myString = "has spaces" >>> first, second = myString.split() >>> myString = "doesNotHaveSpaces" >>> first, second = myString.split() Traceback (most recent call last): File "<stdin>", line 1, in

我有以下资料:

>>> myString = "has spaces"
>>> first, second = myString.split()
>>> myString = "doesNotHaveSpaces"
>>> first, second = myString.split()
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
ValueError: need more than 1 value to unpack

我可以建议您考虑使用不同的方法,即<代码>分区< /代码>,而不是<代码>分裂< /代码>:

>>> myString = "has spaces"
>>> left, separator, right = myString.partition(' ')
>>> left
'has'
>>> myString = "doesNotHaveSpaces"
>>> left, separator, right = myString.partition(' ')
>>> left
'doesNotHaveSpaces'
如果您使用的是python3,则可以使用以下选项:

>>> myString = "doesNotHaveSpaces"
>>> first, *rest = myString.split()
>>> first
'doesNotHaveSpaces'
>>> rest
[]

一般的解决方案是使用一个值为
None
的iterable,然后使用一个结果:

from itertools import chain, islice, repeat

none_repat = repeat(None)
example_iter = iter(range(1)) #or range(2) or range(0)

first, second = islice(chain(example_iter, none_repeat), 2)
这将用
None
填充缺少的值,如果您非常需要此类功能,可以将其放入如下函数中:

def fill_iter(it, size, fill_value=None):
    return islice(chain(it, repeat(fill_value)), size)
尽管到目前为止最常见的用法是字符串,这也是为什么存在字符串。

您可以尝试以下方法:

NUM2UNPACK=2   
parts = myString.split()    
first, second = parts+[None]*(NUM2UNPACK-(len(parts)))     

这里有一个解包元组并在元组比预期短时使用默认值的通用解决方案:

unpacker = lambda x,y=1,z=2:(x,y,z)

packed = (8,5)
a,b,c = unpacker(*packed)
print(a,b,c) # 8 5 2

packed = (8,)
a,b,c = unpacker(*packed)
print(a,b,c) # 8 1 2

据我所知,这是不可能的,因为split函数就是这样写的。但是可以使用if语句,比如字符串中是否有空格。太好了!:)任务的正确工具。
unpacker = lambda x,y=1,z=2:(x,y,z)

packed = (8,5)
a,b,c = unpacker(*packed)
print(a,b,c) # 8 5 2

packed = (8,)
a,b,c = unpacker(*packed)
print(a,b,c) # 8 1 2