Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/349.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

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/python-3.x/18.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 - Fatal编程技术网

Python 迭代可能是迭代器或单个元素的内容

Python 迭代可能是迭代器或单个元素的内容,python,python-3.x,Python,Python 3.x,假设我有以下函数: def sum(summands) s = 0 for a in summands: s = a + s def make_iterable(x): # returns x if x is iterable, returns [x] if x is not iterable 用户可以使用列表sum([1,2,3])来调用它,但是如果您也可以直接使用数字sum(5)来调用它,则会很方便。(事实上,这与数字无关,只是一个简单的例子。)

假设我有以下函数:

def sum(summands)
    s = 0
    for a in summands:
        s = a + s
def make_iterable(x):
    # returns x if x is iterable, returns [x] if x is not iterable
用户可以使用列表
sum([1,2,3])
来调用它,但是如果您也可以直接使用数字
sum(5)
来调用它,则会很方便。(事实上,这与数字无关,只是一个简单的例子。)

我可以发明一个函数:

def sum(summands)
    s = 0
    for a in summands:
        s = a + s
def make_iterable(x):
    # returns x if x is iterable, returns [x] if x is not iterable
但是有没有一种更短的、内置的方法可以使单个元素变得可移植?

这个怎么样

def sum(summands)
    s = 0

    try:
        iter(summands)
    except TypeError:
        return summands

    for a in summands:
        s = a + s
    return s
或者,如果您想使用您建议的shell函数,您可以将
try:
除外:
拉入
使其可使用

Python2.x:

def make_iterable(x):
    try:
        iter(x)
    except TypeError:
        x=[x]
    return x
Python3.x:

def make_iterable(x):
    try: yield from x
    except TypeError: yield x
然后总结一下

def sum(summands)
    s = 0

    summands = make_iterable(summands)

    for a in summands:
        s = a + s
    return s

您可以在函数内部检查它是否可编辑,如果不可编辑,则将其包装在列表中。我相信collections.Iterable是一个很好的方法:

import collections

if isinstance(summands, collections.Iterable):
    tmp = summands
else:
    tmp = [summands]

您可以测试它是列表还是int:

if isinstance(summand, list)
    sumlist(summand)
if isinstance(summand, int)
    Sumint(summand)
然后为每种类型编写求和函数。或者您可以使用列表comp将整数ino转换为列表'summand=[x代表范围内的x(summand+1)],然后使用它。

这就是您所需要的

def sum(summands)
s = 0
summands = summands if isinstance(summands, list) else [summands]
for a in summands:
    s = a + s

您可以检查它是否可编辑,并使其成为一个(假设它不是字符串)。注意:
sum
是内置函数的名称,因此您可能不应该将自己的函数命名为相同的名称。看

输出:

6
42
回溯(最近一次呼叫最后一次):
文件“iterate over something.py”,第18行,在
打印(mysum(“不起作用”))
mysum中第10行的文件“iterate over something.py”
raise TypeError('不支持字符串参数')
TypeError:不支持字符串参数

尝试
对其进行迭代,否则返回到单元素行为?“有没有更简短的内置方法来确保单元素的可移植性”--当然<代码>可编辑=[不可编辑]
。。。我认为更大的问题是,你似乎想把易受教育者和非易受教育者一视同仁。我觉得你打字太过分了。你应该知道你拥有的物品是否合适。如果它不是iterable,但您想将其传递给需要iterable的函数,那么在传递给函数--
func\u requirement\u iterable([not\u iterable])时,您应该将其转化为iterable。
make\u iterable(x)
解决方案已经比这个短了……;-)@mgilson:那么,如果它实际上是可编辑的,我就有问题了。@Michael——我进一步编辑了我的评论。我认为主要的问题是你想要平等地对待易受教育者,而不是不平等的易受教育者。你应该在任何时候都具体地知道你正在使用的对象是否适合。如果您不知道这一点,那么您编写的代码可能过于泛化,不容易阅读/理解,并且可能不太有用。至少,这是我的2c;-)我会用try/except only
it=iter(summands)
来包装,以防止不必要的错误吞咽。或者在3.x-
try:yield from something
except TypeError:yield something
中,然后用它作为你的
使不可接受的
@JonClements我喜欢
yield
的用法。我以前没有使用过它,但它可以帮助实现OP想要的更短的结果。字符串也是一个iterable,因此检查对象是否为
collections.iterable
type可能不安全。@ozgur--不确定您在这里说的是什么<代码>isinstance('abc',collections.Iterable)返回
True
。由于OP没有区分字符串和其他类型的iterables,我认为这是正确的行为……这是更好的答案,除非你覆盖了iter构建-in@HumphreyTriscuit我并不是想直接使用那个变量名,但我编辑它是为了更清楚。谢谢你抓住了!关于集合、dict、元组或任何其他自定义可迭代对象呢?