Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/list/4.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 将不可数传递给list.extend()_Python_List - Fatal编程技术网

Python 将不可数传递给list.extend()

Python 将不可数传递给list.extend(),python,list,Python,List,我正在创建一个公共方法,允许调用者将值写入设备,例如,将其称为write_vals() 由于这些值将是实时键入的,因此我希望通过允许用户键入列表或单个值来简化用户的生活,具体取决于他们需要写入的值的数量。例如: write_to_device([1,2,3]) 或 我的函数希望使用一个平面列表,因此我尝试聪明地编写如下代码: input_list = [] input_list.extend( input_val ) 当用户输入一个列表时,它工作得很顺利,但当用户输入一个整数时,它失败得

我正在创建一个公共方法,允许调用者将值写入设备,例如,将其称为write_vals()

由于这些值将是实时键入的,因此我希望通过允许用户键入列表或单个值来简化用户的生活,具体取决于他们需要写入的值的数量。例如:

write_to_device([1,2,3])

我的函数希望使用一个平面列表,因此我尝试聪明地编写如下代码:

input_list = []  
input_list.extend( input_val )
当用户输入一个列表时,它工作得很顺利,但当用户输入一个整数时,它失败得很惨:

TypeError:“int”对象不可编辑

使用list.append()将在传入列表时创建一个嵌套列表,这将是扁平化的额外麻烦

检查传入的对象的类型似乎很笨拙,也不是pythonic,希望list.extend()能够接受非iterables对我来说毫无意义。尝试各种其他编码方法也是如此


建议(请仅编码相关)将不胜感激。

您可以检查传递的参数是否是带有函数的列表

更好的解决方案是支持数量可变的参数:

def write_to_device(*args):
   # |args| is now a list of all the arguments given to the function
   input_list.extend(args)
def write_to_device(*args):
    print args
这样,即使不必将多个值显式指定为列表,也可以为函数指定多个值:

write_to_device(1)
write_to_device(1,2,3)

您可以使用
尝试…除了…

try:
    input_list = list(input_val)
except TypeError:
    input_list = list((input_val,))
这是蟒蛇式的


注:可变参数,如,更好,但为了完整起见,我留下这个答案。有时不能使用可变参数

可以使用try,而不是检查类型。尽管如此,我还是很想知道比我更精通python的人是如何做到这一点的

input_list = []
try:
    input_list.extend(input_val)
except TypeError:
    input_list.append(input_val)

从错误检查的角度来看,这似乎是不完整的,但如果您知道用户只会输入一个值或一个列表,这将起作用。

有几种方法可以做到这一点,您可以根据需要选择哪种方法

您可以尝试将参数转换为列表,并假设如果它不起作用,则应将其解释为单个参数:

def write_to_device(args):
    try:
        args = list(args)
    except TypeError:
        args = [args]

    print args
>>> write_to_device(1)
[1]
>>> write_to_device([1,2])
[1, 2]
>>> write_to_device('abc')
['a', 'b', 'c']
这很好,但如果将字符串作为参数传递,则可能会遇到问题:

def write_to_device(args):
    try:
        args = list(args)
    except TypeError:
        args = [args]

    print args
>>> write_to_device(1)
[1]
>>> write_to_device([1,2])
[1, 2]
>>> write_to_device('abc')
['a', 'b', 'c']
您可以通过使用
isinstance
检查参数是否为字符串来更正此错误:

def write_to_device(args):
    if isinstance(args, basestring):
        args = [args]
    else:
        try:
            args = list(args)
        except TypeError:
            args = [args]

    print args
这给了你:

>>> write_to_device(1)
[1]
>>> write_to_device([1,2])
[1, 2]
>>> write_to_device('abc')
['abc']  
正如有人指出的,您可以允许函数接受任意数量的参数:

def write_to_device(*args):
   # |args| is now a list of all the arguments given to the function
   input_list.extend(args)
def write_to_device(*args):
    print args
这让你:

>>> write_to_device(1)
(1,)
>>> write_to_device([1,2])
([1, 2],)
>>> write_to_device('abc')
('abc',)
>>> write_to_device(*[1,2])
(1, 2)
我推荐的方法只是要求将列表传递给函数:

write_to_device([1])
write_to_device([1, 2, 3])

这是简单、直截了当、毫不含糊的。

基于之前的内容,我创建了以下内容:

def add2list(l,*args): l.extend(args)
# behaves like .extend, gets round issues of iterability     
# so simple, so powerful!
例如:

answer = 42
mylist = []
add2list(mylist,1)
add2list(mylist,2,3,'a','b','c',answer)
print mylist

结果:[1,2,3,'a',b',c',42]

当您说用户键入列表或单个值时,这是否意味着您正在以单个字符串的形式接收他们的输入?然后,您是否必须将其解析为逗号?如果您想传递一个列表以写入设备,您可以使用*:write_to_device(*mylist)write_to_device(*args)这样做,向用户表示不传递写入值是合法的,而在这种情况下则不合法。@JS:如果len(args)==0,您可以添加一个类似
的检查:raise TypeError('Missing arguments'))
@Zach感谢您的关注!我本来希望找到一个不那么冗长的解决方案,但这个很有效。我很喜欢你的“列表((输入值,)”技巧。非常感谢。如果将单个字符串传递给函数,如“abc”,则会中断。我喜欢您的第一个建议。干净优雅。用户将传入一个或多个十六进制值列表,因此,如果他们传入字符串,脚本就会爆炸,这只是甜点而已。;-)好,好。我将检查字符串并优雅地失败(抱怨):-)