Python3菱形图案定义

时间:2018-05-21 08:12:02

标签: python python-3.x

我写下我的代码如下,但是,我的老师说我必须返回模式。我用print()而且我不知道这个。请帮我。

def diamond(num):

    a = 1
    b = int((num - 1) / 2)
    c = num - 2
    d = 1
    for i in range(0, int((num - 1) / 2)):
        print( " " * b + a * "*")
        a += 2
        b -= 1
    if num % 2 == 1:
        print("*" * num)
        for i in range(0, int((num - 1) / 2)):
            print( " " * d + c * "*")
            c -= 2
            d += 1
    else:
        print("*" * (num - 1))
        print("*" * (num - 1))
        c = num - 3
        for i in range(0, int((num - 1) / 2)):
            print( " " * d + c * "*")
            c -= 2
            d += 1

1 个答案:

答案 0 :(得分:12)

故意不会为你编写代码,而是指导你如何自己解决问题。

目前,您的函数使用多个print()函数调用来向控制台写入行。您的老师希望您将这些行作为单个值返回给函数的调用者。

你必须克服两个问题:

  1. 您必须将您正在打印的所有行收集到一个字符串中才能返回。
  2. 您必须手动添加print()将添加的换行符。
  3. 最简单的方法是使用一个列表,附加要打印的每个字符串。

    • 在函数顶部放置一个新变量,指定一个空列表。像lines这样的名字可能是个好主意。
    • 将您正在打印的每一行添加到该列表中。列表类型有一个向其附加值的方法,您可以使用该方法轻松替换所有print()调用。
    • 在函数结束时,使用单个字符串方法将列表中的所有值连接成一个长字符串。您指定要放在值之间的字符串,如果使用'\n'字符串,则Python将使用换行符(\...是转义序列,\n生成换行符< / em> character)
    • 返回生成的单个字符串。

    您可以在Built-in Types documentation中找到所需的方法。

    您还可以在顶部使用字符串变量,然后将您现在打印的每个字符串连接到该变量,每次都添加换行符。但是有经验的程序员使用列表代替,因为计算机程序要处理的便宜。将字符串连接到另一个字符串需要计算机为结果创建一个全新的副本,因此它必须读取旧字符串的所有字符,连接字符串的所有字符,然后创建所有这些字符的副本放入一个新的字符串。然后对连接的下一个字符串执行相同操作,但现在结果仍然更长。你最终会制作这些初始角色的很多副本。

    另一方面,将值附加到列表不必复制,然后您只需创建列表中所有字符串中所有字符的副本创建输出。就algorithmic complexity而言,重复连接一个字符串需要O(n ** 2)次(对于 n 字符串,连接需要 quadradic 时间,再添加一个字符串并且时间加倍),而将相同的字符串附加到列表只需要O(n)时间(对于 n 字符串,再添加一个线性时间,再添加一个字符串和时间按比例增长。)

    对于六个字符串,差别并不明显,但是当你的程序必须处理数千行时,事情就会很快失控。在循环中连接一千个字符串可能比先将这些相同的字符串添加到列表中,然后将它们连接在一起所花费的时间要多一千倍。很快就会明白为什么程序员必须关心这些小细节。