【问题标题】:dynamic array of parameters to function python函数python的动态参数数组
【发布时间】:2014-01-16 13:33:57
【问题描述】:

我在python中有以下函数:

def extractParam(word, varName, stringToReplace):
   if word.startswith(stringToReplace):
      varName=int (word.replace(stringToReplace, ''))
   return varName    

def getMParams(line):
  l = r = b = t = 0
  sline = line.strip().split()
  for i in range(len(sline)):
    l = extractParam(sline[i], l, "l=")     
    r = extractParam(sline[i], r, "r=")       
    b = extractParam(sline[i], b, "b=")     
    t = extractParam(sline[i], t, "t=")   
  return l, r, b, t

def getIterParams (line):
  width = height = stride = x = y = 0
  sline = line.strip().split()
  for i in range(len(sline)):
     width  = extractParam(sline[i], width, "width=")     
     height = extractParam(sline[i], height,"height=")       
     stride = extractParam(sline[i], stride,"stride=")     
     x      = extractParam(sline[i], x,     "x=")   
     y      = extractParam(sline[i], y,     "y=")     
  return width, height , stride, x,  y 

函数 getMparams 和 getIterParams 是完全一样的,我的问题是是否有办法创建一个函数来替换它们,我在想这样的事情:

def func (line, params)
    //params is an array of parameters (i.e [l,r,b,t] or [width,height,stride,x,y])
    //init all params
    sline = line.strip().split()
    for i in range(len(sline)):
      //for everyParam:
        param = extractParam(sline[i],param,"param=")

有可能吗?还是有其他方法?

【问题讨论】:

  • def func(line, *params)

标签: python


【解决方案1】:

首先,一些风格要点:

  • 您在extractParam 中处理varName 的方式既丑陋又令人困惑。我花了一段时间才弄清楚您要做什么(即,考虑到extractParam 可能找不到任何数据的事实)。目前,最好直接处理,而不是尝试调用函数。

  • range(len( 你正在做的事情has to stop

  • 你不需要stripsplit之前的行 - 任何前导和尾随空格都会在拆分操作期间消失。结果中不会出现任何额外的空字符串。

  • sline 这个名字实在是太丑了。您已将line 拆分为单词;为什么不将这些词称为words? (无论如何,不​​要使用缩写和混乱的东西。否则你会得到像sline 这样实际上不是单词的东西。)

  • 在 Python 中,我们不将 namesLikeThis 用于函数(或其他任何东西;尽管我们确实使用 NamesLikeThis,开头大写字母,用于类)。我们使用names_like_this

此外,您似乎在反复尝试替换

也就是说,您提出的方法很好。请注意,由于我们不提前知道将提取多少项目,因此我们不能将每个项目都放入一个单独的变量中。但是我们可以通过返回dict 轻松解决这个问题。

我的方法如下:我遍历names,并为每次尝试在line中找到相应的单词。找到一个后,我将默认的value替换为0,并在完成此检查后,将相应的键值对插入返回的result中。我还采取了一种更简单的方法来切割等号周围的单词。

def extract_params(line, names):
    words = line.split()
    result = {}
    for name in names:
        value = 0
        for word in words:
            maybe_name, equals, maybe_value = word.partition('=')
            if maybe_name == name and equals == '=':
                value = maybe_value
        result[name] = value
    return result

这可能会得到相当大的改进,但很大程度上取决于您的具体规格。我试图创造一些尽可能接近你的基本逻辑的东西。

【讨论】:

  • 谢谢你,它工作得很好,我是 python 新手,所以我会仔细看看你的 cmets,这对我有很大帮助
猜你喜欢
  • 2011-11-12
  • 2015-09-01
  • 1970-01-01
  • 1970-01-01
  • 2017-06-15
  • 1970-01-01
  • 2012-03-22
  • 1970-01-01
  • 2013-12-23
相关资源
最近更新 更多