在Python中的其他函数内调用函数
我试图编写一个简单的程序,创建一个方形网格,如下所示:在Python中的其他函数内调用函数,python,function,args,Python,Function,Args,我试图编写一个简单的程序,创建一个方形网格,如下所示: + - - - - + - - - - + | | | | | | | | | | | | + - - - - + - - - - + | | | | | | |
+ - - - - + - - - - +
| | |
| | |
| | |
| | |
+ - - - - + - - - - +
| | |
| | |
| | |
| | |
+ - - - - + - - - - +
我希望它接受一个输入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)
这与block函数中的参数有关,但无法找到绕过它的方法
提前谢谢
编辑:
谢谢你的指点,我稍微重写了一下,效果很好。我还修改了它,允许您独立选择列数和行数
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)
这需要一个参数:x
。但当你称之为:
def block(f,g,*args):
f(*args) # This is what calls topx
g(*args)
您正在传递它*args
,它包含[x,4,midx,x]
。这里有四个论点
您可能应该重新考虑您的结构以修复此问题。也许是上课?我认为这不是最好的方式。但是,您的脚本可以很容易地更新为更具可读性和工作性
def grid(x, space=4):
for i in range(x):
print ("+" + "-"*space)*x + "+"
for j in range(space):
print ("|" + " "*space)*x + "|"
print ("+" + "-"*space)*x + "+"
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)
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)
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