作者kilfu0701 (享受人生快乐至上)
站内Python
标题Re: [问题] 宣告变数时,有办法先不给予名称吗?
时间Mon Mar 4 18:30:28 2013
※ 引述《volleyp (彼德さん)》之铭言:
: 这个问题我自己也感觉有点奇怪..
: 就是我希望产生物件时先不给予变数名,
: 而是在回圈内根据我设定的条件再来决定这个物件叫什麽。
: 因为我想练习写一只扑克牌游戏,所以我定义了一个类别
: class card:
: def __init__(self, suit, number)
: #花色
: self.suit = suit
: #点数
: self.number = number
: 接下来我需要17张牌(各花色JQKA+一张鬼牌)
: 所以总共宣告了17个card物件
: (JQKA分别用11, 12, 13, 14,花色用0, 1, 2, 3代替)
: SpadeJack = card(0, 11)
: SpadeQueen = card(0, 12)
: .
: .
: HeartKing = card(1, 13)
: .
: .
: ClubAce = card(3, 14)
: (鬼牌另外处理)
: 我想知道除了这样一个一个宣告外,有没有办法做到:
: for suit in range(4)
: for number in range(11-15)
: 宣告一个没有名称的card物件
: if suit == 0 :
: 物件名称加上Spade
: 物件的suit属性设定为0
: elif suit == 1
: 物件名称加上Heart
: 物件的suit属性设定为1
: .
: .
: if number == 11 :
: 物件名称再加上Jack
: 物件的number设定为11
: .
: .
: 接下来我就可以直接调用这些card物件来做成我的牌组
: 抱歉因为我刚开始学程式语言,如果有表达不清的地方还请多包涵
: 或是有其他更好的设计方式,还请不吝指教 谢谢!
上一篇有人提出另一种想法,我也是比较偏向那种处理方式 (离题)
如果要坚持原PO的方式,产生自定义的变数,
可以考虑用namedtuple看看。
以下为范例:
import collections
class card:
def __init__(self, suit, number):
self.suit = suit
self.number = number
param = []
dict = {}
for suit in range(4):
for number in range(11, 15):
key = ""
if suit==0:
key += "Spade"
elif suit==1:
key += "Heart"
elif suit==2:
key += "Diamond"
elif suit==3:
key += "Club"
if number==11:
key += "Jack"
elif number==12:
key += "Queen"
elif number==13:
key += "King"
param.append(key)
dict[key] = card(suit, number)
MyCard = collections.namedtuple('MyCard', param)
my_card = MyCard(**dict)
print len(my_card)
print my_card._fields
print my_card.SpadeJack.suit, my_card.SpadeJack.number
print my_card.SpadeQueen.suit, my_card.SpadeQueen.number
print my_card.Heart.suit, my_card.Heart.number
首先把需要的变数名称 产生出来,
然後顺便用一组dict把Card做初始化,
接着用一个namedtuple MyCard,把产生出来的dict值传进去
基本上应该可以做到原PO想要的方式。
(PS:不确定这是不是一个好的方法就是了 XD)
--
※ 发信站: 批踢踢实业坊(ptt.cc)
◆ From: 1.34.163.177
1F:推 volleyp:我的意思差不多就是k大你说的这样(虽然後面MyCard(**dict) 03/04 19:30
2F:→ volleyp:那边看不是很懂XD)然後跟上面u大的做法比起来,这个想法就 03/04 19:31
3F:→ volleyp:很饶舌的感觉= =" 03/04 19:35