QQ登录

只需一步,快速开始

登录 | 立即注册 | 找回密码

主题

帖子

荣誉

版主

Rank: 20Rank: 20Rank: 20Rank: 20

技术值
查看: 457|回复: 17

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

[复制链接]
最佳答案
495 
累计签到:714 天
连续签到:13 天
冬雪雪冬 发表于 2017-11-8 09:40:36 45717 | 显示全部楼层 |阅读模式

马上注册加入鱼C,享用更多服务吧^_^

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

x
本帖最后由 冬雪雪冬 于 2017-11-10 15:27 编辑

先我们的玩法做了一下改变:
1. 楼主不再提供答案。
2. 请大家先独立思考”,再参考其他鱼油的解答,这样才有助于自己编程水平的提高。
3. 鼓励大家积极答题,奖励的期限为出题后24小时内。
4. 根据答案的质量给予1~3鱼币的奖励。

题目:到年底了,新的一年就要到了,要求打印一个年历,格式如下:
1.jpg

本帖被以下淘专辑推荐:

楼层
跳转到指定楼层
最佳答案
9 
累计签到:256 天
连续签到:10 天
xindong 发表于 2017-11-8 10:32:53 | 显示全部楼层
本帖最后由 xindong 于 2017-11-8 11:28 编辑

有点不好意思了。直接用calendar 模块,好像也没什么需要做的了。

ps. 打印的是英文的,稍后修改一下。

  1. # -*- coding: utf-8 -*-
  2. """
  3. Created on Wed Nov  8 10:27:44 2017
  4. """

  5. import calendar


  6. #返回指定年的日历
  7. def get_calendar(year):
  8.     return calendar.calendar(year)

  9. year = 2018
  10. print(get_calendar(year))
复制代码


打印换成中文的了。另外把一周的开始调整到周日。由于字体问题,有可能对的不是太整齐:

  1. # -*- coding: utf-8 -*-
  2. """
  3. Created on Wed Nov  8 10:27:44 2017
  4. """

  5. import calendar


  6. #返回指定年的日历
  7. def get_calendar(year):
  8.     return calendar.calendar(year)


  9. Month = {'January':'  一月 ','February':'  二月 ', 'March':' 三月',
  10.          'April':' 四月',  'May':'五月','June':'六月',
  11.          'July':'七月','August':'  八月 ',
  12.          'September':'  九月   ','October':' 十月 ',
  13.          'November':'   十一月','December':'  十二月 '}
  14. Week = {'Mo':'一','Tu':'二','We':'三','Th':'四','Fr':'五','Sa':'六','Su':'日'}


  15. year = 2018
  16. calendar.setfirstweekday(6)  
  17. A = (get_calendar(year))
  18. for key in Month:
  19.   A=A.replace(key, Month[key])

  20. for key in Week:
  21.   A=A.replace(key, Week[key])


  22. print(A)

复制代码



评分

参与人数 1鱼币 +3 收起 理由
冬雪雪冬 + 3

查看全部评分

最佳答案
138 
累计签到:262 天
连续签到:20 天
ooxx7788 发表于 2017-11-8 10:42:28 | 显示全部楼层
  1. import calendar
  2. calendar.setfirstweekday(6)
  3. print(calendar.calendar(2018))
复制代码


不过出来是英文的,用replace方法可以替换为中文,不过感觉写一长串很傻,就不写了

评分

参与人数 1鱼币 +2 收起 理由
冬雪雪冬 + 2

查看全部评分

最佳答案
26 
累计签到:825 天
连续签到:1 天
康小泡 发表于 2017-11-8 10:55:19 | 显示全部楼层
  1. import calendar

  2. number = input()
  3. cal=calendar.calendar(int(number))
  4. print cal
复制代码

TIM截图20171108105443.png

评分

参与人数 1鱼币 +2 收起 理由
冬雪雪冬 + 2

查看全部评分

最佳答案
0 
累计签到:37 天
连续签到:1 天
sige 发表于 2017-11-8 10:58:06 | 显示全部楼层
  1. import calendar
  2. calendar.prcal(2018)
复制代码

评分

参与人数 1鱼币 +2 收起 理由
冬雪雪冬 + 2

查看全部评分

最佳答案
1 
累计签到:7 天
连续签到:1 天
wyp02033 发表于 2017-11-8 11:01:13 | 显示全部楼层
本帖最后由 wyp02033 于 2017-11-8 23:19 编辑
  1. weekend = ['日', '一', '二', '三', '四', '五', '六']
  2. days = [x for x in range(1,32)]
  3. months = {1:'一月', 2:'二月', 3:'三月', 4:'四月', 5:'五月', 6:'六月', 7:'七月', 8:'八月', 9:'九月', 10:'十月', 11:'十一月', 12:'十二月'}
  4. month_days = [31, 28, 31, 30, 31, 30, 31, 31, 30, 31, 30, 31]
  5. nmd = month_days.copy()
  6. for i in range(len(month_days)):
  7.     if not i:
  8.         nmd[i] += 1
  9.     else:
  10.         nmd[i] += nmd[i-1] % 7
  11. m = dict.fromkeys([x for x in range(12)], '')
  12. for i in range(12):
  13.     m[i] += (months[i+1]+'\n')
  14.     for each in weekend:
  15.         m[i] += (each + ' ')
  16.     m[i] += '\n'
  17.    
  18.     ndays = days.copy()
  19.     for j in range(nmd[i] - month_days[i]):
  20.         ndays.insert(0, '  ')
  21.     for j in range(nmd[i]):
  22.         if (j + 1) % 7:
  23.             m[i] += (str(ndays[j]).ljust(2) + ' ')
  24.         else:
  25.             m[i] += (str(ndays[j]).ljust(2) + '\n')

  26. print('2018'.center(70))
  27. print()
  28. for each in m:
  29.     m[each] = m[each].split('\n')

  30. for i in range(0, 12, 3):
  31.     max_len = max(len(m[i]), len(m[i+1]), len(m[i+2]))
  32.     for j in range(3):
  33.         while len(m[i+j]) < max_len:
  34.             m[i+j] += [' ' * 20]

  35.     for j in range(max_len):
  36.         if j == 0:
  37.             print(m[i][j].center(17), end=' ' * 6)
  38.             print(m[i + 1][j].center(17), end=' ' * 6)
  39.             print(m[i + 2][j].center(17))
  40.         elif j == 1:
  41.             print(m[i][j].ljust(14), end=' ' * 6)
  42.             print(m[i + 1][j].ljust(14), end=' ' * 6)
  43.             print(m[i + 2][j])
  44.         else:
  45.             print(m[i][j].ljust(20), end=' ' * 6)
  46.             print(m[i+1][j].ljust(20), end=' ' * 6)
  47.             print(m[i+2][j])
复制代码


方法比较笨,但是基本上能满足题目要求。
输出结果:
                        

输出结果。

输出结果。

评分

参与人数 1鱼币 +3 收起 理由
冬雪雪冬 + 3

查看全部评分

最佳答案
10 
累计签到:10 天
连续签到:1 天
bush牛 发表于 2017-11-8 17:09:18 | 显示全部楼层
  1. import calendar
  2. c = calendar.TextCalendar()
  3. c.setfirstweekday(6)
  4. s = c.formatyear(2018)
  5. s = s.replace('Mo','一').replace('Tu','二').replace('We','三').replace('Th','四').replace('Fr','五').replace('Sa','六').replace('Su', '日')
  6. abc = s.split('\n')
  7. s1 = ' '*8 + '一月' + ' '*22 + '二月' + ' '*22 + '三月'
  8. s2 = ' '*8 + '四月' + ' '*22 + '五月' + ' '*22 + '六月'
  9. s3 = ' '*8 + '七月' + ' '*22 + '八月' + ' '*22 + '九月'
  10. s4 = ' '*8 + '十月' + ' '*21 + '十一月' + ' '*20 + '十二月'
  11. for i in range(len(abc)):
  12.     if 'January' in abc[i]:
  13.         print(s1)
  14.     elif 'April'in abc[i]:
  15.         print(s2)
  16.     elif 'July' in abc[i]:
  17.         print(s3)
  18.     elif 'October' in abc[i]:
  19.         print(s4)
  20.     else:
  21.         print(abc[i])
复制代码

评分

参与人数 1鱼币 +3 收起 理由
冬雪雪冬 + 3

查看全部评分

最佳答案
1 
累计签到:280 天
连续签到:5 天
solomonxian 发表于 2017-11-9 18:08:03 | 显示全部楼层
本帖最后由 solomonxian 于 2017-11-9 18:10 编辑

每行打印分成n部分,每部分7个位置,每个位置width个字符长度
7个位置为 "日~六", 空格填充

每个月占9行,分别是:月份、星期,还有28-31个数字+空格
  1. def fun(year=2018, start=1, width=3, between_months="   ", month_per_row=3):
  2.     """输入年份year,该年1月1日是星期几start(0表示星期日),单个日期打印宽度width(应大于2),
  3. 月份之间填充内容between_months,每行打印月数month_per_row(若不能被12整除将不会打印完整内容)"""
  4.    
  5.     week = "".join(i.rjust(width-1) for i in "日一二三四五六") # 中文占3字节,2个空格宽
  6.     months = [(i + '月').center(width*7 - len(i) - 1) for i in
  7.              ('一','二','三','四','五','六','七','八','九','十','十一','十二')]
  8.     days = [str(i).rjust(width) for i in range(1,32)]
  9.     days_per_month = (31, 28, 31, 30, 31, 30, 31, 31, 30, 31, 30, 31)

  10.     days_text = [] # 日期,目标文档
  11.     for num in days_per_month:
  12.         days_text.append("".join([" "*width*start, *days[:num], " "*width*(49 - num - start)]))
  13.         start = (num + start)%7

  14.     print(str(year).center(width*7*month_per_row + (month_per_row-1)*len(between_months)), end="\n\n")
  15.     for i in range(12//month_per_row): # 层数
  16.         print(*months[i*month_per_row:(i+1)*month_per_row], sep=between_months)
  17.         print(*[week]*month_per_row, sep=between_months)
  18.         for j in range(7): # 7行
  19.             print(*[days_text[i*month_per_row+k][j*7*width:(j*7+7)*width]
  20.                     for k in range(month_per_row)], sep=between_months)
复制代码

3.png
1.png

评分

参与人数 1鱼币 +3 收起 理由
冬雪雪冬 + 3

查看全部评分

最佳答案
0 
累计签到:6 天
连续签到:1 天
sks731953873 发表于 2017-11-9 20:44:29 | 显示全部楼层
看看答案
最佳答案
0 

尚未签到

lihw 发表于 2017-11-9 22:54:57 | 显示全部楼层
  1. import calendar
  2. print(calendar.calendar(2108))
复制代码

评分

参与人数 1鱼币 +2 收起 理由
冬雪雪冬 + 2

查看全部评分

最佳答案
1 
累计签到:280 天
连续签到:5 天
solomonxian 发表于 2017-11-10 18:13:13 | 显示全部楼层
ooxx7788 发表于 2017-11-8 10:42
不过出来是英文的,用replace方法可以替换为中文,不过感觉写一长串很傻,就不写了
感觉写一长串很傻

感觉中枪了
扎心了,老铁
最佳答案
0 
累计签到:4 天
连续签到:1 天
燚123 发表于 2017-11-11 08:38:40 | 显示全部楼层
一来就做日历,我还不会,膜拜一下大神们
最佳答案
138 
累计签到:262 天
连续签到:20 天
ooxx7788 发表于 2017-11-11 08:44:55 | 显示全部楼层
solomonxian 发表于 2017-11-10 18:13
感觉中枪了
扎心了,老铁

你这个是完全自制,很厉害!
最佳答案
1 
累计签到:280 天
连续签到:5 天
solomonxian 发表于 2017-11-11 18:52:10 | 显示全部楼层
ooxx7788 发表于 2017-11-11 08:44
你这个是完全自制,很厉害!

混蛋!就算你这么说,我也不会高兴的~~~
请教你一个问题,
你是怎么接触到这些库的呢?

光是标准库貌似就一大堆,总不能每个轮子都试一遍吧
论坛里好像也没看到这方面的
最佳答案
138 
累计签到:262 天
连续签到:20 天
ooxx7788 发表于 2017-11-11 20:01:19 | 显示全部楼层
solomonxian 发表于 2017-11-11 18:52
混蛋!就算你这么说,我也不会高兴的~~~
请教你一个问题,
你是怎么接触到这些库的 ...

想要做什么功能之前,先百度,google.git走一圈,看看前人做过什么
最佳答案
0 
累计签到:17 天
连续签到:13 天
像番茄加两个蛋 发表于 2017-11-11 20:08:29 | 显示全部楼层
  1. import calendar
  2. correct = 0
  3. while correct == 0:
  4.     try:
  5.         year = int(input("请您输入年份:"))
  6.         if type(year) == int:
  7.             correct = correct +1
  8.             cal=calendar.calendar(int(year))
  9.             Month = {'January':'  一月 ','February':'  二月 ', 'March':' 三月',
  10.                      'April':' 四月',  'May':'五月','June':'六月',
  11.                      'July':'七月','August':'  八月 ',
  12.                      'September':'  九月   ','October':' 十月 ',
  13.                      'November':'   十一月','December':'  十二月 '}
  14.             Week = {'Mo':'一','Tu':'二','We':'三','Th':'四','Fr':'五','Sa':'六','Su':'日'}
  15.             for key in Month:
  16.               cal=cal.replace(key, Month[key])

  17.             for key in Week:
  18.               cal=cal.replace(key, Week[key])
  19.             print(cal)
  20.         else:
  21.             print("请您输入整数!")
  22.     except:
  23.         print("对不起您输入错误!请您重新输入!")
复制代码
最佳答案
1 
累计签到:26 天
连续签到:7 天
bing_home 发表于 2017-11-13 09:47:34 | 显示全部楼层
虽然还不会做,但是也要留言
最佳答案
0 
累计签到:12 天
连续签到:12 天
handsome594f 发表于 2017-11-13 12:27:19 | 显示全部楼层
学习了。

发表回复

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

本版积分规则

关闭

小甲鱼强烈推荐 上一条 /1 下一条

    移动客户端下载(未启用)
    微信公众号

小黑屋|手机版|Archiver|鱼C工作室 ( 粤ICP备11014136号

Copyright 2018 鱼C论坛 版权所有 All Rights Reserved.

Powered by Discuz! X3.1 Copyright
© 2001-2018 Comsenz Inc.    All Rights Reserved.

小黑屋|手机版|Archiver|鱼C工作室 ( 粤公网安备 44051102000370号 | 粤ICP备11014136号

GMT+8, 2017-11-25 11:55

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