2016-03-25 11 views
1

いくつかのメソッドの前に置かれるメソッドを選ぶためのロジックはありますが、いくつかは引数としてアイテムを必要とする関数ですか?たとえば :アイテムに関する情報を返すものが引数としてそれを使用しながら、私は思っPython:item.method()and function(item)

L=[1,4,3]  
    print len(L) #function(item) 
    L.sort() #item.method()    

は多分項目を変更する機能は、前置する必要があるが、私はあまりにもわかりません。

編集:

私が尋ねるしようとしている何が、なぜPythonはL.len()を持っていないのですか? 2種類の関数の性質の違いは何ですか?あるいは、いくつかの操作がメソッドであり、いくつかは関数であると無作為に選択されましたか?あなたは少し良く理解するのに役立つかもしれ

答えて

2

Pythonの背後にある原則の一つは、There is Only One Way to Do Itです。特に、シーケンスの長さ(array/tuple/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' 
+0

ありがとう!私はこれが理にかなっていると思う。私はもっ​​と一般的なものを探していますが、質問に入れた例に限定されません。 – Tinkidinki

+0

ああ、私はそれを持っていると思う:これは正しい:任意のデータ型の同じ内部レベルのコーディングを必要とする操作は、関数(アイテム)ですが、データ型に固有のものはitem.method()ですか? – Tinkidinki

1

何か:http://www.tutorialspoint.com/python/python_classes_objects.htm

あなたはitem.function()として記述する何が実際にitemが属する言っクラスによって定義された方法です。 functionclassobjectmethod、多分もっと多くのPythonを理解する必要があります。

あなたがL.sort()を呼び出すときだけ概念的タイプ/クラスlistsort()方法は、実際にこの場合Lには、タイプ/クラスlistのオブジェクト/インスタンスを表すselfと呼ばれる慣習により、通常は引数を受け入れ、話します。 sortはスタンドアロンのsortedのように機能しますが、並べ替えロジックはL自己に適用されます。比較すると、sorted関数は、iterable(例えば、list)が機能するために必要な引数であることを必要とします。

コード例:

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) 
+0

おっと...私はそれをメソッドに変更します。私は自分の疑問をより明確にする必要があると思う。 – Tinkidinki

+2

私は、 'len(L)'は特殊なケースであることを指摘したいと思います。それは関数でも、基本的にはメソッド呼び出しの構文糖で、特に 'return L .__ len __()'のようなものです – Dleep

+0

@エミールはい。答えで言えば、私はそれがOPを圧倒するかもしれないと思います。だから私はこの問題について非常に高いレベルのコンセプトを提供しただけです。 – woozyking

0

メソッドと関数の違いは構文だけです。この例では

def foo(): 
    print "function!" 

class ExampleClass(object): 
    def foo(self): 
     print "method!" 

、iが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' 
>>> 

、Pythonはあなたが)(FOOをすれば、それはその名前で定義されたすべての機能がありますかどうかを確認しますので、あなたは、関数を呼び出すことを知っています。

foo()を呼び出すと、メソッドが呼び出されていることを知っているので、タイプaのオブジェクトに対して定義されたメソッドfooがあるかどうかをチェックし、存在する場合はそれを呼び出します。最後の例では、これをリストで試しています。リストにはfooメソッドが定義されていないため、エラーが表示されます。