2014-04-05 28 views
3

我是Python新手,但是我嘗試了一些東西,但對我來說卻是模棱兩可的。 爲什麼Python允許在循環中定義函數的def?以及我如何從中受益?爲什麼Python允許循環裏面的def函數

for i in range(2): 
    def f(): 
    print 'f' 

    f() 
+2

這是Python允許def的任何地方的副作用。如果您願意,可以將函數定義存儲在數組中。 – Max

回答

1

那麼因爲python是一種高級編程語言,你可以實際返回函數。以下是一個簡單但具有說明性的功能。

def multiplier(multiple): 
    def f(number): 
    return multiple * number 
    return f 

您可以使用該功能如下:

double = multiplier(2) 
print double(3) 

這將打印6.

同樣的概念也適用於循環,如果你想使多種功能,例如,並將它們存儲在列表或任何其他目的適合您的需求。現在

​​

你可以叫list_of_functions [0](),這將打印 'f' 和list_of_functions [1(),這將打印 'FF'。

+3

除了造成'NameError'之外,那裏還有那些'end's?此外,[請不要使用'l'作爲變量名稱](http://legacy.python.org/dev/peps/pep-0008/#prescriptive-naming-conventions)... –

+0

@HenryKeiter謝謝因爲注意到你的建議而不是l,我只是用它來表示一個列表 – Thresh

+1

l的問題在於它看起來很像1或I.對於「函數列表」,'lof'如何? – Emmet

1

您可以在任何地方定義功能!因爲Python以這種方式是動態的,所以您可以在運行時創建函數(以及類,以及其他任何東西)。很難想出一個簡單的例子,說明爲什麼你想要做到這一點,而不是看起來有些做作,但用例肯定存在。

假設你正在編寫一個簡單的處理框架。您將允許用戶鍵入命令,這將導致某些功能運行。您可以先定義這些函數,然後將它們全部存儲在字典中,以便在獲取用戶輸入時快速查找適當的函數以運行。

def define_functions(letters): 
    commands = {} # dictionary of commands 
    for letter in letters: 
     # Define functions dynamically 
     if letter == 'f': 
      def _function(): 
       print('foo') 
     elif letter == 'b': 
      def _function(): 
       print('bar') 
     elif letter == 'z': 
      def _function(): 
       print('baz') 
     else: 
      def _function(): 
       print('Unknown command') 

     # Add the new function to the dictionary with the key "n squared" 
     commands[letter] = _function 
    return commands 

commands = define_functions('abcdefghijklmnopqrstuvwxyz') 

# Now we have a dictionary of functions. 

while True: # loop forever 
    # Ask for input and run the specified function! 
    func_name = raw_input('Enter the one-letter name of the function to run: ') 
    if func_name not in commands: 
     print("sorry, that function isn't defined.") 
     break 

    # Look up the function 
    func = commands.get(func_name) 

    # Call the function 
    func()