PyN*_*bie 1 python dictionary function
我正在编写一个函数,并打算使用字典键及其值作为参数.例如:
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
Run Code Online (Sandbox Code Playgroud)
我在输入分号后点击返回按钮时出现SyntaxError:无效语法.我猜这是告诉我,我不能以该形式传递字典值.据推测,我可以定义一个新变量
for key in testDict:
xdixt=testDict[key]
newValue=newFunct(key,xdixt)
Run Code Online (Sandbox Code Playgroud)
并使用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)
Run Code Online (Sandbox Code Playgroud)
这是你想要的吗?
def func(**kwargs):
for key, value in kwargs.items():
pass # Do something
func(**myDict) # Call func with the given dict as key/value parameters
Run Code Online (Sandbox Code Playgroud)
(有关关键字参数的更多信息,请参阅文档.密钥myDict必须是字符串.)
编辑:您编辑了问题以包含以下内容:
我认为myDict前面的**表示法指示函数期望字典并解包密钥(第一个*)和值,第二个*
这是不正确的.要了解发生的情况,您必须考虑以下事项:
a和b在这种情况下):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}
Run Code Online (Sandbox Code Playgroud)
请特别注意以下两个错误:
>>> 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'
Run Code Online (Sandbox Code Playgroud)
第二个错误应该可以帮助您解释此行为:
>>> f4(**{'foo': 0, 'a': 2, 'b': 3, 'c': 4})
(), {'c': 4, 'foo': 0}
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
11134 次 |
| 最近记录: |