天天看點

Python | 傳回函數 | partial&局部函數閉包題目答案講解

Python | 傳回函數 | yield & partial用法

  • 題目
    • 測試
  • 答案
    • partial()
    • 局部函數
  • 講解
    • partial()
    • 局部函數
    • 其他

在幫朋友解決一個問題的時候遇到了這個,恍惚間才發現自己不熟悉,mark下

題目

Python | 傳回函數 | partial&局部函數閉包題目答案講解

測試

測試代碼

assert favorite_subject(0)=="statistics"
assert favorite_subject(1)()=="statistics"
assert favorite_subject(5)()()()()()=="statistics"
           

答案

partial()

大材小用之

partial()

函數

from functools import partial

def favorite_subject(m):
	if m == 0:
		return 'statistics'
	else:
		return partial(favorite_subject, m-1)
           

局部函數

def favorite_subject(m):
	def _f(v=m-1):
		return favorite_subject(v)
	if m == 0:
		return 'statistics'
	else:
		return _f
           

講解

partial()

為什麼說

partial()

是大材小用呢。

partial()

主要是用于當機參數,這裡隻有一個參數

m

,用來做這題隻是附帶效果。

可以參考菜鳥教程和這篇部落格

functools.partial(func, *args, **keywords)

其中:

func

: 該對象所封裝的原始函數

args

: "當機"的位置參數清單

keywords

: "當機"的關鍵字參數

常見例子:

from functools import partial
 
def mod( n, m ):
  return n % m
 
mod_by_100 = partial( mod, 100 )
 
print mod( 100, 7 )  # 2
print mod_by_100( 7 )  # 2
           

有關鍵字參數:

可以不按照原函數的參數位置和個數

from functools import partial
 
bin2dec = partial( int, base=2 )
print bin2dec( '0b10001' )  # 17
print bin2dec( '10001' )  # 17
 
hex2dec = partial( int, base=16 )
print hex2dec( '0x67' )  # 103
print hex2dec( '67' )  # 103
           

局部函數

高階函數可以把函數作為結果值傳回,傳回的函數後需要加調用()才執行。

這篇部落格講閉包講的不錯:Python——傳回函數

其他

可能yield也能用吧,可以參考這篇:python中yield的用法詳解——最簡單,最清晰的解釋