鱼C论坛

 找回密码
 立即注册
查看: 5173|回复: 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 编辑
  1. def diamond(n):
  2.     if not n%2: return None
  3.     blank = (n-1)//2
  4.     s = ''
  5.     for i in range(1, n+1, 2):
  6.         s += ' '*blank+'*'*i+'\n'
  7.         blank -= 1
  8.     blank = 1
  9.     for i in range(n-2, 0, -2):
  10.         s += ' '*blank+'*'*i+'\n'
  11.         blank += 1
  12.     return s
复制代码

  1.        *
  2.       ***
  3.      *****
  4.     *******
  5.    *********
  6.   ***********
  7. `*************
  8. ***************
  9. `*************
  10.   ***********
  11.    *********
  12.     *******
  13.      *****
  14.       ***
  15.        *
复制代码
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2017-6-9 20:48:52 | 显示全部楼层
本帖最后由 SixPy 于 2017-6-9 20:53 编辑
  1. >>> def diamond(n):
  2.         if n<0 or ~n&1: return
  3.         ls=[('%%%ds'%(n//2-i//2+i))%('*'*i)for i in range(1,n+1,2)]
  4.         ls+=ls[-2::-1]
  5.         return '\n'.join(ls)

  6. >>> print(diamond(15))
  7.        *
  8.       ***
  9.      *****
  10.     *******
  11.    *********
  12.   ***********
  13. _*************
  14. ***************
  15. _*************
  16.   ***********
  17.    *********
  18.     *******
  19.      *****
  20.       ***
  21.        *
  22. >>> print(diamond(16))
  23. None
  24. >>> print(diamond(-17))
  25. None
复制代码
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 1 反对 0

使用道具 举报

 楼主| 发表于 2017-6-9 22:13:23 | 显示全部楼层
  1. 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 | 显示全部楼层
  1. def diamond(num):
  2.     if num % 2 == 0 or num < 0:
  3.         return
  4.     string = ''
  5.     for i in range(1, num + 1, 2):
  6.         string += ('*' * i).center(num) + '\n'
  7.     for i in range(num - 2, 0, -2):
  8.         string += ('*' * i).center(num) + '\n'
  9.     return string
复制代码


num % 2 == 0写成~num&1,运算速度会快些。
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2017-6-9 23:34:02 | 显示全部楼层
做出来了,不过不是太精简。
  1. def diamond(n):
  2.     if(n%2 == 0 or n<0):
  3.         print "输入错误"
  4.         return None
  5.     lis = list(filter(lambda x:x%2!=0,range(1,n+1)))
  6.     sp = 30
  7.     for i in lis:
  8.        print(" "*sp,end="")
  9.        print("*"*i)  
  10.        sp -= 1
  11.     lis.pop()
  12.     sp += 2   
  13.     for i in reversed(lis):
  14.         print(" "*sp,end="")
  15.         print("*"*i)
  16.         sp += 1
  17. n = int(input("请输入要多少行*:"))
  18. 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的居中格式,更简单
  1. def diamond(n):
  2.     if n<0 or ~n&1: return
  3.     ls=[('{: ^%d}'%n).format('*'*i)for i in range(1,n+1,2)]
  4.     return '\n'.join(ls+ls[-2::-1])
复制代码
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2017-6-10 01:12:48 | 显示全部楼层
str自带 center 方法,何必舍近求远~
  1. def diamond(n):
  2.     if n<0 or ~n&1: return
  3.     ls=[('*'*i).center(n)for i in range(1,n+1,2)]
  4.     return '\n'.join(ls+ls[-2::-1])
复制代码
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

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

使用道具 举报

发表于 2017-6-10 09:49:20 | 显示全部楼层
  1. def diamond(n):
  2.     b = 1
  3.     if n % 2 == 0 or n < 0:
  4.         return None
  5.     for x in range(1, n + 1, 2):
  6.         print(((n - x) // 2) * ' ' + x * '*')
  7.     for y in range(n - 2, 0, -2):
  8.         print(b * ' ' + y * '*')
  9.         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 | 显示全部楼层
  1. def diamond():
  2.     count = int(input('请输入一个基数:'))
  3.     if count%2==0 or count==0:
  4.         print('输入错误')
  5.     maxcount=count
  6.     for a in range(2,count,4):
  7.         if maxcount-a>0:
  8.             maxcount=maxcount-a
  9.         else:
  10.             break
  11.     spe=maxcount//2
  12.     start=1
  13.     for i in range(spe,-1,-1):
  14.         print(' '*i+'*'*start)
  15.         if start+2<=maxcount:
  16.             start+=2
  17.         else:
  18.             break
  19.             
复制代码
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

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

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

使用道具 举报

发表于 2017-6-12 11:51:45 | 显示全部楼层
中规中矩的程序:
  1. def diamond(n):
  2.     if n%2 == 0 or n<0:
  3.         return None
  4.     else:
  5.         for i in range(0, n//2+1):
  6.             print ' '*(n//2-i), '*'*(2*i+1)
  7.         for i in range(1, n//2+1):
  8.             print ' '*i, '*'*(n-2*i)
复制代码
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2017-6-13 13:48:39 | 显示全部楼层
  1. def diamond(n):
  2.   l = ""
  3.   if n%2==1 and n>0:
  4.     for i in range(1,n+1,2):
  5.       l += " "*int((n-i)/2) + "*"*i + " "*int((n-i)/2)+"\n"
  6.     for x in range(n+2,2*n+1,2):
  7.       l += " "*int((x-n)/2) + "*"*(x-2*(x-n)) + " "*int((x-n)/2)+"\n"
  8.   else:
  9.     l = None
  10.   return l


  11. for n in [-5,3,14,15]:     
  12.   print(diamond(n))
复制代码


输出
  1. None
  2. *
  3. ***
  4. *

  5. None
  6.        *      
  7.       ***      
  8.      *****     
  9.     *******   
  10.    *********   
  11.   ***********  
  12. *************
  13. ***************
  14. *************
  15.   ***********  
  16.    *********   
  17.     *******   
  18.      *****     
  19.       ***      
  20.        *      
复制代码
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

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

本版积分规则

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

GMT+8, 2024-4-18 12:35

Powered by Discuz! X3.4

© 2001-2023 Discuz! Team.

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