创建未知数量的以编程方式定义的变量

时间:2018-01-21 23:25:55

标签: python variables recursion sympy

我有一个递归函数,可以生成一个难以知道的表达式,每个表达式需要一个新变量乘以它。稍后将通过涉及积分或残差的计算去除这些变量。

如何开发这些未知数量的变量?也许已编入索引?我在互联网上看到的所有例子都是使用具有确定大小的先验已知对象,例如"项目"在How can you dynamically create variables via a while loop?Accessing the index in Python 'for' loops

我想我可以将它归结为这个简单的例子,用于我的真实剧本:

import sympy as s
p0,p1,p2,p3,p4=s.symbols('p0 p1 p2 p3 p4')
l = [p0, p1, p2, p3, p4]

def f(n):
    if n == 0:
        return l[n]
    elif n == 1: 
        return l[n]
    else:
        return f(n-1)*l[n]+f(n-2)

f(3) # works
f(6) # doesnt' work - need to define ahead of time the 
     # dummy variables l[6], l[5], .... 
     # even if they are just symbols for (much) later numerical evaluation.

我需要以上片段来提前生成所需的未知数。

我看到一些大熊猫的提及,但是找不到我需要的好榜样,甚至不确定这是不是最好的路线。还看到类似的事情," ......未知数量的行[文件] ...",或者#34; ...未知数量的参数......",但那些似乎不适用。

1 个答案:

答案 0 :(得分:2)

Indexed objects表示一个抽象的东西,索引取任何值,对索引的大小没有限制。

import sympy as s
p = s.IndexedBase("p")

def f(n):
    if n == 0 or n == 1:
        return p[n]
    else:
        return f(n-1)*p[n] + f(n-2)

print(f(7))

输出

(p[0] + p[1]*p[2])*p[3] + (((p[0] + p[1]*p[2])*p[3] + p[1])*p[4] + p[0] + p[1]*p[2])*p[5] + (((p[0] + p[1]*p[2])*p[3] + p[1])*p[4] + ((p[0] + p[1]*p[2])*p[3] + (((p[0] + p[1]*p[2])*p[3] + p[1])*p[4] + p[0] + p[1]*p[2])*p[5] + p[1])*p[6] + p[0] + p[1]*p[2])*p[7] + p[1]

除此之外,使用p0,p1,p2,p3,p4=s.symbols('p0 p1 p2 p3 p4')或甚至

可以更轻松地完成syms = s.symbols('p0:5')之类的操作
n = ...
syms = s.symbols('p0:{}'.format(n))

这会创建单个符号,而不是索引对象,因此在创建时必须知道数字n。但仍然比列出p0 p1等更容易。