我可以传递字典值/条目和键来运行

时间:2009-05-12 15:50:16

标签: python function dictionary

我正在编写一个函数,并打算使用字典键及其值作为参数。例如:

testDict={'x':2,'xS':4}

def newFunct(key,testDict['key']):
    newvalue=key+str(testDict['key'])
    return newValue

for key in testDict:
    newValue=newFunct(key,testDict[key])
    print newValue

我在输入分号后按下返回按钮时出现SyntaxError:无效语法。我猜这是告诉我,我不能以该形式传递字典值。据推测,我可以定义一个新变量

for key in testDict:
    xdixt=testDict[key]
    newValue=newFunct(key,xdixt)

使用xdixt

定义函数

但我希望有一些我不知道的伎俩。我用谷歌搜索并找到了解压缩字典的一些参考,但这似乎没有用。

这个Python的东西非常酷。我的问题是因为我试图使用存储在字典中的一些值来创建一个新目录。基于我从Stephan的回答中读到的材料,我想知道如何概括我学到的信息。我的目录名称有五个不同的部分,每个部分是处理myDict值的结果。创建目录名称的表达式变得过于复杂,在我看来太复杂,无法轻松阅读。所以我想知道我是否可以使用相同的方法将各个部分放入列表中,然后在创建目录名称时解压缩它们并且它有效!

def createDirectory(myKey,**myDict): 
   pathList=[]
   pathList.append(myDict['subKey1'])
   pathList.append(myDict['subKey2'].lstrip('0'))
   pathList.append(myDict['subKey3'])
   etc  
   myPath=os.path.join(*myList)
   os.makedirs(myPath)
   return(myPath)

4 个答案:

答案 0 :(得分:7)

这是你想要的吗?

def func(**kwargs):
    for key, value in kwargs.items():
        pass # Do something

func(**myDict) # Call func with the given dict as key/value parameters

(有关关键字参数的详情,请参阅documentationmyDict中的键必须是字符串。)


修改:您修改了问题以包含以下内容:

  

我认为myDict前面的**表示法指示函数期望字典并解包密钥(第一个*)和值,第二个*

这不正确。要了解发生的情况,您必须考虑以下事项:

  • 一个函数可以有多个形式参数(在这种情况下为ab):
def f1(a, b): pass
  • 我们可以将位置参数传递给这样的函数(就像大多数其他语言一样):
f1(2, 3)
  • 我们还可以传递关键字参数
f1(a=2, b=3)
  • 我们也可以混合使用,但位置参数必须首先
f1(2, b=3)
f1(a=2, 3)  # SyntaxError: non-keyword arg after keyword arg
  • 有一种方法可以让函数接受任意数量的位置参数,它可以作为元组访问(在这种情况下为args):
def f2(*args): assert isinstance(args, tuple)
  • 现在我们可以使用单独指定的参数调用f2,或使用类似于*args的符号的语法,使用其内容首先需要解压缩的列表:
f2(2, 3)
f2(*[2, 3])
  • 同样,可以接受任意数量的关键字参数:
def f3(**kwargs): pass
  • 请注意,f3 要求提供dict类型的单个参数。这是它所期望的那种调用:
f3(a=2, b=3)
f3(**{'a': 2, 'b': 3})
  • f3的所有参数必须命名为:
f3(2, 3)  # TypeError: f3() takes exactly 0 arguments (2 given)

把所有这些放在一起,并且记住位置论证必须先行,我们可能会:

>>> def f4(a, b, *args, **kwargs):
...     print('%r, %r' % (args, kwargs))
... 
>>> f4(2, 3)
(), {}
>>> f4(2, 3, 4, 5)
(4, 5), {}
>>> f4(2, 3, x=4, y=5)
(), {'y': 5, 'x': 4}
>>> f4(2, 3, 4, 5, x=6, y=7)
(4, 5), {'y': 7, 'x': 6}
>>> f4(2, *[3, 4, 5], **{'x': 6, 'y': 7})
(4, 5), {'y': 7, 'x': 6}

特别注意以下两个错误:

>>> f4(2)
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
TypeError: f4() takes at least 2 arguments (1 given)
>>> f4(2, 3, a=4)
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
TypeError: f4() got multiple values for keyword argument 'a'

第二个错误可以帮助您解释此行为:

>>> f4(**{'foo': 0, 'a': 2, 'b': 3, 'c': 4})
(), {'c': 4, 'foo': 0}

答案 1 :(得分:2)

不确定我们为什么要引进kwargs,这比这简单得多。你说你是Python的新手,我想你在这里只需要一些Python基础知识。

def newFunct(key,testDict['key']):

应该是:

def newFunct(key, val):

没有理由在第二个参数上使用任何特殊语法来表明它来自字典。它只是一个参数,您恰好将字典项中的值传递给它。

此外,一旦它在功能中,也没有理由以特殊的方式对待它。在这一点上,它只是一个价值。这意味着:

newvalue=key+str(testDict[key])

现在可以是:

newvalue=key+str(val)

所以当你这样称呼时(就像你一样):

newValue=newFunct(key,testDict[key])

testDict [key]解析为'key'处的值,该值在函数中变为“val”。


另一种方法,如果你认为它适合任何原因(这只是一件好事),你可以这样定义这个功能:

def newFunct(key, testDict):

同样,第二个参数只是一个参数,所以我们使用相同的语法,但现在我们期望它是一个dict,所以我们应该像它一样使用它:

newvalue=key+str(testDict[key])

(注意:在这种情况下不要在'key'周围加上引号。我们指的是名为'key'的变量,而不是名为'key'的键。当您调用该函数时,它看起来像这样:

newValue=newFunct(key,testDict)

与你从字典中传递一个变量的第一种情况不同,这次你将整个字典的引用传递给函数。

希望有所帮助。

答案 2 :(得分:0)

你为什么不这样做:

[k + str(v) for k, v in test_dict.iteritems()]

或py3k:

[k + str(v) for k, v in test_dict.items()]

修改

def f(k, v):
    print(k, v)      # or do something much more complicated

for k, v in testDict.items():
    f(k, v)

答案 3 :(得分:0)

从你的描述看来,testDict是关于函数的某种全局变量。如果是这种情况 - 为什么你甚至需要将它传递给函数?

而不是你的代码:

testDict={'x':2,'xS':4}

def newFunct(key,testDict[key]):
    newvalue=key+str(testDict[key])
    return newValue

for key in testDict:
    newValue=newFunct(key,testDict[key])
    print newValue

您可以简单地使用:

testDict={'x':2,'xS':4}

def newFunct(key):
    newvalue=key+str(testDict[key])
    return newValue

for key in testDict:
    newValue=newFunct(key)
    print newValue

如果testDict不是在全局范围内(这是有意义的......),我建议简单地为字典传递一个名称,而不是在这种情况下使用可变长度参数列表“搞乱”:

testDict={'x':2,'xS':4}

def newFunct(key,dictionary):
    newvalue=key+str(dictionary[key])
    return newValue

for key in testDict:
    newValue=newFunct(key,testDict)
    print newValue