Python中声明未知类型变量?

2024-09-27 09:31:09 发布

您现在位置:Python中文网/ 问答频道 /正文

我在Python中遇到了一种情况(咳嗽,家庭作业),我需要将给定对象列表中的每个元素乘以指定的次数,然后返回元素的输出。问题是给出的样本输入是不同类型的。例如,一种情况可能会输入一个字符串列表,其中的元素需要乘法,而其他的可能是int。所以我的退货类型需要改变。我想这样做,而不必测试每种类型的对象是什么。有办法吗?我知道在C语言中我可以使用“var”,但我不知道Python中是否存在这样的东西?

我知道不必声明变量,但在这种情况下,我看不到任何方法。这是我做的功能:

def multiplyItemsByFour(argsList):

output = ????

for arg in argsList:
        output += arg * 4

return output

看看我需要如何添加到输出变量。如果我试图去掉第一行的输出赋值,就会得到一个错误,即变量没有定义。但是,如果我为空字符串指定0或“”值,则可能会引发异常,因为不能将3添加到字符串或“a”添加到整数,等等。。。

以下是一些输入和输出示例:

Input:  ('a','b')  Output:  'aaaabbbb'
Input:  (2,3,4)    Output:  36

谢谢!


Tags: 对象字符串元素类型列表inputoutputarg
3条回答

你确定这是给Python初学者的吗?对我来说,最简单的方法是使用reduce()和lambda,这两种工具都不是典型的初学者工具,有时甚至对于有经验的Python程序员来说也是不可取的:

def multiplyItemsByFour(argsList):
    if not argsList:
        return None
    newItems = [item * 4 for item in argsList]
    return reduce(lambda x, y: x + y, newItems)

像Alex Martelli一样,我在一开始就对一个空列表进行了快速测试,结果没有返回任何结果。注意,如果您使用的是Python 3,则必须导入functools才能使用reduce()。

基本上,reduce(lambda…)解决方案与其他建议非常相似,即使用第一个输入项设置累加器,然后处理其余的输入项;但更简洁。

在Python中非常简单。您需要获取列表中的数据类型-对第一个item-type(argsList[0])使用type()函数。然后初始化输出(你现在有您需要该类型的“零”或nul值。因此,正如int()或float()或str()返回其类型的零或num一样,to将type(argsList[0])返回列表中任何类型的零或num值。

所以,这里是您的函数,只需稍作修改:

def multiplyItemsByFour(argsList):
    output = type(argsList[0])()
    for arg in argsList:
        output += arg * 4
    return output

合作对象: argsList=[1, 2, 3, 4][1.0, 2.0, 3.0, 4.0]"abcdef"。。。等等

def fivetimes(anylist):
  return anylist * 5

如您所见,如果给您一个list参数,则不需要任何赋值来“乘以给定的次数并返回输出”。你说的是给定的列表;如果不是(最自然的方式)作为函数的参数,它是如何给你的?这并不重要——如果它是一个全局变量,一个作为参数的对象的属性,等等,这仍然不需要任何赋值。

如果“homeworkilly”禁止您使用列表的*运算符,并且只要求您自己实现它,则这将需要赋值,但不需要声明:

def multiply_the_hard_way(inputlist, multiplier):
    outputlist = []
    for i in range(multiplier):
        outputlist.extend(inputlist)
    return outputlist

您可以简单地将空列表设为“magicaly-appear”:无需将其“声明”为任何东西,它是一个空列表,Python编译器与您或代码的任何读者一样了解它。将它绑定到名称outputlist也不需要执行任何特殊的仪式,只需要绑定(aka赋值)本身:名称没有类型,只有对象有类型。。。那是Python!-)

Edit:OP现在说输出不能是一个列表,而是int、float或string,并且他不知道是什么。我要求澄清一下——乘一个列表总是返回一个列表,所以很明显他一定是说了些和他最初说的不同的东西,所以他必须乘一个列表。同时,这里还有一个读心术的尝试。也许他必须返回一个列表,其中输入列表的每一项都乘以相同的因子(该项是否为int、float、string、list…)。那么:

define multiply_each_item(somelist, multiplier):
  return [item * multiplier for item in somelist]

听着,妈妈,没有手的作业。(这被称为“列表理解”,顺便说一句)。

或者(不太可能,但我读心术的帽子可能会受到锡箔帽子的干扰,需要去疯帽店让他们调整)他需要(说)把每个列表项乘以就好像它们和第一个项是同一类型的,但是返回它们作为它们的原始类型,例如

>>> mystic(['zap', 1, 23, 'goo'], 2)
['zapzap', 11, 2323, 'googoo']
>>> mystic([23, '12', 15, 2.5], 2)
[46, '24', 30, 4.0]

即使是这个高度神秘的规格也可以容纳…:

>>> def mystic(alist, mul):
...   multyp = type(alist[0])
...   return [type(x)(mul*multyp(x)) for x in alist]
... 

…尽管我很怀疑这是作业中神秘符文中的规范。几乎任何精确的规范都可以实现,或者被证明是不可能实现的(通过要求您解决停止问题或者要求P==NP,比如;-)。这可能需要一些工作(例如,证明四色定理;-)。。。但仍然不足以从一系列相互矛盾的观察结果中神奇地预言出实际的规范是什么,没有例子等等,尽管在我们作为软件开发人员的日常工作中(啊,对于过去我们所要面对的只是家庭作业的美好时光!-)当然,我们确实遇到过很多这样的情况(而且必须解决它们才能挣到我们每天的面包;-)。

EditEdit:最后看到一个精确的规范,我指出我已经实现了这个规范,不管怎样,这里再次说明:

def multiplyItemsByFour(argsList):
  return [item * 4 for item in argsList]

editededit:终于/终于看到一个更精确的规格,带有(豪华!-)示例:

Input: ('a','b') Output: 'aaaabbbb' Input: (2,3,4) Output: 36

所以我们需要的是输入列表中的项的总和,每个项乘以4。我的首选解决方案:

def theFinalAndTrulyRealProblemAsPosed(argsList):
  items = iter(argsList)
  output = next(items, []) * 4
  for item in items:
    output += item * 4
  return output

如果禁止您使用这些结构中的某些,例如内置的itemsiter,那么还有许多其他的可能性(稍差一些),例如:

def theFinalAndTrulyRealProblemAsPosed(argsList):
  if not argsList: return None
  output = argsList[0] * 4
  for item in argsList[1:]:
    output += item * 4
  return output

对于空的argsList,第一个版本返回[],第二个版本返回None——不确定在这种情况下应该怎么做。

相关问题 更多 >

    热门问题