2017-05-25 34 views

回答

3

在Python方法都是一流的對象,你可以寫這樣的事情:

my_close = myfile.close 
my_close() 

由於表達沒有被分配到一些變量

2 + 3 

簡單

myfile.close 

是有效的,太。

1

這是因爲myfile.close返回一個方法。

如果你這樣做print(myfile.close),你會得到這樣的輸出:

<built-in method close of file object at 0x7fb672e0f540> 
1

的Python文件對象有內置的方法close()處理文件對象。 在你的情況下,myfile.close將返回方法對象引用,但它沒有被調用。

這個例子將可能有助於明白這一點:

>>> def test(): 
...  print 'test print' 
... 
>>> a = test 
>>> print(a) 
<function test at 0x7f6ff1f6ab90> 
>>> 
1
myfile.close

是一個類文件對象的成員函數。你的代碼只是'提及'這個函數,但不會調用它(這就是文件沒有關閉的原因)。

這是一樣的這樣做:

a = 5 
a # OK but does nothing 

def test(): 
    return 256 
test # also not an error, but useless in this case 

現在,你可能會說,爲什麼還要允許這個如果是完全無用的?好吧,不是。例如,用這個函數可以將函數作爲參數傳遞給其他函數。

def MyMap(function, iterable): 
    for x in iterable: 
     yield function(x) 

print(list(MyMap(str, range(5)))) 
1

fp.close是文件對象的方法。

>>> fp.close 
<built-in method close of file object at 0xb749c1d8> 

fp.close()是方法調用使用()

>>> fp.close() 

您可以通過下面的演示更多的細節瞭解。

我們定義了test函數,我們是testtest()來看差異。

>>> def test(): 
... return 1 
... 

>>> test 
<function test at 0xb742bb54> 

>>> test() 
1 
0

因爲您不必爲表達式(編輯:或語句)的結果指定名稱,所以您的代碼不會引發錯誤。 Python允許這樣做,因爲它可能只是你需要表達式/語句的某種副作用而不是實際的返回值。

這不會對產生對象分配一個名稱前進一個迭代時,即只具有代碼中的一個線

next(myiter, None) 

屢見不鮮。

如果你想表達,沒有副作用像

1 + 1 

myfile.close 

拋出一個錯誤,如果沒有分配給結果名稱(因此表達是沒用的)的Python會必須檢查表達式的每個右手邊以尋找可能的副作用。與目前只允許這些表達式的行爲相比,這似乎是不必要的昂貴的(並且對於每個表達式來說也是非常複雜的,如果不是不可能的話)。

考慮Python是如何動態的。您可以在運行時覆蓋+運算符對某些類型所做的操作。

相關問題