Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/356.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python 发出一份「;“金字塔”;发电机(怠速)_Python_Function_Python 3.x - Fatal编程技术网

Python 发出一份「;“金字塔”;发电机(怠速)

Python 发出一份「;“金字塔”;发电机(怠速),python,function,python-3.x,Python,Function,Python 3.x,对于我的编程类,我必须创建一个创建“金字塔”(空闲)的程序,如下所示: 1 1 2 1 1 2 4 2 1 1 2 4 8 4 2 1 1 2 4 8 16 8 4 2 1 它将执行2**(行),其中row=0(最初)。它用于for循环中 如果n的值大于5,则会出现输出结果与预期不符的问题 这是我目前的代码: def pyramid(n): rows, num, x, numbe

对于我的编程类,我必须创建一个创建“金字塔”(空闲)的程序,如下所示:

              1 
            1 2 1 
          1 2 4 2 1 
        1 2 4 8 4 2 1 
      1 2 4 8 16 8 4 2 1 
它将执行
2**(行)
,其中
row=0
(最初)。它用于
for
循环中

如果
n
的值大于5,则会出现输出结果与预期不符的问题

这是我目前的代码:

def pyramid(n):
   rows, num, x, numbers, space_length, i_length = 0, '', 0, {}, 0, 0
   for rows in range(n):
      x = int(len(num) / 2)
      y = str(2**rows) + ' '
      num = num[0:x + 1] + y + num[x - 1 :]
      numbers[rows + 1] = num
   space_length = int(len(numbers[n]) / 2)
   for i in numbers:
      i_length = int(space_length - (len(numbers[i]) / 2))
      numbers[i] = (' ' * i_length) + numbers[i]
      print(numbers[i])

def main():    #I have to use the function of main() because my teacher requires it.
   n = int(input("Enter an integer greater than 0: "))
   if type(n) != int or n <= 0:
      raise TypeError("N must be an integer greater than 0.")
   pyramid(n)

main()

如果有人能帮我解决这个问题,那就太好了。谢谢

错误在于,您需要为每个循环清除字符串“num”,并为字符串注入清除错误的结束位置

并建议对字符串conact使用列表

a = [1, 2, 4, 2, 1]
s = ' '.join([str(x) for x in a])  

这就是你要找的吗

def pyramid(n):
   rows, num, x, numbers, space_length, i_length = 0, '', 0, {}, 0, 0
   for rows in range(n):
      x = int(len(num) / 2)
      y = str(2**rows) + '  '
      num = num[0:x + 2:] + y + num[x - 1:]
      numbers[rows + 1] = num
   space_length = int(len(numbers[n]) / 2)
   for i in numbers:
      i_length = int(space_length - (len(numbers[i]) / 2))
      numbers[i] = (' ' * i_length) + numbers[i]
      print(numbers[i])

def main():    #I have to use the function of main() because my teacher requires it.
   n = int(input("Enter an integer greater than 0: "))
   if type(n) != int or n <= 0:
      raise TypeError("N must be an integer greater than 0.")
   pyramid(n)

main()

下面显示的代码适用于我测试的n值(1到20)。注意,在Python2.7及更高版本中,
'{:{}}'
格式要求打印两个项目,第一个是要打印的值,第二个是要打印的字段宽度。(2.6可能需要字段号,例如
{0:{1}}
,我还没有测试过。)表达式
2**min(x,2*I-x)
用于生成像1 2 4 2 1和1 2 4 8 16 32 128 64 16 8 4 2 1这样的序列,它们先向上计数,然后再向下计数。数组f保存与表中最大数字对应的字段宽度,即底线中的数字
sum(f[:n-i])
是一行中打印的第一个数字之前的字段宽度之和。注意,
打印表单打印一个分隔的空格,不前进到新行。代码后面显示了一些示例输出

def pyramid(n):
    f = [1+len(str(2**min(i, 2*n-i-2))) for i in range(1+2*n)]
    for i in range(n):
        for x, w in zip(range(1+2*i), [sum(f[:n-i])]+f[n-i:]):
            print '{:{}}'.format(2**min(x, 2*i-x), w-1),
        print

pyramid(5)
pyramid(10)
for i in range(21):
    pyramid(i)
n=15的输出示例:

                                                     1
                                               1     2    1
                                          1    2     4    2    1
                                     1    2    4     8    4    2    1
                                1    2    4    8    16    8    4    2    1
                           1    2    4    8   16    32   16    8    4    2   1
                       1   2    4    8   16   32    64   32   16    8    4   2   1
                   1   2   4    8   16   32   64   128   64   32   16    8   4   2   1
               1   2   4   8   16   32   64  128   256  128   64   32   16   8   4   2  1
            1  2   4   8  16   32   64  128  256   512  256  128   64   32  16   8   4  2  1
         1  2  4   8  16  32   64  128  256  512  1024  512  256  128   64  32  16   8  4  2  1
      1  2  4  8  16  32  64  128  256  512 1024  2048 1024  512  256  128  64  32  16  8  4  2 1
    1 2  4  8 16  32  64 128  256  512 1024 2048  4096 2048 1024  512  256 128  64  32 16  8  4 2 1
  1 2 4  8 16 32  64 128 256  512 1024 2048 4096  8192 4096 2048 1024  512 256 128  64 32 16  8 4 2 1
1 2 4 8 16 32 64 128 256 512 1024 2048 4096 8192 16384 8192 4096 2048 1024 512 256 128 64 32 16 8 4 2 1
编辑:下面是一个稍长的程序版本,引入了中间变量和两个函数以提高可读性

def pyramid(n):
    def fieldsize(m):
        return 1+len(str(m))
    def numbers(m):
        return [2**min(j, 2*m-j) for j in range(1+2*m)]
    widths = [fieldsize(x) for x in numbers(n-1)]
    for i in range(n):
        wides = [sum(widths[:n-i])] + widths[n-i:]
        for v, w in zip(numbers(i), wides):
            print '{:{}}'.format(v, w-1),
        print

for i in range(21):
    pyramid(i)

不我的程序正确生成数字,但无法正确打印/组合数字。它应该是将这个数字(2**row-1)注入到前一个数字的中间,从而形成一个三角形。这在一定程度上固定了它。开头应该是
1 2 4 8
,不应该以
16 18 4 1 2 1
结尾,应该以
16 8 4 2 1
结尾。哎呀,我的意思是更新了我的答案。它仍然有一个错误:在最后几行,就在中间数字之后,它缺少每个数字的第一位。最后一行应该是
1 2 4 8 16 32 64 128 256 512 256 128 64 32 16 8 4 2 1
。。。相反,它是:
1 2 4 8 16 32 64 128 256 512 56 28 4 32 6 8 4 2 1
试试这个,所有数字都可以达到12,
num=num[0:x+(n/4+1):]+y+num[x-1:
谢谢!一个请求,你能编辑它使它更可读吗?我仍在学习Python,所以我不确定您正在做的每件事。。。抱歉,谢谢你,阿加尼还是不明白你在做什么。。。我对Python还是相当陌生,您的代码似乎缩短了(一行中有多个内容),这让我很难理解。而且你的变量不是很有描述性,所以我不知道它们的用途是什么。。。
                                                     1
                                               1     2    1
                                          1    2     4    2    1
                                     1    2    4     8    4    2    1
                                1    2    4    8    16    8    4    2    1
                           1    2    4    8   16    32   16    8    4    2   1
                       1   2    4    8   16   32    64   32   16    8    4   2   1
                   1   2   4    8   16   32   64   128   64   32   16    8   4   2   1
               1   2   4   8   16   32   64  128   256  128   64   32   16   8   4   2  1
            1  2   4   8  16   32   64  128  256   512  256  128   64   32  16   8   4  2  1
         1  2  4   8  16  32   64  128  256  512  1024  512  256  128   64  32  16   8  4  2  1
      1  2  4  8  16  32  64  128  256  512 1024  2048 1024  512  256  128  64  32  16  8  4  2 1
    1 2  4  8 16  32  64 128  256  512 1024 2048  4096 2048 1024  512  256 128  64  32 16  8  4 2 1
  1 2 4  8 16 32  64 128 256  512 1024 2048 4096  8192 4096 2048 1024  512 256 128  64 32 16  8 4 2 1
1 2 4 8 16 32 64 128 256 512 1024 2048 4096 8192 16384 8192 4096 2048 1024 512 256 128 64 32 16 8 4 2 1
def pyramid(n):
    def fieldsize(m):
        return 1+len(str(m))
    def numbers(m):
        return [2**min(j, 2*m-j) for j in range(1+2*m)]
    widths = [fieldsize(x) for x in numbers(n-1)]
    for i in range(n):
        wides = [sum(widths[:n-i])] + widths[n-i:]
        for v, w in zip(numbers(i), wides):
            print '{:{}}'.format(v, w-1),
        print

for i in range(21):
    pyramid(i)