python基础——100多个Python挑战性编程练习

声明:写博客的目的主要是记录自己的学习经历,并监督自己学习,本来是想自己把github上面翻译做的,然后发现已经有人翻译了,我就跟着他做了,有的程序也是参考博主的,见参考文献。
题目源自github Python-programming-exercises
参考博客:100+Python编程题给你练(附答案)

第一题:循环

题目: 编写一个程序,它将找到所有这些数字,可被7整除,但不是5的倍数,范围2000至3200(包括边界)。得到的数字应按逗号分隔的顺序打印在一行上。
提示: 考虑使用range(#begin, #end)方法

l=[]
for i in range(2000,3201):  #注意这里需要3201而不是3200
    if (i%7==0) & (i%5!=0):
        l.append(str(i))   #str() 函数将对象转化为适于人阅读的形式。
print (','.join(l))    #join() 方法用于将序列中的元素以指定的字符连接生成一个新的字符串。

第二题:阶乘(递归)

题目: 编写一个可以计算给定数的阶乘的程序。
假设向程序提供以下输入:8;则输出为:40320
提示: 在为问题提供输入数据的情况下,应该假设它是控制台输入。考虑递归思想。

def fact(x):
    if x==0:
        return 1
    return x*fact(x-1)
print('请输入一个数字')
x=int(input())
print(fact(x))

第三题:字典dict

问题: 使用给定的整数n,编写一个程序生成一个包含(i, i*i)的字典,该字典包含1到n之间的整数(两者都包含)。然后程序应该打印字典。
输入:8
则输出为:{1:1,2:4,3:9,4:16,5:25,6:36,,7:49,8:64}
提示: 在为问题提供输入数据的情况下,应该假设它是控制台输入。考虑使用dict类型()

def fact(x):
    d=dict()
    for i in range(1,x+1):
        d[i]=i*i
    return d
print('请输入一个整数')
x=int(input())
print(fact(x))

第四题:split,tuple

问题: 编写一个程序,该程序接受控制台以逗号分隔的数字序列,并生成包含每个数字的列表和元组。
输入:34,67,55,33,12,98
则输出为:[‘34’, ‘67’, ‘55’, ‘33’, ‘12’, ‘98’]
(‘34’, ‘67’, ‘55’, ‘33’, ‘12’, ‘98’)
提示: 在为问题提供输入数据的情况下,应该假设它是控制台输入。方法可以将列表转换为元组

print('请输入数字序列')
values=input()
l=values.split(",") #split():就是将一个字符串分隔成多个字符串组成的列表
t=tuple(l)
print (l)
print (t)

第五题:类

问题: 定义一个至少有两个方法的类:
getString:从控制台输入获取字符串
printString::打印大写母的字符串。
再写一个简单的测试函数来测试类方法。
提示: 使用__init__方法构造一些参数

class InputOutString(object):
    def __init__(self):
        self.string=""
    def getString(self):
        print('请输入字符串')
        self.string=input()

    def printString(self):
        y=self.string.upper()
        print(y)
obj=InputOutString()
obj.getString()
obj.printString()

这里本来不想调用函数的,用for循环实现,但是str类型减去数字会报错,有大佬知道怎么操作吗?

第六题:类型转换

问题:
编写一个程序,根据给定的公式计算并打印值:Q = Square root of [(2 * C * D)/H]
C和H的固定值:C is 50. H is 30.
它的值应该以逗号分隔的序列输入到程序中。
Example:输入 100,150,180 输出 18,22,24

提示:
如果接收到的输出是小数,则应四舍五入到其最近的值(例如,如果接收到的输出是26.0,则应打印为26)。在为问题提供输入数据的情况下,应该假设它是控制台输入。

import math
print('请输入D的值,并以逗号分割')
DS=input()
DSS=DS.split(",")#字符串转列表
C=50
H=30
Q=[]
for D in DSS:
    #round四舍五入
    #str将数字转换为字符串
    Q.append(str(round(math.sqrt(2*C*int(D)/H))))
print (','.join(Q))#列表转字符串

第七题:二维数组

问题:
编写一个程序,用两个数字X,Y作为输入,生成一个二维数组。数组的第i行和第j列中的元素值应该是i*j。
Note: i=0,1, …, X-1; j=0,1,…, ­Y-1.
Example
输入: 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

升级版

print('请输入两个数字,并以逗号分割')
DATA_XY=input()
XY=DATA_XY.split(",")#字符串转列表
X=int(XY[0])
Y=int(XY[1])
mul=[[]]
mul = [[x*y for y in range(Y)] for x in range(X)]
print(mul)

第八题:sort

问题:
编写一个程序,接受逗号分隔的单词序列作为输入,按字母顺序排序后按逗号分隔的序列打印单词
假设向程序提供以下输入:without,hello,bag,world
则输出为:bag,hello,without,world
提示:
在为问题提供输入数据的情况下,应该假设它是控制台输入。

print('请输入单词序列,以逗号为分隔')
stringinput=input()
listinput=stringinput.split(",")
listinput.sort()
print(','.join(listinput))

第九题:upper

问题:
编写一个程序,每次接受一行序列作为输入,并在将句子中的所有字符大写后打印行,直至接受为空。
假设向程序提供以下输入:
Hello world
Practice makes perfect
则输出为:
HELLO WORLD
PRACTICE MAKES PERFECT
提示:
在为问题提供输入数据的情况下,应该假设它是控制台输入。

lines=[]
while True:
    print('请输入一句话')
    ins=input()
    if ins:
        lines.append(ins.upper())
    else:
        break
[print(line) for line in lines]

第十题:set

问题: 编写一个程序,接受一系列空格分隔的单词作为输入,并在删除所有重复的单词并按字母数字排序后打印这些单词。
假设向程序提供以下输入:
hello world and practice makes perfect and hello world again
则输出为:
again and hello makes perfect practice world
提示: 在为问题提供输入数据的情况下,应该假设它是控制台输入。
我们使用set容器自动删除重复的数据,然后使用sort()对数据进行排序。

print('请输入以空格为分割的句子')
ju=input()
juu=set(ju.split(" "))
print(juu)
ju_list=list(juu)
print(ju_list)
ju_list.sort()
print(ju_list)
print(','.join(ju_list))

这里请注意y.sort()和sorted(y)的区别

第十一题:进制

问题: 编写一个程序,接受一系列逗号分隔的4位二进制数作为输入,然后检查它们是否可被5整除。 可被5整除的数字将以逗号分隔的顺序打印。
例:
输入 :0100,0011,1010,1001
那么输出应该是:1010
提示: 如果输入数据被提供给问题,则应该假定它是控制台输入。
整除是//哦,这里提供两种参考代码

print('请输入逗号分隔的4位二进制数')
data=input()
out=[]
for a in data.split(","):
    b=1*int(a)%10+2*(int(a)//10)%10+4*(int(a)//100)%10+8*(int(a)//1000)
    if b%5==0:
        out.append(a)
print(','.join(out))
print('请输入逗号分隔的4位二进制数')
data=input()
out=[]
for a in data.split(","):
    b=int(a,2)#直接转换进制
    if b%5==0:
        out.append(a)
print(','.join(out))

第十二题:

题目: 编写一个程序,它将找到1000到3000之间的所有,每一位都是偶数的数。获得的数字应以逗号分隔的顺序打印在一行上。

提示: 如果输入数据被提供给问题,则应该假定它是控制台输入。

lis=[]
for i in range(1000,3001):
    if ((i%10)%2==0)&(((i//10)%10)%2==0)&(((i//100)%10)%2==0)&(((i//1000)%10)%2==0):
        lis.append(str(i))
print(','.join(lis))

这里记得i本来是数字,需要转换成字符串才能使用join

第十三题:isdigit,isalpha

题目:
编写一个接受句子并计算字母和数字的程序。
假设为程序提供了以下输入:Hello world! 123
然后,输出应该是:
字母10
数字3
提示: 如果输入数据被提供给问题,则应该假定它是控制台输入。

print('请输入句子')
s = input()
d={"字母":0, "数字":0}
for c in s:
    if c.isdigit():#判断是否为数字
        d["数字"]+=1
    elif c.isalpha():#判断是否为字母
        d["字母"]+=1
    else:
        pass
print("字母", d["字母"])
print("数字",  d["数字"])

第十四题:isupper,islower

题目: 编写一个接受句子的程序,并计算大写字母和小写字母的数量。
假设为程序提供了以下输入: Hello world!
然后,输出应该是:
UPPER CASE 1
LOWER CASE 9

提示: 如果输入数据被提供给问题,则应该假定它是控制台输入。

print('请输入句子')
s = 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"])

第十五题:

题目: 编写一个程序,计算a + aa + aaa + aaaa的值,给定的数字作为a的值。
输入:9
输出 11106

提示: 如果输入数据被提供给问题,则应该假定它是控制台输入。

print('请输入a的值')
b=input()
a=int(b)
out=a*4+a*10*3+a*100*2+a*1000
print(out)

第十六题:

题目: 使用列表推导来对列表中的每个奇数。 该列表由一系列逗号分隔的数字输入。
输入:1,2,3,4,5,6,7,8,9
输出:1,3,5,7,9
给出两种方法

print('请输入数字序列,以逗号为分割')
s=input()
ss=s.split(',')
lis=[]
for i in ss:
    if int(i)%2==1:
        lis.append(i)
print(','.join(lis))
print("输入:")
values = input()
numbers = [x for x in values.split(",") if int(x)%2!=0]
print (",".join(numbers))

第十七题:

题目: 编写一个程序,根据控制台输入的事务日志计算银行帐户的净金额。
事务日志格式如下所示:D表示存款,而W表示提款。
D 100
W 200
假设为程序提供了以下输入:
D 300
D 300
W 200
D 100
然后,输出应该是:
500

net=0
while True:
    print('请输入存取款操作')
    s=input()
    if not s:
        break
    values=s.split(' ')
    if values[0]=='D':
        net+=int(values[1])
    elif values[0]=='W':
        net-= int(values[1])
print('存款为',net)

第十八题:

题目: 网站要求用户输入用户名和密码进行注册。编写程序以检查用户输入的密码的有效性。
以下是检查密码的标准:

  1. [a-z]之间至少有1个字母
  2. [0-9]之间至少有1个数字
  3. [A-Z]之间至少有一个字母
  4. [$#@]中至少有1个字符
  5. 最短交易密码长度:6
  6. 交易密码的最大长度:12

您的程序应接受一系列逗号分隔的密码,并将根据上述标准进行检查。将打印符合条件的密码,每个密码用逗号分隔。
输入:ABd1234@1,a F1#,2w3E*,2We3345
输出:ABd1234 @ 1

提示: 如果输入数据被提供给问题,则应该假定它是控制台输入。

import re
print('请输入一系列以逗号分隔的密码')
s=input()
ss=s.split(',')
value=[]
for i in ss:
    if (len(i)<6)|(len(i)>12):
        continue
    if not re.search("[a-z]",i):
        continue
    if not re.search("[0-9]",i):
        continue
    if not re.search("[A-Z]",i):
        continue
    if not re.search("[$#@]",i):
        continue
    value.append(i)
print(','.join(value))

第十九题:itemgetter

题目: 您需要编写一个程序,按升序对(name > age > score)tuples 进行排序,其中name是string,age和score是数字。 tuples由控制台输入。 排序标准是:
1:根据name 排序;
2:然后根据age 排序;
3:然后按score排序。
优先级是name > age > score。
如果给出以下元组作为程序的输入:
Tom,19,80
John,20,90
Jony,17,91
Jony,17,93
Json,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:
    print('请输入学生姓名,年龄,成绩')
    s=input()
    if not s:
        break
    l.append(tuple(s.split(',')))
print (sorted(l, key=itemgetter(0,1,2)))

第二十题:yield

题目: 使用生成器定义一个类,该生成器可以在给定范围0和n之间迭代可被7整除的数字。
提示: 考虑使用yield。

在做这道题的之前先理解一下yield的使用方法:

def foo():
    print("starting...")
    while True:
        res = yield 4
        print("res:",res)
g = foo()
print(next(g))
print("*"*20)
print(next(g))

我直接解释代码运行顺序,相当于代码单步调试:

  1. 程序开始执行以后,因为foo函数中有yield关键字,所以foo函数并不会真的执行,而是先得到一个生成器g(相当于一个对象)
  2. 直到调用next方法,foo函数正式开始执行,先执行foo函数中的print方法,然后进入while循环
  3. 程序遇到yield关键字,然后把yield想想成return,return了一个4之后,程序停止,并没有执行赋值给res操作,此时next(g)语句执行完成,所以输出的前两行(第一个是while上面的print的结果,第二个是return出的结果)是执行print(next(g))的结果,
  4. 程序执行print("*"20),输出20个
  5. 又开始执行下面的print(next(g)),这个时候和上面那个差不多,不过不同的是,这个时候是从刚才那个next程序停止的地方开始执行的,也就是要执行res的赋值操作,这时候要注意,这个时候赋值操作的右边是没有值的(因为刚才那个是return出去了,并没有给赋值操作的左边传参数),所以这个时候res赋值是None,所以接着下面的输出就是res:None,
  6. 程序会继续在while里执行,又一次碰到yield,这个时候同样return 出4,然后程序停止,print函数输出的4就是这次return出的4.

答案:

def foo(n):
    for i in range(n+1):
        if i%7==0:
            res=yield i
for n in foo(100):
    print(n)

第二十一题:

题目: 机器人从原点(0,0)开始在平面中移动。 机器人可以通过给定的步骤向上,向下,向左和向右移动。 机器人运动的痕迹如下所示:
UP 5
DOWN 3
LETF 3
RIGHT 2
方向之后的数字是步骤。 请编写一个程序来计算一系列运动和原点之后距当前位置的距离。如果距离是浮点数,则只打印最接近的整数。
例:如果给出以下元组作为程序的输入:
UP 5
DOWN 3
LETF 3
RIGHT 2
然后,程序的输出应该是:2
提示: 如果输入数据被提供给问题,则应该假定它是控制台输入。

import math
x=0
y=0
while True:
    print('请输入机器人运动操作')
    s=input()
    if not s:
        break
    values=s.split(' ')
    if values[0]=='UP':
        y+=int(values[1])
    elif values[0]=='DOWN':
        y-=int(values[1])
    elif values[0] == 'LETF':
        x += int(values[1])
    elif values[0]=='RIGHT':
        x-=int(values[1])
dis=math.sqrt(x*x+y*y)
print(round(dis))

第二十二题:字典,难

题目: 编写一个程序来计算输入中单词的频率。 按字母顺序对键进行排序后输出。
输入:
New to Python or choosing between Python 2 and Python 3? Read Python 2 or Python 3.
输出是:
2:2
3.:1
3?:1
New:1
Python:5
Read:1
and:1
between:1
choosing:1
or:2
to:1

freq = {}  # frequency of words in text
print("请输入:")
line = input()
for word in line.split():
    freq[word] = freq.get(word, 0) + 1
words = sorted(freq.keys())  # 按key值对字典排序

for w in words:
    print("%s:%d" % (w, freq[w]))

第二十三题:**

题目: 写一个可以计算数字平方值的方法
提示: 使用**运算符

def square(num):
    return num ** 2
print(square(2))

第二十四题:doc

题目: Python有许多内置函数,如果您不知道如何使用它,您可以在线阅读文档或查找一些书籍。 但是Python为每个内置函数都有一个内置的文档函数。
请编写一个程序来打印一些Python内置函数文档,例如abs(),int(),raw_input()
并为您自己的功能添加文档
提示: 内置文档方法是__doc__

print(abs.__doc__)
print(int.__doc__)
print(input.__doc__)
def square(num):
    '''Return the square value of the input number.

    The input number must be integer.
    '''
    return num ** 2

print(square(2))
print(square.__doc__)

第二十五题:类__init__

题目: 定义一个类,它具有类参数并具有相同的实例参数。
提示: 定义一个实例参数,需要在__init__方法中添加它。您可以使用构造参数初始化对象,也可以稍后设置该值

class Person:
    # Define the class parameter "name"
    name = "Person"
    def __init__(self, name=None):
        # self.name is the instance parameter
        self.name = name

jeffrey = Person("Jeffrey")
print("%s name is %s" % (Person.name, jeffrey.name))

nico = Person()
nico.name = "Nico"
print("%s name is %s" % (Person.name, nico.name))

第二十六题:(这里开始很简单)

问题: 定义一个可以计算两个数之和的函数。
提示: 用两个数字作为参数定义函数。您可以计算函数中的和并返回值。

第二十七题:

问题:定义一个可以将整数转换为字符串并在控制台中打印的函数。
提示: 使用str()将数字转换为字符串。

第二十八题:

问题: 定义一个可以接受两个字符串作为输入的函数,并在控制台中以最大长度打印字符串。如果两个字符串的长度相同,则函数应该逐行打印所有l个字符串。
提示: 使用len()函数获取字符串的长度

第二十九题:

问题: 定义一个可以接受整数作为输入的函数,如果数字是偶数,则打印“它是偶数”,否则打印“它是奇数”。
提示: 使用%运算符检查数字是偶数还是奇数。

第三十题:

问题: 定义一个函数,它可以打印一个字典,其中的key是1到3之间的数字(都包括在内),值是key的平方。

第三十一题:

问题: 定义一个函数,它可以打印一个字典,其中的key是1到20之间的数字(都包括在内),值是key的平方。

第三十二题:

问题: 定义一个函数,它可以生成一个列表,其中的值是1到20之间的数字的平方(两者都包括在内)。然后函数需要打印列表中最后5个元素。

第三十三题:

问题: 定义一个函数,它可以生成一个列表,其中的值是1到20之间的数字的平方(两者都包括在内)。然后函数需要打印列表中除前5个元素之外的所有值。

未完待续……

  • 1
    点赞
  • 9
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值