通常,我想要做的是製作一個涉及一些函數或函數的列表,但該函數的參數將根據「i 「for循環,所以當我定義列表時,參數沒有完全定義。 想象一下func(x),我想要一個像[func(x * i),func(x * i ** 2)]這樣的列表。這意味着,將會定義一些參數x,但我想通過for循環中的「i」(迭代器)對其進行修改。 具體而言,我想要做的是構建一個二維數組的特定模式(由列表表示),將圍繞陣列的對角線。但是,模式的值取決於我所在的數組的行。所以我跟蹤我們在哪一行,並將該「我」值用作函數中的一個參數。 問題是,當我定義列表時,它試圖評估函數,並崩潰,因爲我還沒有定義(它會被定義一旦我們通過for循環) 有沒有某種方式來延遲評估列表中的函數直到它進入for循環?Python:製作一個包含函數但尚未定義參數的列表
回答
我懷疑你的二維數組有更好的定義對角線的方法,比迭代遍歷行和計算這樣的函數更好。而是把重點放在「拖延」功能的評價,我會試試這個問題:
定義一個簡單的函數
In [438]: def func(x):
.....: return x**2
.....:
因爲解釋試圖評估x*i
此列表定義不起作用然後將它們傳遞給func
。它將使用它現有的x
和i
。
In [442]: [func(x*i),func(x*i**2)]
...
NameError: name 'x' is not defined
相反,我可以將每個函數調用包裝在另一個函數調用中。它可能是一個命名函數,或者我在這裏做一個未命名的lambda
。就像的func
的x*i
身體被延遲,直到拉姆達被稱爲:
In [443]: [lambda x,i:func(x*i), lambda x,i: func(x*i**2)]
Out[443]: [<function __main__.<lambda>>, <function __main__.<lambda>>]
In [444]: flist=_ # assign that list to a new name for later use
現在,我們可以定義一個x
和i
,然後在列表評估功能:
In [445]: x=np.arange(3)
In [446]: i=2
In [447]: [f(x,i) for f in flist]
Out[447]: [array([ 0, 4, 16]), array([ 0, 16, 64])]
,或者我們可以換在迭代結束i
:
In [449]: [[f(x,i) for f in flist] for i in range(3)]
Out[449]:
[[array([0, 0, 0]), array([0, 0, 0])],
[array([0, 1, 4]), array([0, 1, 4])],
[array([ 0, 4, 16]), array([ 0, 16, 64])]]
我甚至可以變成一個3d數組:
In [450]: np.array(_)
Out[450]:
array([[[ 0, 0, 0],
[ 0, 0, 0]],
[[ 0, 1, 4],
[ 0, 1, 4]],
[[ 0, 4, 16],
[ 0, 16, 64]]])
另一種方法是參數化包裝功能部件
In [451]: def func1(x,i,p=1):
.....: return func(x*i**p)
In [452]: [[func1(x,i,p) for p in [1,2]] for i in range(3)]
Out[452]:
[[array([0, 0, 0]), array([0, 0, 0])],
[array([0, 1, 4]), array([0, 1, 4])],
[array([ 0, 4, 16]), array([ 0, 16, 64])]]
functools
具有partial
功能,可以讓我指定的一些函數的參數,同時推遲全面評估:
部分(func,* args,**關鍵字) - 部分應用給定參數和關鍵字的新函數。
In [461]: from functools import partial
In [462]: flist=[partial(func1,p=1), partial(func1,p=2)]
In [463]: [[f(x,i) for f in flist] for i in range(3)]
Out[463]:
[[array([0, 0, 0]), array([0, 0, 0])],
[array([0, 1, 4]), array([0, 1, 4])],
[array([ 0, 4, 16]), array([ 0, 16, 64])]]
事實上,如果我調整func1
我可以分配既i
和p
與部分:
In [464]: def func1(x,i=0,p=1):
return func(x*i**p)
In [465]: flist=[partial(func1,p=1), partial(func1,p=2)]
In [466]: fflist=[[partial(f,i=i) for f in flist] for i in range(3)]
In [467]: fflist
Out[467]:
[[functools.partial(<function func1 at 0xb4d3e3d4>, i=0, p=1),
functools.partial(<function func1 at 0xb4d3e3d4>, i=0, p=2)],
[functools.partial(<function func1 at 0xb4d3e3d4>, i=1, p=1),
functools.partial(<function func1 at 0xb4d3e3d4>, i=1, p=2)],
[functools.partial(<function func1 at 0xb4d3e3d4>, i=2, p=1),
functools.partial(<function func1 at 0xb4d3e3d4>, i=2, p=2)]]
評估這仍然需要通過嵌套列表迭代:
In [471]: [[f(x) for f in ff] for ff in fflist]
Out[471]:
[[array([0, 0, 0]), array([0, 0, 0])],
[array([0, 1, 4]), array([0, 1, 4])],
[array([ 0, 4, 16]), array([ 0, 16, 64])]]
我可能創建了fflist
,只需致電partial
(對於每個「單元」):
fflist=[[partial(func1,i=i,p=p) for p in [1,2]] for i in range(3)]
這可能是可以通過使fflist
對象D型細胞陣列以簡化迭代,但是這是一個後一個問題。
還有其他包裝功能的方式供以後評估,但這些方法是最簡單和最明顯的。
我可以使用partial
與x
參數以及
In [478]: z=[[partial(f,x) for f in ff] for ff in fflist]
In [479]: z
Out[479]:
[[functools.partial(<function func1 at 0xb4d3e3d4>, array([0, 1, 2]), i=0, p=1),
functools.partial(<function func1 at 0xb4d3e3d4>, array([0, 1, 2]), i=0, p=2)],
....]]
In [480]: [[f() for f in ff] for ff in z]
定義循環內的列表:
for i in whatever:
l = [func(x * i), func(x * i**2)]
鑑於您所標記的這NumPy的,使用列表中的所有可能不是一個好主意,但我們真的不能告訴你應該是什麼從問題中回答問題。
我只是想到了,但問題是,列表(3確切)是函數的所有參數。該程序嘗試初始化參數時崩潰。 –
@MattF:你設計的這個功能不對,或者你試圖錯誤地使用它。你必須改變設計的某個方面才能完成這項工作。真的很難說出你在描述什麼,所以我不能說你需要改變哪一部分。 – user2357112
我正在創建一個對角線矩陣,其對角線是重複模式。因此,我遍歷列表以將適當的項目放置在適當的列中。很可能有一個NumPy函數可以創建這樣的對角矩陣,這就是我爲什麼標記它的原因。 我可以發佈代碼,如果這會有所幫助,但如果有一種Pythonic方式來延遲評估,因爲Mathematica會這樣做,那將是最簡單的 –
- 1. 參數'ContactsCtrl'不是一個函數,但未定義
- 2. 錯誤:[ng:areq]參數'xController'不是一個函數,但未定義
- 3. 錯誤:[ng:areq]參數'UserDataController'不是一個函數,但未定義
- 4. 未定義參數列表
- 5. 定義一個函數作爲參數
- 6. Python:創建一個列表,其中包含函數作爲參數提供列表中的元組
- 7. 函數的多個參數定義Python
- 8. 函數參數未定義
- 9. 函數參數未定義
- 10. 是否有一個包含Python中函數參數的字典?
- 11. 如何製作一個自包含的函數庫/函數庫
- 12. Python:尚未定義的變量在函數中調用 - 但工程?
- 13. 函數未定義Python的
- 14. Python:製作一個採用列表的遞歸函數,並返回一個包含前一個列表元素但不重複的列表?
- 15. lambdify sympy表達式,其中包含未定義的函數
- 16. PDFsharp Ximage不包含包含一個構造函數1參數
- 17. Python函數參數([x [,y [,z]]])含義
- 18. 如何確定作爲參數傳遞給另一個函數的函數的參數是否未定義
- 19. 未定義的參考(但nm表示函數存在)
- 20. Python參數未定義
- 21. Python sys.modules包含一個尚未導入的模塊
- 22. 函數作爲可選參數的Python函數定義
- 23. WPF泛型:如何定義一個對象列表作爲函數的參數
- 24. 添加一個包含帶參數的url的數據表列
- 25. 未定義Python pygame函數
- 26. Python函數未定義
- 27. 包含構造函數的數組未定義js
- 28. 參數「的ApplicationController」不是一個函數,得到了未定義
- 29. 帶有未定義參數的函數
- 30. 到包含一個python列表,列表
我明白你實際上回答了延遲評估的問題,而不是擔心我我正在試圖解決這個問題,以及如何避免使用這種方法來完成我的任務。在SE上,經常嘗試重寫代碼,而不回答被問到的問題。 –