Python循环处理多个语句

0 投票
2 回答
2389 浏览
提问于 2025-04-18 14:52

在Python中,简单的声明就像这样。

x = 1
y = 1
z = 1

这样做更简单...

x,y,z = [1] * 3

但是对于函数“语句”来说...

    import wx
    self.Bind(wx.EVT_MENU, self.exc11, id=exc11id)
    self.Bind(wx.EVT_MENU, self.exc15, id=exc15id)
    self.Bind(wx.EVT_MENU, self.exc37, id=exc37id)
    self.Bind(wx.EVT_MENU, self.exc55, id=exc55id)
    self.Bind(wx.EVT_MENU, self.exc88, id=exc88id)
    self.Bind(wx.EVT_MENU, self.exc99, id=exc99id)
    self.Bind(wx.EVT_MENU, self.rexc11, id=rexc11id)
    self.Bind(wx.EVT_MENU, self.rexc15, id=rexc15id)
    self.Bind(wx.EVT_MENU, self.rexc37, id=rexc37id)
    self.Bind(wx.EVT_MENU, self.rexc55, id=rexc55id)
    self.Bind(wx.EVT_MENU, self.rexc88, id=rexc88id)
    self.Bind(wx.EVT_MENU, self.rexc99, id=rexc99id)
    self.Bind(wx.EVT_MENU, self.excel11, id=excel11id)
    self.Bind(wx.EVT_MENU, self.excel15, id=excel15id)
    self.Bind(wx.EVT_MENU, self.excel37, id=excel37id)
    self.Bind(wx.EVT_MENU, self.excel55, id=excel55id)
    self.Bind(wx.EVT_MENU, self.excel88, id=excel88id)
    self.Bind(wx.EVT_MENU, self.excel99, id=excel99id)
    self.Bind(wx.EVT_MENU, self.calc, id=calcid)
    self.Bind(wx.EVT_MENU, self.edit, id=editid)
    self.Bind(wx.EVT_MENU, self.next, id=nextid)
    self.Bind(wx.EVT_MENU, self.prev, id=previd)

为什么我可以用循环来进行多次声明呢?比如说:

for x in "exc11 exc15 exc37 exc55 exc88 exc99".split():
    xid = x + "id"
    self.Bind(wx.EVT_MENU, self.x, id=x)
...

2 个回答

2

这个怎么样?

menus = [
    (self.exc11, exc11id),
    (self.exc15, exc15id),
    (self.exc37, exc37id),
    (self.exc55, exc55id),
    (self.exc88, exc88id),
    (self.exc99, exc99id),
    (self.rexc11, rexc11id),
    (self.rexc15, rexc15id),
    (self.rexc37, rexc37id),
    (self.rexc55, rexc55id),
    (self.rexc88, rexc88id),
    (self.rexc99, rexc99id),
    (self.excel11, excel11id),
    (self.excel15, excel15id),
    (self.excel37, excel37id),
    (self.excel55, excel55id),
    (self.excel88, excel88id),
    (self.excel99, excel99id),
    (self.calc, calcid),
    (self.edit, editid),
    (self.next, nextid),
    (self.prev, previd),
]

for handler, id_ in menus:
    self.Bind(wx.EVT_MENU, handler, id=id_)
3

ns = vars()
for x in "exc11 exc15 exc37 exc55 exc88 exc99".split():
    xid = x + "id"
    self.Bind(wx.EVT_MENU, getattr(self, x), id=ns[xid])

当变量名中包含数字时,通常说明你应该使用列表、元组或字典,而不是多个变量。如果变量的顺序很重要,就用列表或元组;如果顺序不重要,字典可能更合适。如果值的数量是可变的,就用列表;否则就用元组。

举个例子,假设你有这些变量:

exc11id exc15id exc37id exc55id exc88id exc99id

你可以用一个字典来代替:

excid = {'11': ..., '15': ..., }

同样的,假如你有很多属性,可以用一个属性 self.exc 来表示,这个属性是一个字典:

self.exc = {'11': ..., '15': ..., }

如果你做了这个改动,代码就可以简化为:

for x in "11 15 37 55 88 99".split():
    self.Bind(wx.EVT_MENU, self.exc[x], id=excid[x])

之所以

for x in "exc11 exc15 exc37 exc55 exc88 exc99".split():
    xid = x + "id"
    self.Bind(wx.EVT_MENU, self.x, id=x)

不工作,是因为 xxid 引用的值是 str(字符串)。当你写 self.x 时,Python 是在寻找一个名为 x 的属性,而不是一个名为变量 x 所引用的值的属性。相反,你需要使用 getattr(self, x) 这个函数调用。

同样,xid 只是一个字符串。要获取与该字符串值相同名称的变量的值,你需要在 vars()globals() 命名空间中查找这个值。

撰写回答