Python 尝试打印从同一行开始的两个函数
我试图打印一个菱形的上半部分,它有两个辅助函数和一个主函数。这是我的代码:Python 尝试打印从同一行开始的两个函数,python,image,loops,Python,Image,Loops,我试图打印一个菱形的上半部分,它有两个辅助函数和一个主函数。这是我的代码: def top_right(size): line = '' nsize = size // 2 + 1 spaces = nsize - 1 for num in range(1, nsize + 1): line += str(num) print(spaces * ' ' + line) def top_left(size): line =
def top_right(size):
line = ''
nsize = size // 2 + 1
spaces = nsize - 1
for num in range(1, nsize + 1):
line += str(num)
print(spaces * ' ' + line)
def top_left(size):
line = ''
nsize = size // 2 + 1
print()
for num in range(2, nsize + 1):
spaces = nsize - num
line += str(num)
print(spaces * ' ' + line[::-1])
def full_diamond(size):
top_left(size), top_right(size)
完整的菱形功能包括:
full_diamond(17)
2
32
432
5432
65432
765432
8765432
98765432
1
12
123
1234
12345
123456
1234567
12345678
123456789
如何使这两个三角形打印在同一条线上,如菱形的上半部分?您可以使用asyncio:
import asyncio
async def top_right(size):
line = ''
nsize = size//2+1
spaces = nsize-1
for num in range(1, nsize+1, 1):
line+=str(num)
print(spaces* ' '+line)
await asyncio.sleep(0.001)
async def top_left(size):
line = ''
nsize = size//2+1
print()
for num in range(2, nsize+1, 1):
spaces = nsize - num
line+=str(num)
print(spaces*' '+line[::-1], end='')
await asyncio.sleep(0.001)
def full_diamond(size):
loop = asyncio.get_event_loop()
tasks = [top_left(size), top_right(size)]
loop.run_until_complete(asyncio.wait(tasks))
此代码仅适用于Python3.5或更高版本这可能是一个比您想要的更复杂的答案-但您可以对代码进行非常简单的修改,使其适用于Python生成器 这样做的方法是将每个函数转换为一个生成器,返回要打印的字符串(而不是直接调用print)。然后,更改
full_diamond
以迭代生成器。最后一个变化是,您必须移动您在右上方打印的额外空格
以下是最终代码:
def top_right(size):
line = ''
nsize = size//2+1
spaces = nsize-1
for num in range(1, nsize+1, 1):
line+=str(num)
yield(line)
def top_left(size):
line = ''
nsize = size//2+1
for num in range(2, nsize+1, 1):
spaces = nsize - num
line+=str(num)
yield(spaces*' '+line[::-1])
def full_diamond(size):
for i, j in zip(top_left(size), top_right(size)):
print(i + j)
full_diamond(16)
以及输出:
21
3212
432123
54321234
6543212345
765432123456
87654321234567
9876543212345678
同样,您可能会发现在一个函数中将两个循环连接在一起更简单。然而,我发现上面的方法是一个非常好的解决方案,因此它可能对您有效。不太确定您想要实现什么,但下面是一个如何实现的示例。我想第一个1必须在v的顶端,对吗
def top_right(size):
line = ''
nsize = size // 2 + 1
spaces = nsize - 1
output = list()
for num in range(1, nsize + 1):
line += str(num)
output.append(line + '\n')
return output
def top_left(size):
line = ''
nsize = size // 2 + 1
output = [(nsize - 1) * ' ']
for num in range(2, nsize + 1):
spaces = nsize - num
line += str(num)
output.append(spaces * ' ' + line[::-1])
return output
def full_diamond(size):
for i, j in zip (top_left(size), top_right(size)):
print (i+j)
全菱形(17)
的输出:
您发现构建解决方案很困难,因为您以与所需输出的结构不匹配的方式对其进行了分解
我假设,由于输出的结构,您永远不会使用偶数参数调用full_diamond
,并且想知道为什么您不使用参数8
调用它来生成您想要的输出,而不是17
,并且一次生成完整的行,而不是两个半行
但是,如果两半解决方案是您真正想要的,并且最后一行的长度是您真正想要的参数,那么您确实有很多选择。最容易让人想到的是将半三角形生成为字符串列表,而不是在生成它们时打印出半行。然后,您可以运行一个循环,在同一行上打印出左半部和右半部
它看起来像这样:
def top_right(size):
line = ''
nsize = size // 2 + 1
out = [""]
line = ""
for num in range(nsize):
line = str(num+1) + line
out.append(line)
return out
def top_left(size):
line = ''
nsize = size // 2
out = []
line = ""
for num in range(nsize):
line += str(num+1)
out.append((nsize-len(line))*' ' + line)
return out
def full_diamond(size):
tl, tr = top_left(size), top_right(size)
for left, right in zip(tl, tr):
print(left+right)
full_diamond(17)
将两个循环合并为一个循环。计算左字符串和右字符串。然后把它们一起打印出来。简单。我只想补充一下@TomKarzes所说的。请记住,循环的索引实际上是不同的。所以你需要从1开始循环,确保第一行只打印一次。它们有两个不同的范围,所以当我组合它们时,如何保持这些差异?对不起,我对编程很陌生哈你可以,但是为什么你需要呢?非常感谢你们,你们帮了大忙,而且做得很快!非常感谢你们,你们是如此的乐于助人,而且做得很快!是的,这正是我想要做的!我不确定将所有内容都打印成一份报表是否是最简单的方法。很高兴能为您提供帮助。为了使代码更干净、更有效、更少重复和更具python风格,可以在代码中做更多的工作。我鼓励你继续尝试。
def top_right(size):
line = ''
nsize = size // 2 + 1
out = [""]
line = ""
for num in range(nsize):
line = str(num+1) + line
out.append(line)
return out
def top_left(size):
line = ''
nsize = size // 2
out = []
line = ""
for num in range(nsize):
line += str(num+1)
out.append((nsize-len(line))*' ' + line)
return out
def full_diamond(size):
tl, tr = top_left(size), top_right(size)
for left, right in zip(tl, tr):
print(left+right)
full_diamond(17)