V2EX = way to explore
V2EX 是一个关于分享和探索的地方
现在注册
已注册用户请  登录
推荐学习书目
Learn Python the Hard Way
Python Sites
PyPI - Python Package Index
http://diveintopython.org/toc/index.html
Pocoo
值得关注的项目
PyPy
Celery
Jinja2
Read the Docs
gevent
pyenv
virtualenv
Stackless Python
Beautiful Soup
结巴中文分词
Green Unicorn
Sentry
Shovel
Pyflakes
pytest
Python 编程
pep8 Checker
Styles
PEP 8
Google Python Style Guide
Code Style from The Hitchhiker's Guide
channingc
V2EX  ›  Python

如何写代码通过测试的程序?

  •  
  •   channingc · 2015-03-20 12:19:30 +08:00 · 3506 次点击
    这是一个创建于 3537 天前的主题,其中的信息可能已经有所发展或是发生改变。
    大家好,我刚刚开始学Python,请各位前辈帮帮忙,谢谢!!
    这是我的Python作业,要求写代码通过老师给的测试文件才算成功。我做了半天,写了下面的代码,但是仍然通过不了测试程序。所以向大家求救一下……

    这是题目:

    #文件名是dice.py
    """这是一个关于投掷骰子的程序,一个骰子有六面,每面有1-6其中一个数字, 但是也允许有nsides(n面)的骰子"""

    import random

    def roll(nsides=6):
    """投掷一个nsides的骰子,返回一个 1到nsides的整数."""
    nsides = int(nsides)
    r = random.randint(0, nsides)
    return r



    def rollpair(nsides=6):
    """投掷一对nsides的骰子. 返回一对骰子,要以tuple的形式返回, 像(3, 6)."""

    r1 = roll()
    r2 = roll()
    r = (r1, r2)
    return r



    def rolls(ntimes=10, nsides=6):
    """投掷一个nsides的骰子ntimes(n次). 返回一个list.

    >>> import random; random.seed('downtown')
    >>> rolls()
    [2, 5, 4, 5, 4, 1, 6, 6, 2, 2]
    """

    rlist = []
    for n in range(ntimes):
    rlist.append(roll())
    return rlist



    def rollpairs(ntimes=10, nsides=6):
    """投掷一对nsides的骰子ntimes. 返回一个list.

    >>> import random; random.seed('pythonistas')
    >>> rollpairs()
    [(2, 6), (6, 2), (6, 4), (5, 5), (6, 3), (2, 4), (1, 3), (3, 4), (5, 6), (4, 5)]
    """

    rplist = []
    for n in range(ntimes):
    rplist.append(rollpair())
    return rplist



    def dice_sum(pair):
    """"返回一对骰子的值的总和.

    >>> pair = (6, 1)
    >>> dice_sum(pair)
    7
    """

    x, y = int()
    pair [x, y]
    s = x + y
    return s



    if __name__ == '__main__':
    import doctest
    doctest.testmod()

    -----------------------------------------------------------------------------

    下面是要通过的测试文件:

    >>> from dice import roll, rollpair, rolls, rollpairs

    >>> import random
    >>> random.seed('pythonistas')

    >>> rolls(ntimes=6)
    [2, 6, 6, 2, 6, 4]

    >>> rolls(ntimes=6)
    [5, 5, 6, 3, 2, 4]

    Roll 600 times.

    >>> rolls(ntimes=600)
    [1, 3, 3, 4, 5, 6, 4, 5, 6, ..., 6, 1, 3, 2, 2]

    Roll a pair of dice 20 times.

    >>> rollpairs(20)
    [(4, 2), (3, 2), (4, 3), (4, 4), (2, 2), (3, 3), ..., (5, 3), (6, 1), (6, 1)]

    Roll a pair of 20-sided dice 10 times.

    >>> rollpairs(ntimes=10, nsides=20)
    [(12, 11), (8, 4), (18, 12), (20, 9), (2, 19), (4, 19), (16, 8), (16, 4), (20, 3), (7, 5)]

    >>> from dice import dice_sum

    >>> pair = (6, 4)
    >>> dice_sum(pair)
    10

    ----------------------------------------------------------------------------------------
    上面是我到目前为止写的roll, rollpair, rolls, rollpairs,sum这几个程序,但是通过不了测试,。我不明白那个随机数的顺序要怎样才和测试的程序一样。
    这是错误信息:
    File "tests/testA_dice.txt", line 9, in testA_dice.txt
    Failed example:
    rolls(ntimes=6)
    Expected:
    [2, 6, 6, 2, 6, 4]
    Got:
    [1, 5, 6, 5, 1, 5]

    -----------------------------------------------------------------------------------------
    还有sum里面的代码也有错误:
    >>> def dice_sum(pair):
    x, y = int()
    pair [x, y]
    s = int()
    s = x + y
    return s

    >>> pair = (6, 1)
    >>> dice_sum(pair)
    Traceback (most recent call last):
    File "<pyshell#108>", line 1, in <module>
    dice_sum(pair)
    File "<pyshell#106>", line 2, in dice_sum
    x, y = int()
    TypeError: 'int' object is not iterable

    请问各位前辈怎么改?? 还有4天就要交作业了,这只是五个作业中的第一个,这个通过不了,后面的就别提了。请帮帮小弟,万分感谢!
    22 条回复    2015-03-21 12:27:51 +08:00
    cheerzeng
        1
    cheerzeng  
       2015-03-20 14:08:58 +08:00
    这个测试要求有问题吧,既然是随机生成的骰子,怎么可能会有一样的结果。
    cheerzeng
        2
    cheerzeng  
       2015-03-20 14:13:22 +08:00
    x, y = int()
    TypeError: 'int' object is not iterable
    这个原因是,要分开实例化。
    cheerzeng
        3
    cheerzeng  
       2015-03-20 14:20:48 +08:00   ❤️ 1
    说错了,结果的问题应该是要利用那个种子
    channingc
        4
    channingc  
    OP
       2015-03-20 14:35:53 +08:00
    @cheerzeng 那个结果我知道为什么会这样了。 r = random.randint(1, nsides) 是因为那个随机数要从1开始。我改了之后结果就一样了
    channingc
        5
    channingc  
    OP
       2015-03-20 14:39:33 +08:00
    @cheerzeng 什么是分开实例化??
    cheerzeng
        6
    cheerzeng  
       2015-03-20 14:46:46 +08:00
    @channingc 我把你的这个从1开始了,好像也不行,哈哈。就是
    x=int()
    y = int()

    或者
    x,y = (int(), int())
    init
        7
    init  
       2015-03-20 16:13:08 +08:00
    现在大学开始教py了吗
    roychan
        8
    roychan  
       2015-03-20 16:22:12 +08:00
    @init 我们大一也在学 Python,交作业用 Git
    刚学三周,在写迷你型 PostScript 解释器了…
    init
        9
    init  
       2015-03-20 17:10:30 +08:00
    @roychan 你们学校应该不错吧 哪?
    roychan
        10
    roychan  
       2015-03-20 18:23:31 +08:00
    @init 其实只是个野鸡大学…ShanghaiTech
    liubiantao
        11
    liubiantao  
       2015-03-20 18:54:27 +08:00
    @roychan 首届啊,你们肩负着厚望,以后学弟学妹们可是要靠你们来吹牛逼的
    roychan
        12
    roychan  
       2015-03-20 19:39:24 +08:00
    @liubiantao 巨累…都不好意思给学弟学妹推荐了
    init
        13
    init  
       2015-03-20 20:35:49 +08:00
    @roychan 我们只开过 c c++ c# js java。。py lua什么的都没听过。。
    luw2007
        14
    luw2007  
       2015-03-20 21:49:32 +08:00   ❤️ 1
    随机数, 不能完全等于测试中的例子。
    也就看能不能成功运行这些方法。
    正确性, 只能是算出现的百分比是不是接近概率。
    roychan
        15
    roychan  
       2015-03-20 22:49:33 +08:00
    @init 我们现在的课对所有专业都是必修
    sennes
        16
    sennes  
       2015-03-20 23:43:13 +08:00   ❤️ 1
    我python学的不是很好哈。
    1.
    我试了一下跑你的rolls(ntimes=6)
    和你跑出来的结果并不一样,不知道是不是和环境有关?(系统、python版本)

    2.
    然后我看你roll()用的是random.randint。 我试着改了下
    roll()里用random.choice、random.randrange、random.randint 都试了下。
    [3, 4, 1, 1, 1, 4]
    [2, 2, 4, 2, 4, 3]
    [2, 2, 2, 6, 6, 6]
    结果都是不一样的。
    所以会不会和你第一个roll() 产生骰子的方式有关系?
    oott123
        17
    oott123  
       2015-03-21 08:11:06 +08:00 via Android   ❤️ 1
    random.seed('pythonistas')
    这才是重点,播种之后结果就一样了
    channingc
        18
    channingc  
    OP
       2015-03-21 11:20:05 +08:00
    @init 看选什么专业而已
    channingc
        19
    channingc  
    OP
       2015-03-21 11:23:15 +08:00
    @luw2007 原来是像oott123所说的,用了random.seed('pythonistas'),播种之后结果就一样了
    channingc
        20
    channingc  
    OP
       2015-03-21 11:28:47 +08:00
    @sennes 系统是win7 64位,Python版本是3.4.1。
    原来剩下的每个程序里面还要加上nsides,例如
    def rollpair(nsides=6):
    r1 = roll(nsides)
    r2 = roll(nsides)
    r = (r1, r2)
    return r
    vboar
        21
    vboar  
       2015-03-21 11:39:22 +08:00
    我们的概率论数理统计和Python结合在一起了...然后老师让我们自学= =
    channingc
        22
    channingc  
    OP
       2015-03-21 12:27:51 +08:00
    谢谢大家的指点,我已经完成了第一个文件,刚刚也完成了第二个文件,但是现在我卡在了第三个文件,不知道怎么改,请大家指点指点,谢谢……

    #文件1 dice.py
    """这是一个关于投掷骰子的程序,一个骰子有六面,每面有1-6其中一个数字, 但是也允许有nsides(n面)的骰子"""

    import random

    def roll(nsides=6):
    """投掷一个nsides的骰子,返回一个 1到nsides的整数."""

    r = random.randint(1, nsides)
    return r



    def rollpair(nsides=6):
    """投掷一对nsides的骰子. 返回一对骰子,要以tuple的形式返回, 像(3, 6)."""

    r1 = roll(nsides)
    r2 = roll(nsides)
    r = (r1, r2)
    return r



    def rolls(ntimes=10, nsides=6):
    """投掷一个nsides的骰子ntimes(n次). 返回一个list.

    >>> import random; random.seed('downtown')
    >>> rolls()
    [2, 5, 4, 5, 4, 1, 6, 6, 2, 2]
    """

    rlist = []
    for n in range(ntimes):
    rlist.append(roll(nsides))
    return rlist

    """ rolls = [random.randint(1,nsides) for i in range(ntimes)]
    print(rolls)
    """




    def rollpairs(ntimes=10, nsides=6):
    """投掷一对nsides的骰子ntimes. 返回一个list.

    >>> import random; random.seed('pythonistas')
    >>> rollpairs()
    [(2, 6), (6, 2), (6, 4), (5, 5), (6, 3), (2, 4), (1, 3), (3, 4), (5, 6), (4, 5)]
    """

    rplist = []
    for n in range(ntimes):
    rplist.append(rollpair(nsides))
    return rplist



    def dice_sum(pair):
    """"返回一对骰子的值的总和.

    >>> pair = (6, 1)
    >>> dice_sum(pair)
    7
    """

    return sum(pair)



    if __name__ == '__main__':
    import doctest
    doctest.testmod()

    --------------------------------------------------------------------------------

    测试文件: testA_dice..txt
    >>> from dice import roll, rollpair, rolls, rollpairs

    >>> import random
    >>> random.seed('pythonistas')

    >>> rolls(ntimes=6)
    [2, 6, 6, 2, 6, 4]

    >>> rolls(ntimes=6)
    [5, 5, 6, 3, 2, 4]

    Roll 600 times.

    >>> rolls(ntimes=600)
    [1, 3, 3, 4, 5, 6, 4, 5, 6, ..., 6, 1, 3, 2, 2]

    Roll a pair of dice 20 times.

    >>> rollpairs(20)
    [(4, 2), (3, 2), (4, 3), (4, 4), (2, 2), (3, 3), ..., (5, 3), (6, 1), (6, 1)]

    Roll a pair of 20-sided dice 10 times.

    >>> rollpairs(ntimes=10, nsides=20)
    [(12, 11), (8, 4), (18, 12), (20, 9), (2, 19), (4, 19), (16, 8), (16, 4), (20, 3), (7, 5)]

    >>> from dice import dice_sum

    >>> pair = (6, 4)
    >>> dice_sum(pair)
    10

    ------------------------------------------------------------------------------------------------

    文件2 predicates.py

    from dice import dice_sum

    def is_double(pair):
    """如果一对骰子的数字是一样返回True, 如果不是一样返回False
    >>> is_double((3, 3))
    True
    """

    if pair[0]==pair[1]:
    return True
    else:
    return False

    def is_double_six(pair):
    """如果一对骰子的数字是6就返回True, 如果不是一样6返回False """

    if pair[0]==pair[1]==6:
    return True
    else:
    return False


    def is_seven_eleven(pair):
    """如果一对骰子的数字加起来等于7或者等于11返回True, 如果不是返回False.

    >>> is_seven_eleven((6, 5)) and is_seven_eleven((3, 4))
    True
    """
    if dice_sum(pair)==7:
    return True
    elif dice_sum(pair)==11:
    return True
    else:
    return False




    def sum_is(pair, n):
    """如果一对筛子的数字加起来等于n返回True,不是返回 False.

    >>> sum_is((4,5), 9), sum_is((3, 2), 9)
    (True, False)
    """

    if dice_sum(pair)==n:
    return True
    else:
    return False




    def sum_is_at_least(pair, n):
    """如果一对筛子的数字加起来大于或等于n返回True,不是返回 False。

    >>> pair1, pair2 = (5, 3), (6, 3)
    >>> sum_is_at_least(pair1, 8) and sum_is_at_least(pair2, 8)
    True
    """

    if dice_sum(pair)>=n:
    return True
    else:
    return False


    def sum_is_at_most(pair, n):
    """如果一对筛子的数字加起来小于或等于n返回True,不是返回 False. """

    if dice_sum(pair)<=n:
    return True
    else:
    return False



    if __name__ == '__main__':
    import doctest
    doctest.testmod()
    -------------------------------------------------------------------------------------------

    测试文件: testB_predicates.txt

    >>> from dice import rolls, rollpairs
    >>> from predicates import is_double, is_double_six, is_seven_eleven

    >>> import random
    >>> random.seed('pythonistas')

    >>> rollpairs(20)
    [(2, 6), (6, 2), ..., (3, 5), (6, 3), (5, 3), (6, 3), (2, 6), (4, 2), (3, 6), (6, 5), (5, 4)]

    [(4, 2), (3, 2), (4, 3), (4, 4), (2, 2), (3, 3), ..., (5, 3), (6, 1), (6, 1)]

    Roll a pair of 20-sided dice 10 times.

    >>> rollpairs(ntimes=10, nsides=20)
    [(12, 15), (4, 15), (8, 10), (5, 12), (19, 11), (8, 9), (19, 3), (1, 17), (2, 3), (2, 4)]

    >>> pair = (5, 5)
    >>> is_double(pair)
    True

    >>> pair = (6, 5)
    >>> is_double(pair)
    False

    >> is_seven_or_eleven(pair)
    True

    --------------------------------------------------------------------------------------------

    文件3 simulations.py

    """模拟,仿真。掷骰子掷到某一个要求为止"""

    from dice import roll, rollpair, dice_sum
    from predicates import is_double, is_double_six, is_seven_eleven
    from predicates import sum_is, sum_is_at_least, sum_is_at_most

    def rolls_until(goal):
    """掷一对骰子直到遇到goal, 然后以list的形式返回每一对骰子的数字.

    >>> import random; random.seed('EV')
    >>> rolls_until(is_double_six)
    [(1, 2), (1, 2), (2, 6), (5, 6), (4, 4), (6, 1), (6, 2), (5, 2), (3, 1), (6, 6)]
    """
    rulist = list()
    while rollpair()!=goal:
    rulist.append(rollpair())
    rulist.append(rollpair())
    return rulist



    def how_many_rolls_until(goal):
    """"掷一对骰子直到遇到goal,然后返回一个数是计算在这个过程中掷了多少对骰子

    >>> import random; random.seed('EV')
    >>> how_many_rolls_until(is_double_six)
    10
    """





    if __name__ == '__main__':
    import doctest
    doctest.testmod()

    ----------------------------------------------------------------------------------

    测试文件3:testC_simulations.txt

    >>> from simulations import rolls_until
    >>> import predicates

    >>> import random
    >>> random.seed('pythonistas')

    >>> rolls_until(predicates.is_seven_eleven)
    [(2, 6), (6, 2), (6, 4), (5, 5), (6, 3), (2, 4), (1, 3), (3, 4)]


    >>> myrolls = rolls_until(predicates.is_double_six)
    >>> len(myrolls)
    63
    >>> myrolls
    [(5, 6), (4, 5), (6, 4), (3, 5), (6, 3), ..., (1, 2), (3, 3), (4, 4), (6, 6)]

    >>> myrolls = rolls_until(predicates.is_double)
    >>> len(myrolls)
    6
    >>> myrolls
    [(6, 3), (5, 3), (2, 1), (5, 4), (6, 2), (2, 2)]
    关于   ·   帮助文档   ·   博客   ·   API   ·   FAQ   ·   实用小工具   ·   1222 人在线   最高记录 6679   ·     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 · 24ms · UTC 17:46 · PVG 01:46 · LAX 09:46 · JFK 12:46
    Developed with CodeLauncher
    ♥ Do have faith in what you're doing.