非计算机专业同学的Python自我修养-3
记录本科大一下的学习过程
WEEK-5例题
Ps:用手机看效果打折扣
Q1:统计高于平均分的人数
特别鸣谢:XRJGG
【问题描述】
从若干学生成绩中统计高于(严格的大于)平均分的人数,用-1做为学生成绩数据的结束标志。如果没有输入成绩,则输出0。
【输入形式】
一组学生的成绩
【输出形式】
高于平均分的学生人数
#样例输入
70 50 80 -1
#样例输出
2
代码:
a=input().split(' ') #这里的a是list形式
score=0
number=0
if a[0] != '-1':#如果输入的值是-1,那么直接去最后面的else输出0
for i in a:
i=int(i) #这里把i从str变成int格式
score += i #score会把之前的数全部加起来
number += 1 #number统计输入数字个数
average_score=(score+1)/(number-1)
greater=0
#这里再次使用for in 不得不说 真的可
for j in a:
j=int(j)
if j > average_score :
greater += 1
print(greater) #同理,可print
else:#为什么要把else放在后面和第一个if并列?
#不把else放在后面,前面统计number=0,而0作除数时会报错
print('0')
X设计的代码还是非常巧妙。
输出示例:無
Q2:逆序排列
【问题描述】
编写程序对标准输入的10个整数置逆序排列并输出。
【输入形式】
标准输入的前十行代表参与计算的十个整数。
【输出形式】
标准输出的一行表示逆序后的数组,以空格作为间隔。
#样例输入
1
2
3
4
5
6
7
8
9
10
#样例输出
10 9 8 7 6 5 4 3 2 1
代码:
a = [] #这题依旧使用list做法
count=0
True:
integer = input() #把input放在while下面实现分行输入
a.append(integer) #str.append(),输入数字依次放在a中
count +=1
if count == 10: #计数.当满足10个数字时打断输入
break
a.reverse() #reverse语句,很方便的实现倒叙排列
#这里其实也用了格式化切片[::-1],但是效果不好,仅限个位数。你输入的90会变成09,109会变成901.
a=' '.join(a) #将list转换为字符串
print(a)
**输出示例:无
Q3: Python日期格式转换程序
来源:python求输入某年某月某日,判断这一天是这一年的第几天
【问题描述】
输入“05/24/2003”,输出日期“May 24,2003.”
提示:12个月份英文名字符串,构成一个列表
算法:
(1)输入日期,格式为:mm/dd/yyyy格式,并保存在dateStr变量中;
(2)利用斜杠分离日期信息,将dateStr分成月份、日期、年份的字符串 (提示:split)
(3)将月份的字符串转换为月份数字;
(4)利用数字月份查找这个月份的名称;
(5)创建一个新的日期字符串,格式为:月份,日期,年份
(6)输出这个新的日期字符串
【输入形式】
输入日期,格式为:mm/dd/yyyy格式
【输出形式】
输出新的日期字符串,格式为:月份,日期,年份
#样例输入(仅日期)
Enter a date (mm/dd/yyyy):11/13/2003
#样例输出
The converted date is:November 13,2003
代码:
date=input('Enter a date (mm/dd/yyyy):')
mm=int(date[0:2])
dd=date[3:5]
yyyy=date[6:10]
temp=['January','February','March','April','May','June','July','August','September','October','November','December']
month=temp[mm-1:mm]
month=''.join(month)
print('The converted date is:',month,' ',dd,',',yyyy,sep='')
这题还算简单,我用了类似字典?的做法,利用格式化切片去定位月份,然后列表转字符串。
Q4:数列翻转
【问题描述】
编写程序对列表中的数据进行翻转转换,即将数组中第一个数和最后一个数交换、第二个数和倒数第二个数交换,依此类推。
建议使用列表的reverse方法。在搜索引擎输入“python reverse”可以检索到该方法的用法描述。
【输入形式】
数组元素的个数(n) 以及n个整数,采用空格隔开它们
【输出形式】
交换以后的数组,采用空格隔开它们
【样例输入】
4 100 200 300 400
【样例输出】
400 300 200 100
代码:
list1=[]
lista1=(input().strip().split())
lista2=list1[1:]
number=int(list1[0])
for i in range(number,0,-1):
print(list1[i],end=' ')
这里没有用推荐的reserve方法,reserve应该更简单。
这里使用的是for in 倒叙 也有可取之处
Q5: 一年中第几天
【问题描述】
输入某年某月某日,判断这一天是这一年的第几天?程序分析:以3月5日为例,应该先把前两个月的加起来,然后再加上5天即本年的第几天。
特殊情况:闰年且输入月份大于3时需考虑多加一天。
提示:(1) 闰年的2月有29天,平年的2月有28天;
(2) 如果年份满足以下两个条件之一,则该年就是闰年。
i) 年份能被4整除且不能被100整除
ii) 年份能被400整除
【输入形式】
输入一行,一行三个整数,用空格隔开,分别代表年月日。如2012 2 7
代表2012年2月7日。注意,不要输入任何汉字。
【输出形式】
输出只有一个数字,即所对应的日期是该年的第几天。
#样例输入
2012 1 1
#样例输出
1
代码:
year,month,day=(int,input().split(' ')) #这样都是int格式,也可以运用到前面几题中
day += (month-1) * 30#将月数转化为日
if month < 9:
day += month//2
else:
day += (month+1)//2
if month > 2:
if year%400 ==0 or year%4 == 0 and year%100 !=0 :
day -= 1
else:
day -= 2
print(day)
下面是输出示例
这个代码运用的非常巧妙,完美诠释了这首歌:
一三五七八十腊,三十一天永不差; 四六九冬是小月,唯有二月二十八。
细品吧
Q6:Fib数列计算
来源忘记了,后面可补上
使用的新函数已经记下了
【问题描述】
一个整数数列,它的第一项是m,第二项是n,以后每项都是前两项之和。
例如数列:1,1,2,3,5,8,13,21......
编写程序,输入整型数值m和n,求解该数列,保存到一个列表,求前20项之和并输出。
【输入形式】
输入的第一行表示m的值;
输入的第二行表示n的值。
【输出形式】
输出该数列的前20项的和。若输入数据含小数,则输出"illegal input"。
#样例输入
1
1
#样例输出:
17710
代码:
a=eval(input())
b=eval(input())
count=0
d=a+b
if isinstance(a,int)==False or isinstance(b,int)==False: #判断输入的对不对
print('illegal input')
else:
< 18:#因为已经输入了2个数,后面进行计算只要重复18遍
c = a + b #c会将前两个数字加起来
a = b
b = c #这两行相当于将a 和b 整体向后移了一位
d += c #d是统计所有的
count += 1
print(d)
经典的斐波那契数列
isinstance() 函数用于
:判断一个对象是否是一个已知的类型
Q7:统计字符串中小写字母个数最多的字符
来源:python找出一个字符串中出现次数最多的字_第十一届蓝桥杯Python组第二场试题
【问题描述】
输入小写字符串,输出字符串中出现次数最多的字母及其出现次数。如果有多个字母出现次数一样,则按字符从小到大顺序输出字母及其出现次数。
【输入形式】
一个字符串。
【输出形式】
出现次数最多的字母及其出现次数
#样例输入
abcccddd
#样例输出:
c 3
d 3
代码:
cnt = [0]*26#cnt是一个拥有26个‘0’的list,对应26个字母
s = input()
for alpha in s:
cnt[ord(alpha) - ord('a')] += 1 #这里转换为ord,找出数字差用于切片
#如果alpha=a,那么你的cnt第一个0就会+1
#同理,如果alpha=c,那么第三个数将会+1
for i in range(26):
if cnt[i] >= max(cnt):
#重新看一下cnt这个list。如果出现2个字母相同的情况,也能print出来
print(chr(i+ord('a')),cnt[i])
这个题用的方法跟上周的凯撒加密差不多,比凯撒加密更简单。
2021/4/2 18:26已更新