Python:item.method()和函数(item)

Python:item.method()和函数(item),python,function,logic,Python,Function,Logic,选择某些方法作为其所用项的前缀,但某些方法是需要项作为参数的函数的逻辑是什么? 例如: L=[1,4,3] print len(L) #function(item) L.sort() #item.method() 我认为修改该项的函数可能需要加前缀,而返回该项信息的函数则将其用作参数,但我不太确定 编辑: 我想问的是为什么python没有L.len()?这两种功能的性质有什么区别?还是随机选择了一些操作是方法,而一些是函数?一些可

选择某些方法作为其所用项的前缀,但某些方法是需要项作为参数的函数的逻辑是什么? 例如:

    L=[1,4,3]    
    print len(L)  #function(item)  
    L.sort()  #item.method()            
我认为修改该项的函数可能需要加前缀,而返回该项信息的函数则将其用作参数,但我不太确定

编辑:


我想问的是为什么python没有L.len()?这两种功能的性质有什么区别?还是随机选择了一些操作是方法,而一些是函数?

一些可以帮助您更好地理解的东西:

您所描述的
item.function()
实际上是一个方法,由所述
item
所属的类定义。您需要全面了解Python中的
函数
对象
方法
,甚至更多内容

仅从概念上讲,当您调用
L.sort()
时,type/class
list
sort()
方法实际上接受一个参数,该参数通常按惯例称为
self
,表示类型/class
list
的对象/实例,在本例中为
L
。和
sort
类似于一个独立的
sorted
函数,但只是将排序逻辑应用于
L
itself。相对而言,
排序的
函数需要一个iterable(例如,
列表
)作为其必需的参数才能起作用

代码示例:

my_list = [2, 1, 3]

# .sort() is a list method that applies the sorting logic to a
# specific instance of list, in this case, my_list
my_list.sort()

# sorted is a built-in function that's more generic which can be
# used on any iterable of Python, including list type
sorted(my_list)

Python背后的原则之一是。特别是,要获取序列的长度(数组/元组/xrange…),无论序列类型如何,始终使用
len

但是,并非所有这些序列类型都支持排序。这使得它更适合作为一种方法

a = [0,1,2]
b = (0,1,2)
c = xrange(3)
d = "abc"

print len(a), len(b), len(c), len(d) # Ok

a.sort() # Ok
b.sort() # AttributeError: 'tuple' object has no attribute 'sort'
c.sort() # AttributeError: 'xrange' object has no attribute 'sort'
d.sort() # AttributeError: 'str' object has no attribute 'sort'

方法和函数之间的区别不仅仅是它们的语法

def foo():
    print "function!"

class ExampleClass(object):
    def foo(self):
        print "method!"
在本例中,我使用1个方法
foo
定义了一个函数
foo
和一个类
ExampleClass
。 让我们试着使用它们:

>>> foo()
function!
>>> e = ExampleClass()
>>> e.foo()
method!
>>> l = [3,4,5]
>>> l.foo()

Traceback (most recent call last):
  File "<pyshell#7>", line 1, in <module>
    l.foo()
AttributeError: 'list' object has no attribute 'foo'
>>> 
>>foo()
功能!
>>>e=示例类()
>>>e.foo()
方法!
>>>l=[3,4,5]
>>>l.foo()
回溯(最近一次呼叫最后一次):
文件“”,第1行,在
l、 foo()
AttributeError:“列表”对象没有属性“foo”
>>> 
尽管两者都有相同的名称,但Python知道如果执行foo(),则会调用函数,因此它会检查是否有使用该名称定义的函数


如果您执行a.foo(),它知道您正在调用一个方法,因此它将检查是否有为
a
类型的对象定义的
foo
,如果有,它将调用它。在上一个示例中,我们尝试使用一个列表,它给出了一个错误,因为列表没有定义
foo
方法。

Oops。。。我会把它改成方法。我想我需要把我的问题弄清楚。我想指出,
len(L)
是一个特例,因为即使它是一个函数,它基本上是方法调用的语法糖,特别是它做了类似于
return L.\u len\u()
@或yes的事情。我想在回答中提到这一点,但我认为这可能会压倒OP。这就是为什么我只提供了关于这一问题的非常高级的概念。非常感谢!我想这是有道理的。我在寻找更一般的东西,不局限于我在问题中提到的例子。哦,好吧,我想我明白了:这是对的:对于任何数据类型都需要相同的内部级别编码的操作是函数(item),但是特定于数据类型的操作是item.method(),对吗?