1.等级说明
等级说明
1级初学者是指刚刚参加Python入门课程的人。他可以使用1或2个Python类或函数解决一些问题。通常,答案可以直接在教科书中找到。
2级中级是指刚刚学习过Python,但是已经具有相对较强的编程背景的人。他应该能够解决可能涉及3或3个Python类或函数的问题。答案不能直接在教科书中找到。
3级高级。他应该使用Python通过更丰富的库函数,数据结构和算法来解决更复杂的问题。他应该使用几种Python标准软件包和高级技术来解决该问题。
2.问题模板
#----------------------------------------#
题
提示
解
3.问题
#----------------------------------------#
问题1
1级
题:
编写一个程序,查找所有可以被7整除但不是5的倍数的数字。
在2000到3200之间(均包括在内)。
所获得的数字应以逗号分隔的顺序打印在一行上。
提示:
考虑使用范围(#begin,#end)方法
解:
- l=[]
- for i in range(2000, 3201):
- if (i%7==0) and (i%5!=0):
- l.append(str(i))
- print ','.join(l)
#----------------------------------------#
#----------------------------------------#
问题2
1级
题:
编写一个程序,可以计算给定数字的阶乘。
结果应以逗号分隔的顺序打印在一行上。
假设将以下输入提供给程序:
8
然后,输出应为:
40320
提示:
如果将输入数据提供给问题,则应假定它是控制台输入。
解:
- def fact(x):
- if x == 0:
- return 1
- return x * fact(x - 1)
- x=int(raw_input())
- print fact(x)
#----------------------------------------#
问题3
1级
题:
使用给定的整数n,编写程序以生成包含(i,i * i)的字典,该字典为1到n之间的整数(都包括在内)。然后程序应打印字典。
假设将以下输入提供给程序:
8
然后,输出应为:
{1: 1, 2: 4, 3: 9, 4: 16, 5: 25, 6: 36, 7: 49, 8: 64}
提示:
如果将输入数据提供给问题,则应假定它是控制台输入。
考虑使用dict()
解:
- n=int(raw_input())
- d=dict()
- for i in range(1,n+1):
- d[i]=i*i
- print d
#----------------------------------------#
问题4
1级
题:
编写一个程序,该程序从控制台接受一个逗号分隔的数字序列,并生成一个列表和一个包含每个数字的元组。
假设将以下输入提供给程序:
34,67,55,33,12,98
然后,输出应为:
['34','67','55','33','12','98']
(“ 34”,“ 67”,“ 55”,“ 33”,“ 12”,“ 98”)
提示:
如果将输入数据提供给问题,则应假定它是控制台输入。
tuple()方法可以将列表转换为元组
解:
- values=raw_input()
- l=values.split(",")
- t=tuple(l)
- print l
- print t
#----------------------------------------#
问题5
1级
题:
定义一个至少具有两个方法的类:
getString:从控制台输入获取字符串
printString:以大写形式输出字符串。
还请包括简单的测试功能以测试类方法。
提示:
使用__init__方法构造一些??参数
解:
- class InputOutString(object):
- def __init__(self):
- self.s = ""
- def getString(self):
- self.s = raw_input()
- def printString(self):
- print self.s.upper()
- strObj = InputOutString()
- strObj.getString()
- strObj.printString()
#----------------------------------------#
问题6
2级
题:
编写一个程序,根据给定的公式计算并打印值:
Q = [(2 * C * D)/ H]的平方根
以下是C和H的固定值:
C为50。H为30。
D是变量,其值应以逗号分隔的顺序输入到程序中。
例
让我们假设以下逗号分隔的输入序列已赋予程序:
100,150,180
该程序的输出应为:
18,22,24
提示:
如果收到的输出为十进制格式,则应四舍五入至最接近的值(例如,如果收到的输出为26.0,则应将其打印为26)。
如果将输入数据提供给问题,则应假定它是控制台输入。
解:
- #!/usr/bin/env python
- import math
- c=50
- h=30
- value = []
- items=[x for x in raw_input().split(',')]
- for d in items:
- value.append(str(int(round(math.sqrt(2*c*float(d)/h)))))
- print ','.join(value)
#----------------------------------------#
问题7
2级
题:
编写一个程序,该程序将X,Y两位数字作为输入并生成一个二维数组。数组的第i行和第j列中的元素值应为i * j。
注意:i=0,1.., X-1; j=0,1,?-Y-1.
例
假设将以下输入提供给程序:
3,5
然后,程序的输出应为:
[[0,0,0,0,0],[0,1,2,3,4],[0,2,4,6,8]]
提示:
注意:如果将输入数据提供给问题,则应将其假定为以逗号分隔形式的控制台输入。
解:
- input_str = raw_input()
- dimensions=[int(x) for x in input_str.split(',')]
- rowNum=dimensions[0]
- colNum=dimensions[1]
- multilist = [[0 for col in range(colNum)] for row in range(rowNum)]
- for row in range(rowNum):
- for col in range(colNum):
- multilist[row][col]= row*col
- print multilist
问题8
2级
题:
编写一个程序,该程序接受以逗号分隔的单词序列作为输入,并在按字母顺序对它们进行排序后以逗号分隔的顺序打印这些单词。
假设将以下输入提供给程序:
没有,你好,袋,世界
然后,输出应为:
袋,你好,没有,世界
提示:
如果将输入数据提供给问题,则应假定它是控制台输入。
解:
- items=[x for x in raw_input().split(',')]
- items.sort()
- print ','.join(items)
#----------------------------------------#
问题9
2级
问题:
编写一个接受行序列作为输入的程序,并在将句子中的所有字符都大写之后打印行。
假设将以下输入提供给程序:
你好,世界
实践使完美
然后,输出应为:
你好,世界
实践完美
提示:
如果将输入数据提供给问题,则应假定它是控制台输入。
解:
- lines = []
- while True:
- s = raw_input()
- if s:
- lines.append(s.upper())
- else:
- break;
- for sentence in lines:
- print sentence
问题10
2级
题:
编写一个程序,该程序接受一系列由空格分隔的单词作为输入,并在删除所有重复的单词并将其按字母数字顺序排序后打印这些单词。
假设将以下输入提供给程序:
你好世界,实践使世界变得完美,你好世界
然后,输出应为:
再次,你好使完美实践世界
提示:
如果将输入数据提供给问题,则应假定它是控制台输入。
我们使用set容器自动删除重复的数据,然后使用sorted()对数据进行排序。
解:
- s = raw_input()
- words = [word for word in s.split(" ")]
- print " ".join(sorted(list(set(words))))
2级
题:
编写一个程序,该程序接受以逗号分隔的4位二进制数字序列作为输入,然后检查它们是否可被5整除。被5整除的数字将以逗号分隔的顺序打印。
例:
0100,0011,1010,1001
然后输出应为:
1010
注意:假设数据是通过控制台输入的。
提示:
如果将输入数据提供给问题,则应假定它是控制台输入。
解:
- value = []
- items=[x for x in raw_input().split(',')]
- for p in items:
- intp = int(p, 2)
- if not intp%5:
- value.append(p)
- print ','.join(value)
#----------------------------------------#
问题12
2级
题:
编写一个程序,它将找到介于1000和3000之间的所有此类数字(均包括在内),以使该数字的每个数字均为偶数。
所获得的数字应以逗号分隔的顺序打印在一行上。
提示:
如果将输入数据提供给问题,则应假定它是控制台输入。
解:
- values = []
- for i in range(1000, 3001):
- s = str(i)
- if (int(s[0])%2==0) and (int(s[1])%2==0) and (int(s[2])%2==0) and (int(s[3])%2==0):
- values.append(s)
- print ",".join(values)
#----------------------------------------#
问题13
2级
题:
编写一个接受句子并计算字母和数字数量的程序。
假设将以下输入提供给程序:
你好,世界!123
然后,输出应为:
字母10
数字3
提示:
如果将输入数据提供给问题,则应假定它是控制台输入。
解:
- s = raw_input()
- d={"DIGITS":0, "LETTERS":0}
- for c in s:
- if c.isdigit():
- d["DIGITS"]+=1
- elif c.isalpha():
- d["LETTERS"]+=1
- else:
- pass
- print "LETTERS", d["LETTERS"]
- print "DIGITS", d["DIGITS"]
#----------------------------------------#
问题14
2级
题:
编写一个接受句子的程序,并计算大写字母和小写字母的数量。
假设将以下输入提供给程序:
你好,世界!
然后,输出应为:
大写1
小写9
提示:
如果将输入数据提供给问题,则应假定它是控制台输入。
解:
- s = raw_input()
- d={"UPPER CASE":0, "LOWER CASE":0}
- for c in s:
- if c.isupper():
- d["UPPER CASE"]+=1
- elif c.islower():
- d["LOWER CASE"]+=1
- else:
- pass
- print "UPPER CASE", d["UPPER CASE"]
- print "LOWER CASE", d["LOWER CASE"]
2级
题:
编写一个程序,以给定的数字作为a的值来计算a + aa + aaa + aaaa的值。
假设将以下输入提供给程序:
9
然后,输出应为:
11106
提示:
如果将输入数据提供给问题,则应假定它是控制台输入。
解:
- a = raw_input()
- n1 = int( "%s" % a )
- n2 = int( "%s%s" % (a,a) )
- n3 = int( "%s%s%s" % (a,a,a) )
- n4 = int( "%s%s%s%s" % (a,a,a,a) )
- print n1+n2+n3+n4
问题16
2级
题:
使用列表推导对列表中的每个奇数取平方。该列表由一系列逗号分隔的数字输入。
假设将以下输入提供给程序:
1,2,3,4,5,6,7,8,9
然后,输出应为:
1,3,5,7,9
提示:
如果将输入数据提供给问题,则应假定它是控制台输入。
解:
- values = raw_input()
- numbers = [x for x in values.split(",") if int(x)%2!=0]
- print ",".join(numbers)
2级
题:
编写一个程序,该程序根据控制台输入的交易日志来计算银行帐户的净额。事务日志格式如下所示:
D 100
W 200
D表示存款,W表示提款。
假设将以下输入提供给程序:
D 300
D 300
W 200
D 100
然后,输出应为:
500
提示:
如果将输入数据提供给问题,则应假定它是控制台输入。
解:
- netAmount = 0
- while True:
- s = raw_input()
- if not s:
- break
- values = s.split(" ")
- operation = values[0]
- amount = int(values[1])
- if operation=="D":
- netAmount+=amount
- elif operation=="W":
- netAmount-=amount
- else:
- pass
- print netAmount
问题18
3级
题:
网站要求用户输入用户名和密码进行注册。编写程序以检查用户输入的密码的有效性。
以下是检查密码的标准:
1. [az]之间至少1个字母
2. [0-9]之间至少1个数字
1. [AZ]之间至少1个字母
3. [$#@]中的至少1个字符
4.最小交易密码长度:6
5.交易密码的最大长度:12
您的程序应接受一系列用逗号分隔的密码,并将根据上述条件进行检查。符合条件的密码将被打印,每个密码之间用逗号分隔。
例
如果输入以下密码作为程序输入:
ABd1234 @ 1,a F1#,2w3E *,2We3345
然后,程序的输出应为:
ABd1234 @ 1
提示:
如果将输入数据提供给问题,则应假定它是控制台输入。
解决方案:
- import re
- value = []
- items=[x for x in raw_input().split(',')]
- for p in items:
- if len(p)<6 or len(p)>12:
- continue
- else:
- pass
- if not re.search("[a-z]",p):
- continue
- elif not re.search("[0-9]",p):
- continue
- elif not re.search("[A-Z]",p):
- continue
- elif not re.search("[$#@]",p):
- continue
- elif re.search("\s",p):
- continue
- else:
- pass
- value.append(p)
- print ",".join(value)
问题19
3级
题:
您需要编写程序以升序对(名称,年龄,身高)元组进行排序,其中名称是字符串,年龄和身高是数字。元组由控制台输入。排序标准是:
1:根据名称排序;
2:然后根据年龄排序;
3:然后按分数排序。
优先级是名称>年龄>得分。
如果给出以下元组作为程序的输入:
汤姆,19,80
约翰,20,90
乔尼,17,91
乔尼,17,93
杰森,21,85
然后,程序的输出应为:
[('John','20','90'),('Jony','17','91'),('Jony','17','93'),('Json','21 ','85'),('Tom','19','80')]
提示:
如果将输入数据提供给问题,则应假定它是控制台输入。
我们使用itemgetter启用多个排序键。
解决方案:
- from operator import itemgetter, attrgetter
- l = []
- while True:
- s = raw_input()
- if not s:
- break
- l.append(tuple(s.split(",")))
- print sorted(l, key=itemgetter(0,1,2))
问题20
3级
题:
用生成器定义一个类,该生成器可以在给定范围0和n之间迭代可以被7整除的数字。
提示:
考虑使用量
解:
- def putNumbers(n):
- i = 0
- while i<n:
- j=i
- i=i+1
- if j%7==0:
- yield j
- for i in reverse(100):
- print i