基础Python练习题(附答案)

打印"Hello World"

获得用户输入的一个整数,参考该整数值,打印输出"Hello World",要求:‪‬‪‬‪‬‪‬‪‬‮‬‪‬‫‬‪‬‪‬‪‬‪‬‪‬‮‬‪‬‪‬‪‬‪‬‪‬‪‬‪‬‮‬‪‬‮‬‪‬‪‬‪‬‪‬‪‬‮‬‭‬‪‬‪‬‪‬‪‬‪‬‪‬‮‬‪‬‮‬‪‬‪‬‪‬‪‬‪‬‮‬‫‬‮‬‪‬‪‬‪‬‪‬‪‬‮‬‫‬‫‬

如果输入值是0,直接输出"Hello World"‪‬‪‬‪‬‪‬‪‬‮‬‪‬‫‬‪‬‪‬‪‬‪‬‪‬‮‬‪‬‪‬‪‬‪‬‪‬‪‬‪‬‮‬‪‬‮‬‪‬‪‬‪‬‪‬‪‬‮‬‭‬‪‬‪‬‪‬‪‬‪‬‪‬‮‬‪‬‮‬‪‬‪‬‪‬‪‬‪‬‮‬‫‬‮‬‪‬‪‬‪‬‪‬‪‬‮‬‫‬‫‬

如果输入值大于0,以两个字符一行方式输出"Hello World"(空格也是字符)‪‬‪‬‪‬‪‬‪‬‮‬‪‬‫‬‪‬‪‬‪‬‪‬‪‬‮‬‪‬‪‬‪‬‪‬‪‬‪‬‪‬‮‬‪‬‮‬‪‬‪‬‪‬‪‬‪‬‮‬‭‬‪‬‪‬‪‬‪‬‪‬‪‬‮‬‪‬‮‬‪‬‪‬‪‬‪‬‪‬‮‬‫‬‮‬‪‬‪‬‪‬‪‬‪‬‮‬‫‬‫‬

如果输入值小于0,以垂直方式输出"Hello World"

n = eval(input())
if n == 0:
    print("Hello World")
elif n > 0:
    print("He\nll\no \nWo\nrl\nd")
    #“\n”是“换行”的转义字符,常用在打印多行数据时作为分割标志出现
else:
    for c in "Hello World":
    #for in是循环结构的一种,经常用于遍历字符串、列表、元组、字典
        print(c)

转换问题

1.温度转换

华氏度F与摄氏度C的互相转换:
F= C*1.8 + 32
C=(F-32)/ 1.8

TempStr=input("请输入带有符号的温度值:")
if TempStr[-1] in ['F','f']:
    C=(eval(TempStr[0:-1])-32)/1.8
    #eval():去掉参数最外侧引号并执行余下语句的函数
    print("转换后的温度是{:.2f}C".format(C))
    #{:.2f}表示将变量C填充到这个位置时取小数点后两位
elif TempStr[-1] in ['C','c']:
    F=1.8*eval(TempStr[0:-1])+32
    print("转换后的温度是{:.2f}F".format(F))
else:
    print("输入格式错误")

输出:

    请输入带有符号的温度值:11C
转换后的温度是51.80F

2.数字转换

获得用户输入的一个正整数数字输入,输出该数字对应的中文字符表示。‪‬‪‬‪‬‪‬‪‬‮‬‪‬‫‬‪‬‪‬‪‬‪‬‪‬‮‬‪‬‪‬‪‬‪‬‪‬‪‬‪‬‮‬‪‬‮‬‪‬‪‬‪‬‪‬‪‬‮‬‭‬‪‬‪‬‪‬‪‬‪‬‪‬‮‬‪‬‮‬‪‬‪‬‪‬‪‬‪‬‮‬‫‬‮‬‪‬‪‬‪‬‪‬‪‬‮‬‫‬‫‬0到9对应的中文字符分别是:零一二三四五六七八九。

a = "零一二三四五六七八九"
s = input()
for c in s:
    print(a[eval(c)], end="")
    #print()中增加end=""参数表示输出后不增加换行,多个print()可以连续输出。

结果:

890
八九零

3.货币转换

人民币和美元是世界上通用的两种货币之一,写一个程序进行货币间币值转换,其中‮‬‫人民币和美元间汇率固定为:1美元 = 6.78人民币。‪‬‪‬‪‬‪‬‪‬‮‬‪‬‫‬‪‬‪‬‪‬‪‬‪‬‮‬‪‬‪‬‪‬‪‬‪‬‪‬‪‬‮‬‪‬‮‬‪‬‪‬‪‬‪‬‪‬‮‬‭‬‪‬‪‬‪‬‪‬‪‬‪‬‮‬‪‬‮‬‪‬‪‬‪‬‪‬‪‬‮‬‫‬‮‬‪‬‪‬‪‬‪‬‪‬‮‬‫‬‫‬

程序可以接受人民币或美元输入,转换为美元或人民币输出。人民币采用RMB表示,美元USD表示,符号和数值之间没有空格。‪‬‪‬‪‬‪‬‪‬‮‬‪‬‫‬‪‬‪‬‪‬‪‬‪‬‮‬‪‬‪‬‪‬‪‬‪‬‪‬‪‬‮‬‪‬‮‬‪‬‪‬‪‬‪‬‪‬‮‬‭‬‪‬‪‬‪‬‪‬‪‬‪‬‮‬‪‬‮‬‪‬‪‬‪‬‪‬‪‬‮‬‫‬‮‬‪‬‪‬‪‬‪‬‪‬‮‬‫‬‫‬

注意:‪‬‪‬‪‬‪‬‪‬‮‬‪‬‫‬‪‬‪‬‪‬‪‬‪‬‮‬‪‬‪‬‪‬‪‬‪‬‪‬‪‬‮‬‪‬‮‬‪‬‪‬‪‬‪‬‪‬‮‬‭‬‪‬‪‬‪‬‪‬‪‬‪‬‮‬‪‬‮‬‪‬‪‬‪‬‪‬‪‬‮‬‫‬‮‬‪‬‪‬‪‬‪‬‪‬‮‬‫‬‫‬

(1) 这是一个OJ题目,获得输入请使用input() ;‪‬‪‬‪‬‪‬‪‬‮‬‪‬‫‬‪‬‪‬‪‬‪‬‪‬‮‬‪‬‪‬‪‬‪‬‪‬‪‬‪‬‮‬‪‬‮‬‪‬‪‬‪‬‪‬‪‬‮‬‭‬‪‬‪‬‪‬‪‬‪‬‪‬‮‬‪‬‮‬‪‬‪‬‪‬‪‬‪‬‮‬‫‬‮‬‪‬‪‬‪‬‪‬‪‬‮‬‫‬‫‬

(2) 不提示输出格式错误,结果小数点后保留两位。

money=input()
if money[0:3] in ["USD"]:
    R=6.78*eval(money[3:])
    print("RMB{:.2f}".format(R))
elif money[0:3] in ["RMB"]:
    U=1/6.78*eval(money[3:])
    print("USD{:.2f}".format(U))

输出:

USD1
RMB6.78

turtle绘制

1.绘制蟒蛇

import turtle
turtle.setup(650,350,200,200) #依次设置窗口的宽,高,起始横坐标,起始纵坐标
turtle.penup() #别名为turtle.pu(),表示将画笔抬起,相当于海龟在飞行,此时画笔轨迹不在画布上形成图# 案
turtle.fd(-250)#向前直行-250个像素,默认正东方向为向前
turtle.pendown() #别名turtle.pd(),表示画笔落下
turtle.pensize(25) #别名turtle.width(),设置画笔的宽度,相当于海龟腰围
turtle.pencolor("purple") #设置画笔颜色
'''pencolor(color)的color参数可以有三种形式:
   颜色字符串:turtle.pencolor("purplr")
   RGB的小数值:turtle.pencolor(0.63,0.13,0.94)
   RGB的元组值:turtle.pencolor((0.63,0.13,0.94))'''
turtle.seth(-40) #控制海龟面对的方向,表示将海龟的方向转为绝对坐标系中的-40度方向
'''turtle.left(angle):海龟向左转
   turtle.right(angle):海龟向右转
   angle:在海龟当前行进方向上旋转的角度'''
for i in range(4):
    turtle.circle(40,80)
    turtle.circle(-40,80)
'''turtle.circle(r,extent=None) 根据半径r绘制extent角度的弧形
   r:默认圆心在海龟左侧r距离的位置
   extent:绘制角度,默认是360度整圆'''
turtle.circle(40,80/2)
turtle.fd(40)
turtle.circle(16,180)
turtle.fd(40*2/3)
turtle.done()#使程序运行结束后不会自动退出,需要手工关闭才可退出。

结果:
在这里插入图片描述

2.绘制正方形

import turtle as t
t.pensize(2)
for i in range(4):
    t.fd(150)
    t.left(90)
t.done()

结果:
在这里插入图片描述

3.绘制六边形

import turtle as t
t.pensize(2)
for i in range(6):
    t.fd(150)
    t.left(60)
t.done()

结果:
在这里插入图片描述

绘制五角星

import turtle as t
t.pen(3)#画笔粗细
t.pencolor("blue")#画笔颜色
t.speed(1)#画笔速度
for i in range(5):
    t.forward(100)  #绘制各条边
    t.right(144)
t.done()

天天向上的力量

例1

一年365天,每天进步千分之五,累积进步多少?
一年365天,每天退步千分之五,累积剩下多少?

day=0.005
dayup=pow(1+day,365)
daydown=pow(1-day,365)
print("进步:{:.2f},剩下:{:.2f}".format(dayup,daydown))

结果:

进步:6.17,剩下:0.16

例2

一年365天,一周5个工作日,每天进步1%
一年365天,一周2个休息日,每天退步1%
这种工作日的力量,如何呢?

dayup=1
day=0.01
for i in range(365):
    if i % 7 in [6,0]:
        dayup=dayup*(1-day)
    else:
        dayup=dayup*(1+day)
print("工作日的力量:{:.2f}".format(dayup))

结果:

工作日的力量:4.63

例3

工作日模式要努力到什么水平,才能与每天努力1%一样?
A君:一年365天,每天进步1%,不停歇
B君: 一年365天,每周工作5天休息2天,休息日下降1%,要多努力呢?

在这里插入图片描述

代码:

def dayup(df):#df是个占位符,代表dayfactor的简写
    dayup=1   #天天向上的初始值设为1
    for i in range(365):
        if i % 7 in [6,0]: #周六周日
            dayup=dayup*(1-0.01)
        else:              #工作日
            dayup=dayup*(1+df)
    return dayup
dayfactor=0.01
while dayup(dayfactor)<37.78:
    dayfactor+=0.001
print("工作日的努力参数是:{:.3f}".format(dayfactor))

结果:

工作日的努力参数是:0.019

获取星期字符串

输入一个数字,输出对应的星期几

weekStr = "星期一星期二星期三星期四星期五星期六星期日"
weekId = eval(input("请输入星期数字(1-7):"))
pos=(weekId-1)*3
print(weekStr[pos: pos+3])

结果:

请输入星期数字(1-7):6
星期六

文本进度条

简单文本进度条

#简单文本进度条
import time
scale=10  #文本进度条的宽度
print("--------执行开始---")
for i in range(scale+1):
    a="*"*i #星号被复制的次数
    b="."*(scale-i) #剩余进度条
    c=(i/scale)*100 #输出百分比
    print("{:^3.0f}%[{}->{}]".format(c,a,b))
    # ^代表居中;
    # 3表示长度,format填充不足3自动填充空格,可指定填充物;
    # .0f表示小数点精确度到个位
    time.sleep(1)
print("--------执行结束---")

结果:

--------执行开始---
 0 %[->..........]
10 %[*->.........]
20 %[**->........]
30 %[***->.......]
40 %[****->......]
50 %[*****->.....]
60 %[******->....]
70 %[*******->...]
80 %[********->..]
90 %[*********->.]
100%[**********->]
--------执行结束---

文本进度条 单行动态刷新

#刷新:用后打印的字符覆盖之前的字符
#不能换行:print()需要被控制
#要能回退:打印后光标回退到之前的位置 \r

import time
for i in range(101):
    print("\r{:3}%".format(i),end="")
    time.sleep(1)
import time
scale=50  #文本进度条的宽度
print("执行开始".center(scale//2,"-"))
#center()方法用于将字符串填充到指定长度,并将原始字符串居中输出
#总长度为scale//2,指定填充字符为“-”

start=time.perf_counter()
for i in range(scale+1):
    a="*"*i #星号被复制的次数
    b="."*(scale-i) #剩余进度条
    c=(i/scale)*100 #输出百分比
    dur=time.perf_counter()-start #当前打印文本进度条时,消耗的时间
    print("\r{:^3.0f}%[{}->{}]{:.2f}s".format(c,a,b,dur),end='')
    time.sleep(0.1)
print("\n"+"执行结束".center(scale//2,'-'))

程序的分支结构

为输入的成绩划分等级

输入一个百分制成绩,输出等级A、B、C、D、E,其中90-100分为A,80-89分为B,70-79分为C,60-69分为D,60分以下为E。

要求:

  • 用if语句实现;
  • 输入百分制成绩后要判断该成绩的合理性,对不合理的成绩应输出出错信息。
a=eval(input("请输入成绩:")) #eval() 函数用来执行一个字符串表达式,并返回表达式的值。
if a<0 or a>100 or a%1!=0:
    print("您输入的成绩不合理,请重新输入")
elif 90<=a<=100:
    print("成绩为A")
elif 80<=a<=89:
    print('成绩为B')
elif 70<=a<=79:
    print('成绩为C')
elif 60<=a<=69:
    print("成绩为D")
else:
    print("成绩为E")

运行结果:

请输入成绩:100
成绩为A
请输入成绩:10
成绩为E
请输入成绩:110
您输入的成绩不合理,请重新输入

身体质量指数BMI

在这里插入图片描述

height,weight=eval(input("请输入身高(米)和体重(公斤)[逗号隔开]:"))
bmi=weight/pow(height,2)
print("bmi指数为:{:.2f}".format(bmi))
who,nat="",""
if bmi <18.5:
    who,nat = "偏瘦","偏瘦"
elif 18.5 <= bmi <24:
    who,nat = "正常","正常"
elif 24 <= bmi < 25:
    who,nat = "正常","偏胖"
elif 25 <= bmi < 28:
    who,nat = "偏胖","偏胖"
elif 28 <= bmi < 30:
    who,nat = "偏胖","肥胖"
else:
    who,nat = "肥胖","肥胖"
print("bmi指数为:国标'{0}',国内'{1}'".format(who,nat))

结果:

请输入身高(米)和体重(公斤)[逗号隔开]1.8,75
bmi指数为:23.15
bmi指数为:国标'正常',国内'正常'

圆周率的计算

法1:圆周率的近似计算公式:

在这里插入图片描述
代码实现:

pi=0
N=100 #先设置累加数量为100
for k in range(N):
    pi+=1/pow(16,k)*(4/(8*k+1)-2/(8*k+4)-1/(8*k+5)-1/(8*k+6))
print("圆周率的值为:{}".format(pi))

结果:

圆周率的值为:3.141592653589793

法2:蒙特卡罗方法

pi=圆的面积与正方形的面积之比;面积通过向区域内撒点计算而得。

在这里插入图片描述
代码:

from random import random
from time import perf_counter
darts=1000*1000  #一共撒的点
hits=0.0  #指目前在圆内的点的数量
start=perf_counter() #计时,当前系统时间
for i in range(1,darts+1): #模拟每次撒的点
    x,y=random(),random()  #返回0-1之间的小数值,表示随机点的坐标
    dist=pow(x**2+y**2,0.5) #判断随机点位置是否在圆内
    if dist<=1.0: #在圆内
        hits+=1
pi=4*(hits/darts)
print("pi=",pi)
print("运行时间为:{:.5f}".format(perf_counter()-start))

结果:

pi= 3.141332
运行时间为:0.82573

七段数码管绘制

预期结果:
在这里插入图片描述
程序设计思路:

步骤1:绘制单个数字对应的数码管
步骤2:获得一串数字,绘制对应的数码管
步骤3:获得当前的系统时间,绘制对应的数码管

在这里插入图片描述

程序:

import turtle
def drawline(draw): #绘制一条线
    if draw==True:
        turtle.pendown()
    else:
        turtle.penup()
    turtle.fd(40)
    turtle.right(90)
def drawdight(dight):#根据数字绘制七段数码管(七条线)
    drawline(True) if dight in[2,3,4,5,6,8,9] else drawline(False)
    drawline(True) if dight in [0,1, 3, 4, 5, 6, 7,8, 9] else drawline(False)
    drawline(True) if dight in [0,2, 3, 5, 6, 8, 9] else drawline(False)
    drawline(True) if dight in [0,2, 6, 8] else drawline(False)
    turtle.left(90)
    drawline(True) if dight in [0, 4, 5, 6, 8, 9] else drawline(False)
    drawline(True) if dight in [0, 2, 3, 5, 6,7, 8, 9] else drawline(False)
    drawline(True) if dight in [0,1, 2, 3,4,7, 8,9] else drawline(False)
    turtle.left(180)
    turtle.penup() #为绘制后续数字确定位置
    turtle.fd(20)  #为绘制后续数字确定位置
def drawdate(date): #获得要输出的数字
    for i in date:
        drawdight(eval(i)) #通过eval将数字变为整数
def main():
    turtle.setup(800,350,200,200) #依次设置窗口的宽,高,起始横、纵坐标
    turtle.penup()
    turtle.fd(-300)
    turtle.pensize(5)
    turtle.pencolor('blue')
    drawdate('20220713')
    turtle.hideturtle()
    turtle.done()
main()

结果:

在这里插入图片描述
对上述程序进行优化,使线段之间留一些空隙;且增加年月日标记:

在这里插入图片描述

代码:

mport turtle,time
def drawgap(): #绘制数码管间隔
    turtle.penup()
    turtle.fd(5)
def drawline(draw): #绘制一条线,即单段数码管
    drawgap()
    if draw==True:
        turtle.pendown()
    else:
        turtle.penup()
    turtle.fd(40)
    drawgap()
    turtle.right(90)
def drawdight(dight):#根据数字绘制七段数码管(七条线)
    drawline(True) if dight in[2,3,4,5,6,8,9] else drawline(False)
    drawline(True) if dight in [0,1, 3, 4, 5, 6, 7,8, 9] else drawline(False)
    drawline(True) if dight in [0,2, 3, 5, 6, 8, 9] else drawline(False)
    drawline(True) if dight in [0,2, 6, 8] else drawline(False)
    turtle.left(90)
    drawline(True) if dight in [0, 4, 5, 6, 8, 9] else drawline(False)
    drawline(True) if dight in [0, 2, 3, 5, 6,7, 8, 9] else drawline(False)
    drawline(True) if dight in [0,1, 2, 3,4,7, 8,9] else drawline(False)
    turtle.left(180)
    turtle.penup() #为绘制后续数字确定位置
    turtle.fd(20)  #为绘制后续数字确定位置
def drawdate(date): #获得要输出的数字
    turtle.pencolor("red")
    for i in date:
        if i=='-':
            turtle.write('年',font=("Arial",18,"normal")) #输出的字符串 字体 大小
            turtle.pencolor("green")
            turtle.fd(40)
        elif i=='=':
            turtle.write('月', font=("Arial", 18, "normal"))
        elif i=='+':
            turtle.write('日', font=("Arial", 18, "normal"))
        else:
            drawdight(eval(i)) #通过eval将字符串变为数字
def main():
    turtle.setup(800,350,200,200) #依次设置窗口的宽,高,起始横坐标,起始纵坐标
    turtle.penup()
    turtle.fd(-300)
    turtle.pensize(5)
    drawdate(time.strftime('%Y-%m=%d+',time.gmtime()))
    #drawdate('20220713')
    turtle.hideturtle() #隐藏画笔的turtle形状
    turtle.done()
main()

结果:

在这里插入图片描述

字符串反转

将字符串s反转后输出:

#法1:字符串切片法
s="abcde"
a=s[::-1]
print(a)

输出:
edcba
#递归法
def rvs(s):
    if s=="":
        return s
    else:
        return rvs(s[1:])+s[0]#将首字符放最后,并对剩余字符进行反转
s="abcde"
print(rvs(s))

结果:
edcba

汉诺塔

在这里插入图片描述
选用中间柱子进行过渡。

count=0 #count为搬运次数
def hanoi(n,a,b,o): #n为圆盘个数,a,b,0是三个柱子,要从a搬运到b,用o来过渡
    global count
    if n==1: #若n=1,则直接从a搬到b
        print("{}:{}->{}".format(1,a,b)) #输出从原柱子到目标柱子
        count+=1
    else: #若n>1,则使用柱子o来过渡
        hanoi(n-1,a,o,b)
        print("{}:{}->{}".format(n,a,b))
        count+=1
        hanoi(n-1,o,b,a)
hanoi(3,"A","B","O")
print(count)

输出:

1:A->B
2:A->O
1:B->O
3:A->B
1:O->A
2:O->B
1:A->B
7

烤地瓜案例-类与对象

需求主线:

  1. 被烤的时间和对应的地瓜状态:
    0-3分钟:生的
    3-5分钟:半生不熟
    5-8分钟:熟的
    超过8分钟:烤糊了

  2. 添加的调料:
    用户根据自己的意愿添加调料

在这里插入图片描述

#1.定义类:初始化属性、被烤和添加调料的方法、显示对象的状态str
class Sweetpotato():
    def __init__(self): #初始化
        self.cooktime = 0 #被烤的时间为0
        self.static = '生的' #地瓜的状态为生的
        self.condiments = [] #调料列表为空

    def cook(self,time):#定义烤地瓜的方法
        self.cooktime+=time
        if 0<=self.cooktime<3:
            self.static = '生的'
        elif 3<=self.cooktime<5:
            self.static = '半生不熟'
        elif 5<=self.cooktime<8:
            self.static = '熟了'
        elif self.cooktime>=8:
            self.static = '烤糊了'

    def add_condiments(self,condiment): #添加参数,可传入不同种类的调料
        self.condiments.append(condiment)

    def __str__(self): #显示对象的信息
        return f'这个地瓜烤了{self.cooktime}分钟,状态是{self.static},调料有{self.condiments}'

#2.创建对象并调用对应的实例方法
dg=Sweetpotato()
print(dg)

dg.cook(5) #调用cook方法,并传入时间2
dg.add_condiments('辣椒')#调用add_condiments方法,并传入调料
print(dg)

dg.cook(3)
dg.add_condiments('酱油')
print(dg)

输出:

这个地瓜烤了0分钟,状态是生的,调料有[]
这个地瓜烤了5分钟,状态是熟了,调料有['辣椒']
这个地瓜烤了8分钟,状态是烤糊了,调料有['辣椒', '酱油']

2.购物卡案例

小明单位发了30元的购物卡,小明到超市买三类洗化用品:洗发水15元、香皂2元、牙刷5元。要把30元正好花掉,有哪些购买组合?

a=30
n=a//15     #返回商的整数部分
for i in range(n,-1,-1):     #i=2,1,0
    m=(a-i*15)//5            #m=0,3,6
    for j in range(m,-1,-1): #j=0;  3,2,1,0;  6,5,4,3,2,1,0
        k=(a-i*15-j*5)//2
        if (a-i*15-j*5)%2==0:
            print('可选择的购买组合:\t\t购买洗发水 {} 瓶,香皂 {} 块,牙刷 {}个。'.format(i,j,k))

运行结果:

可选择的购买组合:		购买洗发水 2 瓶,香皂 0 块,牙刷 0个。
可选择的购买组合:		购买洗发水 1 瓶,香皂 3 块,牙刷 0个。
可选择的购买组合:		购买洗发水 1 瓶,香皂 1 块,牙刷 5个。
可选择的购买组合:		购买洗发水 0 瓶,香皂 6 块,牙刷 0个。
可选择的购买组合:		购买洗发水 0 瓶,香皂 4 块,牙刷 5个。
可选择的购买组合:		购买洗发水 0 瓶,香皂 2 块,牙刷 10个。
可选择的购买组合:		购买洗发水 0 瓶,香皂 0 块,牙刷 15个。

3.猜数游戏

简单猜数

首先自已定义一个变量,假如a = 50,然后提示让用户猜数字,如果用户猜的数字过大,就输出大了,如果猜的数字过小,就输出小了,直到用户猜对了,提示用户猜对了,并给出用户一共猜了多少次。

a=50
time=0
while 1:
    b = eval(input('输入猜的数字:'))
    time+=1
    if b>a:
        print('大了')
    elif b<a:
        print('小了')
    else:
        print('对了,猜了{}次'.format(time))
        break

增加难度1

上一题a是提前设好的,代码不修改的话,每次运行正确的数字总是50,现在我们需要将a设成随机的,这一次代码运行a是89,下次运行answer就变成另一个数字了(需要在上一题的基础上,再运用random库里的函数)

import random
a=random.randint(1,5)
time=0
while 1:
    b = eval(input('输入猜的数字:'))
    time+=1
    if b>a:
        print('大了')
    elif b<a:
        print('小了')
    else:
        print('对了,猜了{}次'.format(time))
        break

增加难度2

a依旧是随机的整数,然后由用户猜测a。如猜测的数大于a,则显示“High”,小于则显示“Low”,等于则显示“You won !”,游戏结束。用户最多可以猜4次,如果4次均未猜中,则显示“You lost !”,并给出正确答案,游戏结束。游戏结束后,询问用户是否继续游戏,选择“Y”则开始新的一轮游戏;选择“N”则退出游戏。

chose='y'
while chose=='Y'or chose=='y':
    import random
    a=random.randint(1,3)
    time=0
    while time<=3:
        b = eval(input('输入猜的数字:'))
        time+=1
        if b>a : print('大了')
        elif b<a : print('小了')
        else:
            print('win')
            break
    if time>3:
        if b != a:
            print('You lost')
        else:
            print('win')
    chose = input('请输入Y(y)继续进行游戏,N(n)退出游戏:')
    while chose != 'Y' and chose != 'y' and chose != 'N' and chose != 'n':
        print('输入有误,请重新输入:')
        chose = input()

使用函数:

chose = 'y'
while chose=='Y' or chose=='y':
    import random   #导入python提供的random库
    num = random.randint(1,100)
    #randint产生的随机数包含左右极限,即包含1和100;而randrange产生的随机数区间只包含左极限
    def judge(b):      #define定义一个judge函数
        if b == num:
            return 1
        else:
            return 0

    for i in range(1,5): #i=1,2,3,4
        b=eval(input('请输入您第{}次所猜的整数:'.format(i)))
        if judge(b)==1:
            print("You won !")
            break
        elif b > num:
            print("high")
        elif b < num:
            print("low")
    if judge(b)==0:
        print("You lost !")
    chose=input('请输入Y(y)继续进行游戏,N(n)退出游戏:')
    while chose != 'Y' and chose != 'y' and chose != 'N' and chose != 'n':
        print('输入有误,请重新输入Y(y)继续进行游戏,N(n)退出游戏:',end = '')
        #print默认是打印一行,结尾加换行。end=' '意思是末尾不换行,加空格
        chose=input()

输出:

请输入您第1次所猜的整数:50
You won !
请输入Y(y)继续进行游戏,N(n)退出游戏:y
请输入您第1次所猜的整数:10
low
请输入您第2次所猜的整数:30
low
请输入您第3次所猜的整数:50
high
请输入您第4次所猜的整数:45
high
You lost !
请输入Y(y)继续进行游戏,N(n)退出游戏:

4.篮球比赛案例

篮球比赛是高分的比赛,领先优势可能很快被反超。作为观众,希望能在球赛即将结束时,就提早知道领先是否不可超越。体育作家Bill James发明了一种算法,用于判断领先是否“安全”。

算法描述:

  • 获取领先的分数 ,减去3分;
  • 如果目前是领先队控球,则加0.5;否则减0.5(数字小于0则变成0);
  • 计算平方后的结果;
  • 如果得到的结果比当前比赛剩余时间的秒数大,则领先是“安全”的。

请编写程序实现上述算法的功能,并给出运行结果。

grade=eval(input('请输入领先分数:'))
time=eval(input('请输入剩余时间:'))
t=grade-3
w=input('目前是否为领先队控球(Y or N):')
if w == 'Y' or w == 'y':
    g=(t+0.5)**2  #“**”表示幂运算,例如“2**3”表示2的三次方
else:
    g=t-0.5
    if g<=0:
       g=0
    g=g**2
if g>time:
    print('领先是“安全”的')
else:
    print('领先是“不安全”的')

输出:

请输入领先分数:10
请输入剩余时间:9
目前是否为领先队控球(Y or N):y
领先是“安全”的

5.赶鸭子

一个人赶着鸭子去每个村庄卖,每经过一个村子卖去所赶鸭子的一半又一只。这样他经过了七个村子后还剩两只鸭子,问出发时共赶多少只鸭子?

要求:利用递归函数编程实现。

#递归的定义:函数自己调用自己的方式,称为递归。
def f(n):   #f(n)代表经过第n个村子之前,鸭子的总数
    if n == 8:
        return 2 #经过第8个村子之前,剩余2只
    else:
        sum = f(n+1)*2+2
        return sum
print( '一共有{}只鸭子'.format(f(1)) ) #将f(1)的值赋给{}中;f(1)代表在经过第一个村子之前鸭子的总数

输出:

一共有510只鸭子
  • 2
    点赞
  • 21
    收藏
    觉得还不错? 一键收藏
  • 5
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值