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)打印所有传入列表的所有元素的总长度([传入列表])。