鱼C论坛

 找回密码
 立即注册
查看: 5783|回复: 36

[技术交流] Python: 每日一题 62

[复制链接]
发表于 2017-6-9 18:44:23 | 显示全部楼层 |阅读模式

马上注册,结交更多好友,享用更多功能^_^

您需要 登录 才可以下载或查看,没有账号?立即注册

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

QQ图片20170609183223.png

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

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

游客,如果您要查看本帖隐藏内容请回复

本帖被以下淘专辑推荐:

想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

发表于 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
       *
      ***
     *****
    *******
   *********
  ***********
`*************
***************
`*************
  ***********
   *********
    *******
     *****
      ***
       *
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 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
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 1 反对 0

使用道具 举报

 楼主| 发表于 2017-6-9 22:13:23 | 显示全部楼层
if n<0 or ~n&1: return

你就等着给人问这一句什么意思吧!
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2017-6-9 22:36:07 | 显示全部楼层
ooxx7788 发表于 2017-6-9 22:13
你就等着给人问这一句什么意思吧!
如果是偶数和负数则返回None。

不就是题目设定的条件嘛~
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 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,运算速度会快些。
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 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)
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2017-6-9 23:36:10 | 显示全部楼层
本帖最后由 ooxx7788 于 2017-6-9 23:37 编辑
可乐爱宅着 发表于 2017-6-9 23:34
做出来了,不过不是太精简。


sp=30是什么意思啊。哦知道了,你这个不是输出在边上的。
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

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

空格。
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2017-6-9 23:42:21 | 显示全部楼层

为什么我看你的输出,第7,第9多了两个`
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 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])
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 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])
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2017-6-10 08:43:07 | 显示全部楼层
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

发表于 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
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2017-6-10 12:23:13 | 显示全部楼层
自己想不出来 看了评论就懂了
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2017-6-10 12:43:44 | 显示全部楼层
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

发表于 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
            
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2017-6-11 10:08:56 | 显示全部楼层

你有自己运行过吗?
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 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)
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 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
       *       
      ***      
     *****     
    *******    
   *********   
  ***********  
 ************* 
***************
 ************* 
  ***********  
   *********   
    *******    
     *****     
      ***      
       *       
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

小黑屋|手机版|Archiver|鱼C工作室 ( 粤ICP备18085999号-1 | 粤公网安备 44051102000585号)

GMT+8, 2025-1-19 23:28

Powered by Discuz! X3.4

© 2001-2023 Discuz! Team.

快速回复 返回顶部 返回列表