【问题标题】:How to pass a range of numbers through a function?如何通过函数传递一系列数字?
【发布时间】:2022-01-02 17:01:52
【问题描述】:

我知道以前有人问过类似的问题,但我是 python 的初学者,我不知道我做错了什么,因为它一直给我这个错误:unsupported operand type(s) for: 'int' and 'range'

我正在尝试传递几个 V 值(从 50 到 500000)以通过以下等式返回 E 的值:y[i+1] = 2 * y[i] - y[i-1] + (-2*(dx**2) * (E - V) * y[i])

这是我到目前为止所做的:

import numpy as np

dx = 0.001
xlim = 500000
y = np.arange(xlim+1)
V = range(50, 500000)

def func(E):
  for i in range(50, 500000):
    y[i+1] = 2 * y[i] - y[i-1] + (-2*(dx**2) * (E - V) * y[i])
  return y[i+1]
  
a = map(func, V)

print(list(a))

【问题讨论】:

  • V 是一个范围对象。你期待E - V 做什么?
  • E 应该在您的原始方程式中是什么? 您定义 Python 函数的方式,E 是来自 V 的值之一(我不认为这是你的意思),V 是整个范围(这是荒谬的)。

标签: python function numpy range equation


【解决方案1】:

在您的函数调用中,您有 (E - V),这导致了您的异常。

E 通过map() 调用设置为来自V 的一个(整数)值。 因此,您尝试在整数和range 之间进行减法运算。该错误是预期的。

如果您尝试在索引/列表之间进行一对一的关联,也许您可​​以更改:

(E - V)

到:

(E - list(V)[i])

这应该可以消除错误,但它的编码很差,性能也很差。但是,如果它与您尝试做的事情一致,希望它可以为您提供指导。如果是,您可以在开始时将范围转换为列表一次,然后在循环中使用该转换而不是 V

您可能还需要重新评估您的方程式以确保逻辑正确。

【讨论】:

  • 没有理由将 V 转换为列表。范围支持索引。
  • 感谢您的建议,我会重新评估我的方程式并再试一次
【解决方案2】:

看来您需要调试帮助。你说“它一直给我这个错误”,这意味着你不理解这个错误,你继续尝试同样的事情,或者类似的事情。这就像把你的头撞在墙上然后抱怨它一直很痛:)

您的功能 - 范围更小。在代码工作之前无需使用大范围:

In [525]: def func(E):
     ...:   for i in range(1,4):
     ...:     y[i+1] = 2 * y[i] - y[i-1] + (-2*(dx**2) * (E - V) * y[i])
     ...:   return y[i+1]
     ...: 
In [526]: dx=0.001
In [527]: y = np.arange(6)
In [528]: V = range(1,4)

让我们尝试仅使用 1 个数字的功能。在通过地图通过整个范围之前,这必须有效。

In [529]: func(1)
Traceback (most recent call last):
  File "<ipython-input-529-9ed089a72395>", line 1, in <module>
    func(1)
  File "<ipython-input-525-9fc020925ab9>", line 3, in func
    y[i+1] = 2 * y[i] - y[i-1] + (-2*(dx**2) * (E - V) * y[i])
TypeError: unsupported operand type(s) for -: 'int' and 'range'

这就是您不断遇到的错误。该错误与map(func, V)无关。

那么range 在您的函数中在哪里? Vrange,对吧?所以该函数正在尝试做:

In [530]: 1 - V
Traceback (most recent call last):
  File "<ipython-input-530-aa851a38238f>", line 1, in <module>
    1 - V
TypeError: unsupported operand type(s) for -: 'int' and 'range'

同样的错误。当您在长计算中遇到错误时,您需要隔离出现问题的步骤。您可以将计算拆分为多行,或者在这种情况下,请注意错误消息。

如果我们将范围扩展为完整列表会怎样:

In [531]: V = list(V)
In [532]: 1 - V
Traceback (most recent call last):
  File "<ipython-input-532-51e70f02e628>", line 1, in <module>
    1 - V
TypeError: unsupported operand type(s) for -: 'int' and 'list'

也没有为列表定义加法(期望list1+list2 连接)

numpy 数组定义逐元素加法:

In [533]: V = np.array(V)
In [534]: 1 - V
Out[534]: array([ 0, -1, -2])

但是当我们使用该数组 V 尝试您的函数时:

In [535]: func(1)
TypeError: only size-1 arrays can be converted to Python scalars

The above exception was the direct cause of the following exception:
Traceback (most recent call last):
  File "<ipython-input-535-9ed089a72395>", line 1, in <module>
    func(1)
  File "<ipython-input-525-9fc020925ab9>", line 3, in func
    y[i+1] = 2 * y[i] - y[i-1] + (-2*(dx**2) * (E - V) * y[i])
ValueError: setting an array element with a sequence.

E-V 是一个数字数组,如 [534] 所示。这意味着完整的计算也会产生一个数组。如果这不明显,那么您还没有阅读足够基本的numpy

但是y[i+1] 是一个号码的插槽。因此出现 ValueError。

此时我将退出,因为我不知道您要做什么,也不会尝试猜测。

【讨论】:

    猜你喜欢
    • 2017-07-23
    • 1970-01-01
    • 1970-01-01
    • 2018-04-02
    • 1970-01-01
    • 2012-08-14
    • 2022-07-07
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多