Python: Могу ли я вызвать функцию как часть списка * args в другой функции? - PullRequest
0 голосов
/ 22 ноября 2018

Я видел похожие вопросы к этому, но не идентичные, поэтому здесь я попробую.

У меня есть график, и я хочу, чтобы на графике были введены кривые пользовательского ввода (или любая функция),В настоящее время у меня есть:

if args:
    for arg in args:
        ax.plot( t, arg, color = 'r' )

Однако я получаю сообщение об ошибке, что итерации не могут быть вызваны.Проблема в том, что диапазон входов (t) должен быть определен внутри самой функции, поэтому я не могу сделать что-то вроде:

plotter( array, *[vonmises.pdf(t, 1), norm.pdf(t), some_other_curve(t)] )

, потому что он не знает, что такое «t», пока функцияназывается.Возможно, мой синтаксис неправильный.Честно говоря, я до сих пор не до конца понимаю * args и ** kwargs, но я не знаю, является ли мое отсутствие этого понимания проблемой здесь.Предпочтительно я хотел бы сделать что-то вроде этого:

plotter( array, *[vonmises.pdf, norm.pdf] )

, а затем, когда дело доходит до черчения, явно указать диапазон ввода.Halp?Полный код моей функции ниже:

import random
import math
import numpy as np
import matplotlib.pyplot as plt

color_list = [ 'b', 'g', 'r', 'c', 'y', 'm' ]

def histogram_and_curves( array, mean = 0.0, stdDev = 1.0, bins = None, xAxis = 'X', yAxis = 'Y', zAxis = 'Z', show = True, *curves ):

"""
Plots a histogram of a data array in 1 or 2 dimensions and an arbitrary number of PDFs for comparison.
"""

color = 'k'
bgcolor = 'w'
style = 'step'

fig = plt.figure( figsize = (6,6) )

if array.ndim is 1:

    ax = fig.add_subplot( 111, facecolor = bgcolor )

    if bins is None:
        bins = np.arange( math.floor( np.amin( array ) ), math.ceil( np.amax( array ) ), 0.01 )

    XMIN = mean - ( 4 * stdDev )
    XMAX = mean + ( 4 * stdDev )

    t = np.arange( XMIN , XMAX, 0.01)

    xlim = ax.set_xlim( XMIN, XMAX )
    ylim = ax.set_ylim( 0, 1 )

    xText = ax.set_xlabel( xAxis )
    yText = ax.set_ylabel( yAxis )

    # Plot the 1D histogram
    n, bins, patches = ax.hist( array, bins = bins, density = True, color = color, histtype = style )

    # Plot distribution curves
    if curves:
        for curve in curves:
            ax.plot( t, curve, color = random.choice( color_list ) )

    if show:
        plt.show()
    else:
        plt.close()

elif array.ndim is 2:
    raise ValueError( "I'll come back for you..." )

else:
    print( "Invalid dimensions. Required: 1 or 2. (Actual: {})".format( array.ndim ) )

return ax

1 Ответ

0 голосов
/ 22 ноября 2018

Вам не нужно идти в *args и **kwargs, чтобы достичь того, что вы хотите.Вы можете просто передать список функций:

import matplotlib.pyplot as plt
import numpy as np

def f1(x):
    return x

def f2(x):
    return x**2

def f3(x):
    return x**(1/2)

def plotter(f_list):
    x = np.linspace(0., 1.)

    plt.figure()

    for f in f_list:
        plt.plot(x, f(x))

plotter([f1, f2, f3])

Вывод:

enter image description here

Если вы хотите иметь необязательный аргумент,Вы можете сделать что-то вроде этого:

def plotter(f_list=None):

    ...

    if f_list:
         for f in f_list:
             ...
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...