如何在函数中为参数赋予类型

时间:2019-05-16 21:24:02

标签: python

我正在尝试创建一个将列表缩短到仅4个元素的函数。但是,我无法为函数的参数分配类型,我称之为my_list

我尝试使用type(),但是没有用。

以下是一些代码:

LL = [2,3,4,5,6,2,5,4]
print(len(LL))
def remove_last_elements(the_list):

    the_list.type(list) #Here it gives an error message that I will put below

    for i in range (len(the_list)-4):
        the_list=the_list.remove(the_list[len(the_list)-1])
remove_last_elements(LL)
print(LL)

它给了我这个错误信息。如果我使用.type()

    remove_last_elements(LL)
  File "C:\Users\visha\OneDrive\Desktop\Arnav's Things\Coding\Python Programs (and side-products)\Balloons.py", line 5, in remove_last_elements
    the_list.type(list)
AttributeError: 'list' object has no attribute 'type'

这是另一段没有.type()的代码段:

LL = [2,3,4,5,6,2,5,4]
print(len(LL))
def remove_last_elements(the_list):
    for i in range (len(the_list)-4):
        the_list=the_list.remove(the_list[len(the_list)-1])
remove_last_elements(LL)
print(LL)

哪个给出以下错误消息:

  remove_last_elements(LL)
  File "C:\Users\visha\OneDrive\Desktop\Arnav's Things\Coding\Python Programs (and side-products)\Balloons.py", line 5, in remove_last_elements
    the_list=the_list.remove(the_list[len(the_list)-1])
AttributeError: 'NoneType' object has no attribute 'remove'

3 个答案:

答案 0 :(得分:3)

我不确定通过“将类型分配给列表”来尝试做什么。根据定义,列表属于列表类型,您可以使用type(the_list)进行验证。不过,我不建议根据此结果做出任何程序化决策。只需假设所有类型都是正确的类型,否则就崩溃。

如果不确定对象上是否存在方法并查看方法是否存在,可以使用dir()

>>> dir(list)
['__add__', '__class__', '__contains__', '__delattr__', '__delitem__', '__dir__', '__doc__
', '__eq__', '__format__', '__ge__', '__getattribute__', '__getitem__', '__gt__', '__hash_
_', '__iadd__', '__imul__', '__init__', '__iter__', '__le__', '__len__', '__lt__', '__mul_
_', '__ne__', '__new__', '__reduce__', '__reduce_ex__', '__repr__', '__reversed__', '__rmu
l__', '__setattr__', '__setitem__', '__sizeof__', '__str__', '__subclasshook__', 'append',
 'clear', 'copy', 'count', 'extend', 'index', 'insert', 'pop', 'remove', 'reverse', 'sort'
]
>>> "type" in dir(list)
False
>>>

第二,list.remove()是一个操作in place并返回值None的函数。当您分配(基本上)the_list = None时,在下一次迭代中(基本上)None.remove()会引发您遇到的第二个异常。

解决这两个错误会产生:

LL = [2,3,4,5,6,2,5,4]

def remove_last_elements(the_list):
    for i in range (len(the_list)-4):
        the_list.remove(the_list[len(the_list)-1])

remove_last_elements(LL)
print(LL)

现在,此功能甚至必要吗?由于某些原因,我不会争论。

首先,它在不通知调用者的情况下hardcodes值4,使其几乎无用于其他目的。例如,如果要删除5个元素,我很不幸,必须编写一个新函数。我希望缩短长度是此函数的参数,以便我可以选择自行选择的任意n值的列表缩短。

第二,remove总是删除列表中第一个出现的项目。结果列表[2, 3, 6, 2]与服务有关,函数名称暗示“删除最后一个元素”,这令人困惑。作为您函数的用户,当列表中的最后四个元素中的两个仍然存在时,我感到很惊讶!

最后,.remove是一个非常慢的操作:对于列表中的每个项目,我们都必须走到整个列表才能找到并删除它。这将对大型列表产生严重的性能影响。

我将使用Python的slice operator来高效,简洁和可预测地执行列表缩短:

>>> LL = [2,3,4,5,6,2,5,4]
>>> LL[:-4] # remove and return up to the last 4
[2, 3, 4, 5]
>>> LL[-4:] # remove and return the last 4
[6, 2, 5, 4]

您可以修改程序以使用它,如下所示:

LL = [2,3,4,5,6,2,5,4]

LL = LL[:-4]
print(LL) # => [2, 3, 4, 5]

答案 1 :(得分:2)

Python是动态类型的。您不能像在C或C ++中那样声明变量的类型。列表是可以具有不同类型的元素的集合。相同的列表可以容纳所有内容:字符串,整数,浮点数,自定义类等。

这:the_list.type(list)毫无意义。

评论后编辑

如评论中所述,值得一提的是,由于提供了对 type hint 的python 3.5支持。您可以在heredocs

中了解更多信息

答案 2 :(得分:1)

LL = [2,3,4,5,6,2,5,4]
print(len(LL))
def remove_last_elements(the_list):
    for i in range (len(the_list)-4):
        the_list=the_list.remove(the_list[len(the_list)-1])
remove_last_elements(LL)
print(LL)

您正在将the_list重置为无,因为the_list.remove会执行适当的操作,并且不返回任何值

尝试一下:

LL = [2,3,4,5,6,2,5,4]
print(len(LL))
def remove_last_elements(the_list):
    for i in range (len(the_list)-4):
        the_list.remove(the_list[len(the_list)-1])
remove_last_elements(LL)
print(LL)

您无法使用.type()设置Python对象的类型,而只是使用type(x)来获取对象x的类型。如果要将某物的类型从一组更改为列表,可以使用list(set('a', 'b'))