将变量传入和传出函数

时间:2017-09-03 21:55:48

标签: python function global-variables local-variables

我写了一个小程序来执行以下操作:

  • 检查图像
  • 从图片中随机选择一行
  • 绘制该行的像素值
  • 在该行中制作list本地最小值

我想把它变成一个函数,所以我做了同样的事情,比方说10行,这样我就可以绘制所有这些行的像素值,而不必运行程序10次。
代码如下所示:

from astropy.io import fits
import matplotlib.pyplot as plt
import numpy as np

hdulist = fits.open('xbulge-w1.fits')   #   Open FITS file as image
w1data = hdulist[0].data

height = w1data.shape[0]    #   Inspect height of image
width = w1data.shape[1]

def plot_envelope(image, image_height):
    index = np.random.randint(0, height/2)  #   Select random number in upper half
    row = w1data[index]   #   Look at row number

    local_minima = []

    #   Find local minimum, and add to list of minimum-valued pixels
    for i in range(1, width-1):
        if w1data[index][i-1] > w1data[index][i]:
            if w1data[index][i+1] > w1data[index][i]:
                local_minima.append(w1data[index][i])
        else:
            continue
    return (local_minima, row, index)

plot_envelope(w1data, height)

x1 = range(width)
plt.plot(x1, row, color = 'r', linewidth = 0.5)
plt.title('Local envelope for row ' + str(index))
plt.xlabel('Position')
plt.ylabel('Pixel value')
plt.show()

如果我不使用函数定义(例如indexrowlocal_minima以及嵌套for循环的声明是该计划的main部分。使用如图所示的函数定义,它会返回NameError: name 'local_minima' is not defined错误 由于我将这些变量传递出函数,我不应该在程序的其余部分使用它们吗? 我错过了关于局部变量和全局变量的内容吗?

1 个答案:

答案 0 :(得分:0)

当你致电plot_envelope(w1data, height)时,你告诉函数将w1data和height分配给image和image_heigth。在函数内部,您应该使用w1data虚拟变量操作image(更改函数内图像的w1data),该范围仅在函数内部。接下来你应该在变量中得到函数的结果(return):envelope = plot_envelope(w1data, height)然后是local_minima = envelope[0], row = envelope[1], index = envelope[2]