Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/304.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python 还有什么更像蟒蛇?就地更改或返回值_Python_Python 3.x - Fatal编程技术网

Python 还有什么更像蟒蛇?就地更改或返回值

Python 还有什么更像蟒蛇?就地更改或返回值,python,python-3.x,Python,Python 3.x,我有一个简短的问题 由返回的func初始化值是否更像python,如下所示: class Game: def __init__(self, AMOUNT_OF_PLAYERS = 2, AMOUNT_OF_CARDS = 7): self.draw_stack = create_draw_stack() self.play_stack = [self.draw_stack.pop()] def create_draw_stack(): VALU

我有一个简短的问题

由返回的func初始化值是否更像python,如下所示:

class Game:

    def __init__(self, AMOUNT_OF_PLAYERS = 2, AMOUNT_OF_CARDS = 7):
        self.draw_stack = create_draw_stack()
        self.play_stack = [self.draw_stack.pop()]

def create_draw_stack():
    VALUES = list(range(1, 10))
    COLORS = ["Red", "Blue", "Yellow", "Green"]
    return [Card(value, color) for value in VALUES for color in COLORS]
class Game:

    def __init__(self, AMOUNT_OF_PLAYERS = 2, AMOUNT_OF_CARDS = 7):
        self.draw_stack = []
        self.play_stack = []
        self.create_draw_stack()
        self.create_play_stack()

    def create_draw_stack(self):
        VALUES = list(range(1, 10))
        COLORS = ["Red", "Blue", "Yellow", "Green"]
        cards = [Card(value, color) for value in VALUES for color in COLORS]
        self.draw_stack = cards

    def create_play_stack(self):
        self.play_stack = [self.draw_stack.pop()]
还是应该看起来更像这样:

class Game:

    def __init__(self, AMOUNT_OF_PLAYERS = 2, AMOUNT_OF_CARDS = 7):
        self.draw_stack = create_draw_stack()
        self.play_stack = [self.draw_stack.pop()]

def create_draw_stack():
    VALUES = list(range(1, 10))
    COLORS = ["Red", "Blue", "Yellow", "Green"]
    return [Card(value, color) for value in VALUES for color in COLORS]
class Game:

    def __init__(self, AMOUNT_OF_PLAYERS = 2, AMOUNT_OF_CARDS = 7):
        self.draw_stack = []
        self.play_stack = []
        self.create_draw_stack()
        self.create_play_stack()

    def create_draw_stack(self):
        VALUES = list(range(1, 10))
        COLORS = ["Red", "Blue", "Yellow", "Green"]
        cards = [Card(value, color) for value in VALUES for color in COLORS]
        self.draw_stack = cards

    def create_play_stack(self):
        self.play_stack = [self.draw_stack.pop()]
我在网上找不到关于这个问题的任何信息。有没有经验法则可以直观地解决这样的问题

谢谢。

这并不是关于“pythonic”的问题,而是关于作文的问题(请注意,这是一个非常固执己见的问题)

关于你的代码。方法2的好处是:与
游戏相关的所有代码都“封装”到单个类中(至少,它位于同一个位置)。这使得以后的管理变得很容易-很容易找到创建/变异
游戏的所有东西

方法#1的好处是:您有更多的“纯”函数,可以在以后重复使用,并且它更容易单独测试。从理论上讲,可重用性是一件好事,但过度思考和进行预先成熟的优化是一个坏主意,尤其是在可读性方面


要将两者结合起来,您可以做一件事:保持“无状态”甲板创建,而不是改变对象状态,并在
\uuuu init\uuuuu
中调用它,但使您的
create\u draw\u堆栈成为类的一部分(即使其成为
@staticmethod
),以指示堆栈在类范围内的某个地方使用,以及[到目前为止]这是
游戏
逻辑的一部分。

用pythonic解决方案来说明Slam的答案:

class Game:

    VALUES = list(range(1, 10))
    COLORS = ["Red", "Blue", "Yellow", "Green"]

    @classmethod
    def create_draw_stack(cls):
        return  [Card(value, color) for value in cls.VALUES for color in cls.COLORS]       

    def __init__(self, players_count=2, cards_count=7):
        self.draw_stack = self.create_draw_stack()
        self.play_stack = [self.draw_stack.pop()]
你还问:

有没有经验法则可以直观地解决这样的问题

“直觉”部分主要是一个经验问题(“经验”与“花在做某事上的时间”不同——它还意味着阅读、实验、思考等)

wrt/“经验法则”:

  • 高内聚性:一个“单元”——不管是模块、类、方法还是函数——应该是关于一件事的,而且只有一件事(有时这个“一件事”可能相当广泛,但无论如何)
  • 位置:一起工作的东西应该放在一起(这样你就不必在编辑器中打开十几个文件来了解整个东西是如何工作的)
  • 低耦合:一个“单元”应直接依赖尽可能少的其他单元
  • 可读性:代码应该尽可能清晰易读(好的,这里有一些主观的部分)
  • 可测试性:代码应该易于隔离测试(参见“低耦合”)
  • 简单性:根据问题的复杂性,代码应该尽可能简单
  • 可用性:您的“单元”API应该设计为尽可能容易地用于客户端代码

认为功能范式比命令式或其他方式更像是pythonic是不和谐的,所以你说第二种方式是正确的?顺便说一句,我不这么认为。我在问哪个是对的:)两个都是对的。只需确保docstring反映函数正在执行的操作。嗯,第一个更好,因为你根本不需要看
create
方法就知道其他代码在做什么,但这纯粹是我的观点。FWIW:变量和参数使用全称不是pythonic。+1,有一件事是为了支持#1或者像@staticmethod一样使用它——类的状态不会在
\uuuu init\uuuuuu
之外发生变化——当您必须维护代码时,这非常好——“可变”类通常是一个问题,因为代码的发展是绝对正确的。我提到这一点(可能是含蓄的)是作为“更容易测试”的一部分。我坚信,一旦人们开始编写最基本的测试,变异方法就会成为er中非常明显的痛苦。。。项目。非常感谢:)!为什么将
pop()
更改为
pop(0)
?不管你从哪一边抽牌,
pop()
应该更快(虽然严格来说,如果牌堆的大小有限制,两者都是O(1))(好吧,事实上,这很重要,因为OP不会洗牌…@tobias_k我担心这只是一个打字错误(修复了,谢谢你发现它)。谢谢你,特别是为你列出的蟒蛇思维@MarcelB不客气——但请注意,实际上这里没有特定于python的东西——这些“规则”只适用于任何语言——它只是“pythonic”,因为python的哲学高度重视可读性和简单性,这意味着良好的设计和干净的实现。