Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/321.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 钻石巨蟒,精确到19行_Python - Fatal编程技术网

Python 钻石巨蟒,精确到19行

Python 钻石巨蟒,精确到19行,python,Python,可能重复: 我想做一个有19行的星号钻石。 我得到20英镑。 这就是我想要的: ******************** ********* ********* ******** ******** ******* ******* ****** ****** ***** ***** **** **** *** *** ** ** * *

可能重复:

我想做一个有19行的星号钻石。 我得到20英镑。 这就是我想要的:

********************
*********  *********
********    ********
*******      *******
******        ******
*****          *****
****            ****
***              ***
**                **
*                  *
**                **
***              ***
****            ****
*****          *****
******        ******
*******      *******
********    ********
*********  *********
********************
怎样才能消除星号中间的高度加倍。


干杯。

基本的想法是决定哪一个循环应该打印每边只有一个开始的行。然后修改另一个循环以不打印该行(即以双星行结束或开始)

改变

for x in range(1,11):

此外,您还可以去掉最后一行,因为第二个循环自己执行
x
的所有递增操作

为了可读性,我也会切换到一种循环

例如,您可以使用编写第一个循环(注意:此循环不会运行
x=1
案例,因此您必须使用第二个循环的未修改版本)


其基本思想是决定哪一个循环应该在每一面都有一个开始的情况下打印该行。然后修改另一个循环以不打印该行(即以双星行结束或开始)

改变

for x in range(1,11):

此外,您还可以去掉最后一行,因为第二个循环自己执行
x
的所有递增操作

为了可读性,我也会切换到一种循环

例如,您可以使用编写第一个循环(注意:此循环不会运行
x=1
案例,因此您必须使用第二个循环的未修改版本)


当您将代码加倍时,您可以将程序重写为

def line(x): print x* '*' + 2*(10-x)*' '+ x*'*'
i = 10
while i>0:
    line(i)
    i -=1
for x in range(1,11):
    line(x)
    # x +=1 # unnecessary - happens already due to the for loop
现在,您可以在两个循环中创建一个循环(再次删除该函数):


当您将代码加倍时,您可以将程序重写为

def line(x): print x* '*' + 2*(10-x)*' '+ x*'*'
i = 10
while i>0:
    line(i)
    i -=1
for x in range(1,11):
    line(x)
    # x +=1 # unnecessary - happens already due to the for loop
现在,您可以在两个循环中创建一个循环(再次删除该函数):


您已经学会了如何打印每一行。 现在,最后一部分是生成正确的编号序列以驱动行打印

l = range(10,1,-1)
l.extend(range(1,11))
for x in l:
  print x*'*' + 2*(10-x)*' ' + x*'*'


[10, 9, 8, 7, 6, 5, 4, 3, 2, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10]
********************
*********  *********
********    ********
*******      *******
******        ******
*****          *****
****            ****
***              ***
**                **
*                  *
**                **
***              ***
****            ****
*****          *****
******        ******
*******      *******
********    ********
*********  *********
********************

您已经学会了如何打印每一行。 现在,最后一部分是生成正确的编号序列以驱动行打印

l = range(10,1,-1)
l.extend(range(1,11))
for x in l:
  print x*'*' + 2*(10-x)*' ' + x*'*'


[10, 9, 8, 7, 6, 5, 4, 3, 2, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10]
********************
*********  *********
********    ********
*******      *******
******        ******
*****          *****
****            ****
***              ***
**                **
*                  *
**                **
***              ***
****            ****
*****          *****
******        ******
*******      *******
********    ********
*********  *********
********************

我很难找到窍门:

def diamond(ni):
    li = [ i*'*' + (2*(ni-i) - 1)*' ' + (i - i//ni)*'*'
           for i in xrange(ni,0,-1)]

    li.extend(i*'*' + (2*(ni-i) - 1)*' ' + (i - i//ni)*'*'
              for i in range(2,ni+1))

    return '\n'.join(li)


print diamond(7)
吸引

注意到

li.extend(i*'*' + (2*(ni-i) - 1)*' ' + (i - i//ni)*'*'
                  for i in range(2,ni+1))
是否与相同(少于一行)的

但反过来,我们可以简化:

def symetric_diamond(ni):
    li = [i*'*' + (2*(ni-i) - 1)*' ' + (i - i//ni)*'*'
          for i in xrange(ni,0,-1)]
    li.extend(li[-2::-1])
    return '\n'.join(li)
请注意 立即显示,因为程序计算字符串'\n'。在一次打印之前加入(str(i)for i in xrange(500)),而

for i in xrange(500):
    print str(i)
要显示的时间要长得多,因为计算机一个接一个地打印500个字符串,并且每次调用print都很长

还有另一种方式来打印钻石,我现在就写

加上 ->当nl为偶数时,所有这些函数给出了一个nl-1行的菱形

编辑 最后,我更喜欢的是:

def symetric_diamond(nl):
    '''Returns a diamond of nl lines if nl is odd, 
       and nl-1 lines if nl is even'''
    ni = (nl+1)//2
    li = [ (2*ni-1) * '*' ]
    li.extend(i*'*' + (2*(ni-i) - 1)*' ' +i*'*' for i in xrange(ni-1,0,-1))
    li += reversed(li[0:-1])  # in-place extension
    return '\n'.join(li)

由于就地扩展(带有extend和reversed)以及缺少可怕的
(i-i//ni)*'*'
我很难找到诀窍:

def diamond(ni):
    li = [ i*'*' + (2*(ni-i) - 1)*' ' + (i - i//ni)*'*'
           for i in xrange(ni,0,-1)]

    li.extend(i*'*' + (2*(ni-i) - 1)*' ' + (i - i//ni)*'*'
              for i in range(2,ni+1))

    return '\n'.join(li)


print diamond(7)
吸引

注意到

li.extend(i*'*' + (2*(ni-i) - 1)*' ' + (i - i//ni)*'*'
                  for i in range(2,ni+1))
是否与相同(少于一行)的

但反过来,我们可以简化:

def symetric_diamond(ni):
    li = [i*'*' + (2*(ni-i) - 1)*' ' + (i - i//ni)*'*'
          for i in xrange(ni,0,-1)]
    li.extend(li[-2::-1])
    return '\n'.join(li)
请注意 立即显示,因为程序计算字符串'\n'。在一次打印之前加入(str(i)for i in xrange(500)),而

for i in xrange(500):
    print str(i)
要显示的时间要长得多,因为计算机一个接一个地打印500个字符串,并且每次调用print都很长

还有另一种方式来打印钻石,我现在就写

加上 ->当nl为偶数时,所有这些函数给出了一个nl-1行的菱形

编辑 最后,我更喜欢的是:

def symetric_diamond(nl):
    '''Returns a diamond of nl lines if nl is odd, 
       and nl-1 lines if nl is even'''
    ni = (nl+1)//2
    li = [ (2*ni-1) * '*' ]
    li.extend(i*'*' + (2*(ni-i) - 1)*' ' +i*'*' for i in xrange(ni-1,0,-1))
    li += reversed(li[0:-1])  # in-place extension
    return '\n'.join(li)

由于原位扩展(带有扩展和反转)以及缺少可怕的
(i-i//ni)*'*'

这并没有产生他想要的钻石:在第一行和最后一行的中间仍然有两颗星。事实上,需要的是具有奇数个空格的空格。然而,我投了赞成票,因为这个好主意l.extend(范围(1,11))啊,好的地方——我误解了这个问题——这使得第一行和最后一行成为一个特例。这是我的解决方案,但它不是很好的l=range(9,1,-1)l.extend(range(1,10))print 19*''for x in l:print x''+(2*(10-x)-1'+x*''print 19'*'这段代码有重要的业务需求吗?“业务需求”是什么意思,求你了?这不是他想要的钻石:在第一行和最后一行的中间仍然有两颗星星。事实上,需要的是具有奇数个空格的空格。然而,我投了赞成票,因为这个好主意l.extend(范围(1,11))啊,好的地方——我误解了这个问题——这使得第一行和最后一行成为一个特例。这是我的解决方案,但它不是很好的l=range(9,1,-1)l.extend(range(1,10))print 19*''for x in l:print x''+(2*(10-x)-1)'+x*''print 19'*'这段代码有重要的业务需求吗?请问“业务需求”是什么意思?嘿,说英语的人:“身高加倍”是吗一个正确的表达方式?在《嘿,说英语的人》中提出了完全相同的问题的解决方案:“身高加倍”是一个正确的表达方式吗?在《你可以直接写
print'{0}{1}{0}中提出了完全相同的问题的解决方案。格式(“*”*((20-)),“*”
。不幸的是,这并没有提供OP想要的显示。我赞成
x+=reversed(x[:-1])
x[:-1]
而不是
x[-2::-1]
我使用你可以直接写
打印“{0}{1}{0}”。格式(“*”*((20-),“*”
。不幸的是,这并没有提供OP想要的显示。我赞成
x+=reversed(x[:-1])
x[:-1]
而不是我使用的
x[-2::-1]
def symetric_diamond(nl):
    '''Returns a diamond of nl lines if nl is odd, 
       and nl-1 lines if nl is even'''
    ni = (nl+1)//2
    li = [ (2*ni-1) * '*' ]
    li.extend(i*'*' + (2*(ni-i) - 1)*' ' +i*'*' for i in xrange(ni-1,0,-1))
    li += reversed(li[0:-1])  # in-place extension
    return '\n'.join(li)