【问题标题】:Trying to print two functions starting on the same line尝试从同一行开始打印两个函数
【发布时间】:2016-01-24 20:00:20
【问题描述】:

我正在尝试使用两个辅助函数和一个主函数打印钻石的上半部分。这是我的代码:

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

如何让这两个三角形打印在同一条线上,比如钻石的上半部分?

【问题讨论】:

  • 将两个循环合并为一个循环。计算左右字符串。然后将它们一起打印出来。很简单。
  • 我只是想补充一下@TomKarzes 所说的内容。请记住,您的循环实际上是不同的索引。所以你需要从 1 开始你的循环,并确保你的第一行只打印一次。
  • 它们有两个不同的范围,所以当我组合它们时,我如何保持这些差异?对不起,我对编程很陌生哈哈

标签: python image loops


【解决方案1】:

你可以使用异步:

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))

此代码仅适用于 Python 3.5 或更高版本

【讨论】:

  • 可以,但为什么需要?
  • 非常感谢,你们也很乐于助人,也很快!
【解决方案2】:

这可能是一个比您正在寻找的更复杂的答案 - 但您可以对您的代码进行非常简单的修改以使其与 python 生成器一起使用。

您这样做的方法是将每个函数变成一个生成器,该生成器返回您要打印的字符串(而不是直接调用 print)。然后,您更改 full_diamond 以迭代生成器。最后一项更改是您必须移动在top_right 中打印的额外空格。

这是最终代码:

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

同样,您可能会发现将两个循环连接到一个函数中会更简单。但是,我发现上面是一个非常 Pythonic 的解决方案,所以它可能对你有用。

【讨论】:

  • 非常感谢,你们也很乐于助人,也很快!
【解决方案3】:

不太确定您要实现什么目标,但这里有一个示例说明如何实现。我假设第一个 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)

full_diamond(17) 的输出:

        1
       212
      32123
     4321234
    543212345
   65432123456
  7654321234567
 876543212345678
98765432123456789

【讨论】:

  • 是的,这正是我想要做的!我不确定将其全部写入一个打印语句是否是最简单的方法。
  • 很高兴能提供帮助。您的代码中还有很多可以做的事情,以使其更清洁、更有效、更少重复和更 Python 化。我鼓励你继续尝试。
【解决方案4】:

您发现构建解决方案很困难,因为您分解它的方式与所需输出的结构不太匹配。

由于您的输出结构,我假设您永远不会使用 even 参数调用 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)

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2018-12-28
    • 1970-01-01
    • 1970-01-01
    • 2020-09-24
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多