-1

我正在尝试编写一个简单的程序来创建这样的方形网格

    + - - - - + - - - - +
    |         |         |
    |         |         |
    |         |         |
    |         |         |
    + - - - - + - - - - +
    |         |         |
    |         |         |
    |         |         |
    |         |         |
    + - - - - + - - - - +

我希望它接受一个输入 x,它定义了每行/列中有多少个单元格。脚本如下:

def repeat(x, f, *args): 
    for i in range(x): f(*args)

def topx(x):
    print x*top + '+'

def midx(x):
    print x*mid + '|'

def block(f,g,*args):
    f(*args)
    g(*args)

top = str('+ - - - - ')
mid = str('|         ')
x = 2
repeat(x,block,topx,repeat,x,4,midx,x)
topx()

尝试运行脚本时出现以下错误:

TypeError: topx() takes exactly 1 argument (4 given)

这与块函数中的参数有关,但无法弄清楚如何绕过它。

提前致谢。

编辑:

感谢您的指点,我将其稍微改写如下,并且效果很好。我还对其进行了更改,以允许您独立选择列数和行数。

def repeat(x, f, *args): 
    for i in range(x): f(*args)

def topx(x):
    print x*top + '+'

def midx(x):
    print x*mid + '|'

def row(x):
    topx(x)
    repeat(4,midx,x)

top = str('+ - - - - ')
mid = str('|         ')
x = 3 
y = 4 
repeat(y,row,x)
topx(x)
4

4 回答 4

2
def topx(x):
    print x*top + '+'

这需要一个论点:x. 但是当你调用它时:

def block(f,g,*args):
    f(*args) # This is what calls topx
    g(*args)  

您正在传递它*args,其中包含[x, 4, midx, x]. 这就是四个论点。

你可能应该重新考虑你的结构来解决这个问题。也许是一堂课?

于 2013-06-28T10:06:12.527 回答
0
def grid(x, space=4):
    for i in range(x):
        print ("+" + "-"*space)*x + "+"
        for j in range(space):
            print ("|" + " "*space)*x + "|"
    print ("+" + "-"*space)*x + "+"
于 2013-06-28T10:24:11.947 回答
0
def box(width, height, cell=1):

    print '+' + ('- ' * width + '+') * cell
    for x in range(cell):
        for x in range(height):
            print '|' + ('  ' * width + '|') * cell
        print '+' + ('- ' * width + '+') * cell
于 2013-06-28T13:19:29.120 回答
0

我认为这不是最好的方法。但是您的脚本可以很容易地更新为更具可读性和工作性。

cell_number = 2

top = str('+ - - - - ')
mid = str('|         ')

def repeat(cell_number, f, *args): 
    """
    repeat call of function `f` `call_number` times
    """
    for i in range(cell_number): 
        f(*args)

def topx(cell_number):
    """
    draw horizontal edge
    """
    print cell_number * top + '+'

def midx(cell_number):
    """
    draw middle part with vertical edges
    """
    print cell_number * mid + '|'

def block(cell_num):
    """
    draw one row of `cell_num` cells
    """
    topx(cell_num)
    repeat((len(top) - 1)/2, midx, cell_num)

repeat(cell_number, block, cell_number)
topx(cell_number)
于 2013-06-28T10:32:40.163 回答