Python 函数返回值的长度

Python 函数返回值的长度,python,python-3.x,function,Python,Python 3.x,Function,我有一个小程序,它接受一个或多个列表,将内容随机化,然后打印出来 import random def randomize(*seq): shuffled = list(seq) for i in shuffled: random.shuffle(i) return iter(shuffled) colors = ["red", "blue", "green", "purple"] shapes = ["square", "circle", "tri

我有一个小程序,它接受一个或多个列表,将内容随机化,然后打印出来

import random


def randomize(*seq):
    shuffled = list(seq)
    for i in shuffled:
        random.shuffle(i)
    return iter(shuffled)


colors = ["red", "blue", "green", "purple"]
shapes = ["square", "circle", "triangle", "octagon"]

for i in randomize(colors, shapes):
    print(i)
它按原样工作

另外,我希望能够在返回值上获得len()

  • 如果我做了
    len(随机化(颜色))
    我应该回去
    4
  • 如果我做了
    len(随机化(颜色、形状))
    我应该回去
    8
我收到此错误:
预期的类型为“Sized”,改为“Iterator”


我在看
len()
\uuu len\uuuu
的对比,但我不知道如何解决这个问题。

从返回中删除
iter
调用。没有它,循环将工作

def randomize(*seq):
    shuffled = list(seq)
    for i in shuffled:
        random.shuffle(i)
    return shuffled

colors = ["red", "blue", "green", "purple"]
shapes = ["square", "circle", "triangle", "octagon"]

randomized = randomize(colors, shapes)
print('number of lists', len(randomized))
print('total number of elements', sum([len(l) for l in randomized]))

for i in randomized:
    print(i)

为了避免对返回的列表进行汇总,您需要更改
randomize
的返回值,这取决于结果。最简单的更改就是在列表被洗牌后将它们连接起来。

从返回中删除
iter
调用。没有它,循环将工作

def randomize(*seq):
    shuffled = list(seq)
    for i in shuffled:
        random.shuffle(i)
    return shuffled

colors = ["red", "blue", "green", "purple"]
shapes = ["square", "circle", "triangle", "octagon"]

randomized = randomize(colors, shapes)
print('number of lists', len(randomized))
print('total number of elements', sum([len(l) for l in randomized]))

for i in randomized:
    print(i)

为了避免对返回的列表进行汇总,您需要更改
randomize
的返回值,这取决于结果。最简单的改变就是在列表被洗牌后将它们连接起来。

我想你想要这样的东西——它连接列表,然后洗牌

import random
import itertools

def randomize(*seq):
    shuffled = list(itertools.chain.from_iterable(seq))
    random.shuffle(shuffled)
    return iter(shuffled)


colors = ["red", "blue", "green", "purple"]
shapes = ["square", "circle", "triangle", "octagon"]

res = list(randomize(colors, shapes))
for i in res:
    print(i)

print('length: {}'.format(len(res)))
如果您不希望这样,这也可以:

import random
import itertools

def randomize(*seq):
    shuffled = list(seq)
    for i in shuffled:
        random.shuffle(i)
    return iter(shuffled)


colors = ["red", "blue", "green", "purple"]
shapes = ["square", "circle", "triangle", "octagon"]

length = len(list(itertools.chain.from_iterable( randomize(colors, shapes))))
print('length: {}'.format(length))

for i in randomize(colors, shapes):
    print(i)

我想你想要这样的东西——它连接你的列表,然后洗牌

import random
import itertools

def randomize(*seq):
    shuffled = list(itertools.chain.from_iterable(seq))
    random.shuffle(shuffled)
    return iter(shuffled)


colors = ["red", "blue", "green", "purple"]
shapes = ["square", "circle", "triangle", "octagon"]

res = list(randomize(colors, shapes))
for i in res:
    print(i)

print('length: {}'.format(len(res)))
如果您不希望这样,这也可以:

import random
import itertools

def randomize(*seq):
    shuffled = list(seq)
    for i in shuffled:
        random.shuffle(i)
    return iter(shuffled)


colors = ["red", "blue", "green", "purple"]
shapes = ["square", "circle", "triangle", "octagon"]

length = len(list(itertools.chain.from_iterable( randomize(colors, shapes))))
print('length: {}'.format(length))

for i in randomize(colors, shapes):
    print(i)

你为什么在这里使用iter?为什么不直接返回序列呢?迭代器不需要有一组它生成的元素(可以是无限的),因此检查一个元素的大小不一定有意义。检查大小将迫使迭代器可能永远运行。该问题是由使用
iter()
引起的。要得到你想要的,不要使用iter();只需返回列表(即洗牌的
)。如果没有iter(),错误会消失,但计数是错误的。我得到的是1和2,不是4和8。我得到的是列表的数量,而不是元素的总数。@Mark列表的数量是元素的数量。添加
iter
并不能改变这一点。我不知道你为什么一开始就加上它。似乎要将作为参数传递给函数的对象中的所有项添加到新列表中。这就是你应该做的,只是洗牌并返回列表。你为什么在这里使用
iter
?为什么不直接返回序列呢?迭代器不需要有一组它生成的元素(可以是无限的),因此检查一个元素的大小不一定有意义。检查大小将迫使迭代器可能永远运行。该问题是由使用
iter()
引起的。要得到你想要的,不要使用iter()
;只需返回列表(即洗牌的
)。如果没有iter(),错误会消失,但计数是错误的。我得到的是1和2,不是4和8。我得到的是列表的数量,而不是元素的总数。@Mark列表的数量是元素的数量。添加
iter
并不能改变这一点。我不知道你为什么一开始就加上它。似乎要将作为参数传递给函数的对象中的所有项添加到新列表中。这就是你应该做的,只是洗牌并返回列表。否则,你不能同时拥有iterable和长度信息。是的,你可以。恰好列表迭代器没有长度,但是可iterable的
list
对象确实有长度。这有点吹毛求疵,但正确使用术语很重要,它返回的是2,而不是8。和以前一样的问题。我得到的是列表的总数,而不是列表中元素的总数。@juanpa.arrivillaga对,这里根本不需要使用iter。我是来这里禁食的,会改正的。@MarkS除非你改变你的规格,这是正确的。您将收到两个列表作为回报,因此长度为2。总长度是另一回事。我将添加一行来显示如何获得所有列表的总长度。不太确定我的规范有多不准确。我需要传入任意数量的列表,随机化元素,然后打印。那部分正在发挥作用。我还需要能够通过语法:len(randomize([传入列表])打印所有传入列表中所有元素的总长度。否则,你不能同时拥有iterable和长度信息。是的,你可以。碰巧列表迭代器没有长度,但可iterable的对象确实有长度。这有点挑剔,但正确使用术语很重要。这返回2,而不是8。与以前。我得到的是列表的总数,而不是列表中元素的总数。@juanpa.arrivillaga对,这里根本不需要使用iter。我在这里是为了快速,将进行更正。@MarkS除非您更改规格,否则这是正确的。您将收到两个列表作为回报,因此长度为2。总长度为dif不同的事情。我将添加一行来显示如何获得所有列表的总长度。不太确定我的规范如何不准确。我需要传入任意数量的列表,随机化元素,然后打印。这部分工作正常。我还需要能够通过语法:len(randomize)打印所有传入列表的所有元素的总长度([传入列表])。