簡體   English   中英

(Python 3.4)-分配了函數的變量如何以函數本身無法使用的方式使用?

[英](Python 3.4) - How come a variable, that has a function assigned to it, can be used in ways that the function itself cannot?

在開始之前,我只是不想澄清一下,我知道變量顯然使編程更容易。 這只是一個關於如何將foo()分配給var_bar的性質的問題,而不是原因。

例如,假設我有一個要讀取的文件,我將執行以下操作:

>>> r=open('Foobar.py')
>>> r.readline()
'Foo'
>>> r.readline()
'bar'
>>> r.readline()
'\n'

我曾經做過的但沒有用的是:

>>> open('Foobar.py').readline()
 'Foo'
>>> open('Foobar.py').readline()
 'Foo'

那時,我只是使用alt + p調出了上一行,順便說一下,我使用的是IDLE。

無論如何,類似地,如果我在itertools模塊中使用count(),則必須將函數count分配給變量,如下所示:

c = itertools.count(10,1)

>>> for i in range(0,50):
       next(c)
10
12
14
...

如果我只是執行以下操作:

for i in range(0,50):
    next(itertools.count(10,1))
10
10
10
10
...

為什么會這樣,當我(貌似)使用完全相同的代碼時,取決於該代碼的表示方式會有不同的輸出(當然,與幕后發生的事情不同,它不是同一代碼)。

我知道,如果list1 = list2,並且list2被修改,那么list1也被修改為別名,因為第二個不僅是第一個,而且是第一個(list2是list1返回True),所以我希望單獨使用變量c和l引用的表達式時,具有相同的行為。

非常感謝您的幫助,因為您肯定會知道,這對像我這樣的任何初學者都是一個巨大的障礙,因此無論如何,都可以很好地利用一些閱讀材料。

這里所使用的術語是“副作用”。

調用readline ,您將得到一個返回值和一個副作用。 返回值是正在讀取的文件所在的行。 副作用是光標移動到下一行。 副作用更改了文件對象,因此,每次調用readline ,都會得到一個新行。 計數器迭代器具有相同的概念。

如果不將文件保存到變量中,則副作用會消失,並且您基本上在第二次打開文件時會重新開始。 換句話說,即使您在操作系統上打開相同的文件,就python而言,您仍在處理兩個完全不同的文件對象 您對第一個所做的任何事情都與第二個無關。

分配了函數的變量如何以函數本身無法使用的方式使用?

open是一個功能。 open('Foobar.py')不是。 它是通過open返回而被調用的對象。

r=open('Foobar.py')使r r=open('Foobar.py')返回的對象。
r.readline()修改r指向的對象,因此它不會兩次返回同一行。

open('Foobar.py').readline() - open調用返回對象,您立即使用和修改它一次,獲得文件的第一行。 您不會在任何地方存儲對該對象的引用,因此它會被刪除。

快速說明:

使用此功能時:

c = itertools.count(10)
for i in range(10):
  print next(c)

您得到10,11,12,... 19

但是,當您這樣做時:

for i in range(10):
  print next(itertools.count(10))

您實際上是在這樣做:

for i in range(10):
  c = itertools.count(10)
  print next(c)

您需要了解的是稱為yield關鍵字的東西。

每當在代碼正文中找到關鍵字時,yield都會返回一個值。 讓我舉一個簡單的例子:

>>> def a():
yield 1
yield 2
yield 3
>>> b=a()
>>> next (b)
1
>>> next (b)
2
>>> next (b)
3
>>> next (b)
Traceback (most recent call last):
  File "<pyshell#41>", line 1, in <module>
    next (b)
StopIteration

在此,如果將函數a()分配給變量b,則還分配其返回的值。 變量保存即記錄值,就像在記事本上一樣。 如果使用變量執行相同的功能,則將保留該值;如果單獨使用該功能,則變量將丟失,並且函數將退出。

打個比方,如果記事本在記事本中將值存儲到記事本中,那么它可以在同一頁面上繼續這樣做,但是想象一下,每次使用新頁面時都必須計算並重寫所有值,您因此,需要將所有值存儲在同一頁面上。

count方法在python自己的教程的摘要中使用yield關鍵字:

def count(start=0, step=1):
# count(10) --> 10 11 12 13 14 ...
# count(2.5, 0.5) -> 2.5 3.0 3.5 ...
n = start
while True:
    yield n
    n+=step

參考: https : //docs.python.org/2/library/itertools.html#itertools.count

當達到yield時,將返回值,就像返回函數一樣,但是再次調用該函數時,指針從中斷處開始,而不是返回到代碼頂部,而是返回yield,然后如果有,請在yield之后執行其余代碼,然后重復執行。 但是,只有在可以將值分配給變量的情況下,這才是正確的。 順便說一句,不要將它與for循環混淆,如果只有一個yield語句,那么,如果沒有在循環中使用該函數,則該函數將繼續在其所處的位置(如示例一),直到代碼用盡',您可以說它耗盡了資源。

因此,希望能對您有所幫助:)

PS簽出e-satis的答案,當涉及到count()之類的函數(生成器)時,您需要了解一些內容才能理解(簽出鏈接):

Python中的“ yield”關鍵字有什么作用?

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM