ooxx7788 发表于 2017-6-9 18:44:23

Python: 每日一题 62

本帖最后由 ooxx7788 于 2017-6-9 23:44 编辑



写出这个diamond函数吧!如果是偶数和负数则返回None。参数n为中间最长的*的数量。

很多朋友都喜欢直接看答案,但说真的,看10题的答案,也不如你写一题的作用大。

**** Hidden Message *****

jerryxjr1220 发表于 2017-6-9 20:21:49

本帖最后由 jerryxjr1220 于 2017-6-9 20:28 编辑

def diamond(n):
    if not n%2: return None
    blank = (n-1)//2
    s = ''
    for i in range(1, n+1, 2):
      s += ' '*blank+'*'*i+'\n'
      blank -= 1
    blank = 1
    for i in range(n-2, 0, -2):
      s += ' '*blank+'*'*i+'\n'
      blank += 1
    return s

       *
      ***
   *****
    *******
   *********
***********
`*************
***************
`*************
***********
   *********
    *******
   *****
      ***
       *

SixPy 发表于 2017-6-9 20:48:52

本帖最后由 SixPy 于 2017-6-9 20:53 编辑

>>> def diamond(n):
        if n<0 or ~n&1: return
        ls=[('%%%ds'%(n//2-i//2+i))%('*'*i)for i in range(1,n+1,2)]
        ls+=ls[-2::-1]
        return '\n'.join(ls)

>>> print(diamond(15))
       *
      ***
   *****
    *******
   *********
***********
_*************
***************
_*************
***********
   *********
    *******
   *****
      ***
       *
>>> print(diamond(16))
None
>>> print(diamond(-17))
None

ooxx7788 发表于 2017-6-9 22:13:23

SixPy 发表于 2017-6-9 20:48


if n<0 or ~n&1: return

你就等着给人问这一句什么意思吧!

SixPy 发表于 2017-6-9 22:36:07

ooxx7788 发表于 2017-6-9 22:13
你就等着给人问这一句什么意思吧!

如果是偶数和负数则返回None。
不就是题目设定的条件嘛~

冬雪雪冬 发表于 2017-6-9 22:38:36

def diamond(num):
    if num % 2 == 0 or num < 0:
      return
    string = ''
    for i in range(1, num + 1, 2):
      string += ('*' * i).center(num) + '\n'
    for i in range(num - 2, 0, -2):
      string += ('*' * i).center(num) + '\n'
    return string

num % 2 == 0写成~num&1,运算速度会快些。

可乐爱宅着 发表于 2017-6-9 23:34:02

做出来了,不过不是太精简。
def diamond(n):
    if(n%2 == 0 or n<0):
      print "输入错误"
      return None
    lis = list(filter(lambda x:x%2!=0,range(1,n+1)))
    sp = 30
    for i in lis:
       print(" "*sp,end="")
       print("*"*i)
       sp -= 1
    lis.pop()
    sp += 2   
    for i in reversed(lis):
      print(" "*sp,end="")
      print("*"*i)
      sp += 1
n = int(input("请输入要多少行*:"))
diamond(n)

ooxx7788 发表于 2017-6-9 23:36:10

本帖最后由 ooxx7788 于 2017-6-9 23:37 编辑

可乐爱宅着 发表于 2017-6-9 23:34
做出来了,不过不是太精简。

sp=30是什么意思啊。哦知道了,你这个不是输出在边上的。

可乐爱宅着 发表于 2017-6-9 23:37:29

ooxx7788 发表于 2017-6-9 23:36
sp=30是什么意思啊。哦知道了,你这个不是输出在边上的。

空格。

ooxx7788 发表于 2017-6-9 23:42:21

jerryxjr1220 发表于 2017-6-9 20:21


为什么我看你的输出,第7,第9多了两个`

SixPy 发表于 2017-6-10 01:01:27

本帖最后由 SixPy 于 2017-6-10 01:11 编辑

用format的居中格式,更简单
def diamond(n):
    if n<0 or ~n&1: return
    ls=[('{: ^%d}'%n).format('*'*i)for i in range(1,n+1,2)]
    return '\n'.join(ls+ls[-2::-1])

SixPy 发表于 2017-6-10 01:12:48

str自带 center 方法,何必舍近求远~
def diamond(n):
    if n<0 or ~n&1: return
    ls=[('*'*i).center(n)for i in range(1,n+1,2)]
    return '\n'.join(ls+ls[-2::-1])

新手·ing 发表于 2017-6-10 08:43:07

{:10_245:}

新手·ing 发表于 2017-6-10 09:49:20

def diamond(n):
    b = 1
    if n % 2 == 0 or n < 0:
      return None
    for x in range(1, n + 1, 2):
      print(((n - x) // 2) * ' ' + x * '*')
    for y in range(n - 2, 0, -2):
      print(b * ' ' + y * '*')
      b += 1

蔡蔡蔡蔡姬丶 发表于 2017-6-10 12:23:13

自己想不出来{:10_269:} 看了评论就懂了{:10_266:}

HiSunny 发表于 2017-6-10 12:43:44

{:9_241:}

yama 发表于 2017-6-11 09:56:56

def diamond():
    count = int(input('请输入一个基数:'))
    if count%2==0 or count==0:
      print('输入错误')
    maxcount=count
    for a in range(2,count,4):
      if maxcount-a>0:
            maxcount=maxcount-a
      else:
            break
    spe=maxcount//2
    start=1
    for i in range(spe,-1,-1):
      print(' '*i+'*'*start)
      if start+2<=maxcount:
            start+=2
      else:
            break
            

ooxx7788 发表于 2017-6-11 10:08:56

yama 发表于 2017-6-11 09:56


你有自己运行过吗?

badaoqingchen 发表于 2017-6-12 11:51:45

中规中矩的程序:
def diamond(n):
    if n%2 == 0 or n<0:
      return None
    else:
      for i in range(0, n//2+1):
            print ' '*(n//2-i), '*'*(2*i+1)
      for i in range(1, n//2+1):
            print ' '*i, '*'*(n-2*i)

gopythoner 发表于 2017-6-13 13:48:39

def diamond(n):
l = ""
if n%2==1 and n>0:
    for i in range(1,n+1,2):
      l += " "*int((n-i)/2) + "*"*i + " "*int((n-i)/2)+"\n"
    for x in range(n+2,2*n+1,2):
      l += " "*int((x-n)/2) + "*"*(x-2*(x-n)) + " "*int((x-n)/2)+"\n"
else:
    l = None
return l


for n in [-5,3,14,15]:   
print(diamond(n))

输出
None
*
***
*

None
       *      
      ***      
   *****   
    *******   
   *********   
***********
*************
***************
*************
***********
   *********   
    *******   
   *****   
      ***      
       *      
页: [1] 2
查看完整版本: Python: 每日一题 62