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)