这些案例均为在校期间学习《python基础编程》课程的案例,适合初学者练手~
1.输入分数,返回等级
'''
分数区间为0~100,等级:A(>=90)、B(>=80)、C(>=70)、D(>=60)、E(<60)
'''
#写法1:
def grade_trans():#定义函数
grade = eval(input('输入成绩(0~100):'))
if grade >= 90 and grade < 101:
print('A')
elif grade >=80 and grade < 90:
print('B')
elif grade >=70 and grade < 80:
print('C')
elif grade >=60 and grade < 70:
print('D')
elif grade >= 0 and grade < 60:
print('E')
else:
print('输入有误!')
grade_trans()#调用函数
#写法2:
def trans(score):
if score >100 or score <0:
return 'Wrong score!'
elif score >=90:
return 'A'
elif score >=80:
return 'B'
elif score >=70:
return 'C'
elif score >=60:
return 'D'
else:
return 'E'
score = eval(input('请输入得分'))
level = trans(score)
print(level)
#写法3
def trans(score):
degree = 'DCBAAE'
if score >100 or score < 0:
return 'Wrong score!'
else:
index = (score - 60)//10#如果分数大于60,则index的值会大于0,以78为列,(78-60)//10=1,degree[index]表示取degree的第2个元素B
if index >=0:
return degree[index]
else:#即index小于0的情况,即不及格
return degree[-1]#返回E
score = eval(input('请输入得分'))
level = trans(score)
print(level)
2.摄氏度和华氏度转换
def TempTrans():
prompt = 1
while prompt == 1:
temperature = input('请输入一个温度,摄氏度用c结尾,华氏度以f结尾')
input_temp = eval(temperature[:-1])#注意,字符串取子集,左闭右开,即不会取到索引值为-1的字符。
if temperature[-1] in ('f','F'):
trans_temp = (input_temp - 32) / 1.8
print("转换后的温度值为{:.2f}C".format(trans_temp))
elif temperature[-1] in ('c','C'):
trans_temp = input_temp * 1.8 + 32
print("转换后的温度值为{:.2f}F".format(trans_temp))
else:
print('输入错误!请检查格式后再试')
prompt = eval(input('继续游戏请输入1,输入其他数字将退出程序'))
TempTrans()
3.绘制一条五彩蛇
import turtle as t
t.setup(800,350,200,200)
t.penup()#Pull the pen up -- no drawing when moving.
t.fd(-200)#基于现在的方向,反方向走200像素
t.pendown()#Pull the pen down -- drawing when moving.
t.pensize(25)
t.seth(-40)
colors = ["red","orange","yellow","green"]
for i in range(4):
t.pencolor(colors[i])
t.circle(40,80)#基于乌龟头现在的方向,在左侧绘制一个半径为40,弧度为80的弧形
t.circle(-40,80)#基于乌龟头现在的方向,在右侧绘制一个半径为40,弧度为80的弧形
t.pencolor('blue')
t.circle(40,40)
t.fd(40)
t.circle(16,180)
t.fd(25)
t.done()
4.绘制同切圆
import turtle as tl
tl.pensize(2)
tl.shape("turtle")
tl.color('red','yellow')#设置线和乌龟为红色,乌龟填充颜色为黄色
tl.circle(10)
tl.circle(40)
tl.circle(80)
tl.circle(160)
5.绘制等边三角形
import turtle as t
lens = 100
t.seth(60)
t.fd(lens)
t.seth(-60)
t.fd(lens)
t.seth(180)
t.fd(lens)
t.done()
6.绘制一个Z字形
import turtle as t
t.seth(0.0)#设置乌龟的头的朝向为0°方向,也是默认方向。seth是set head的简写
t.fd(150)#基于现在的方向,前进150像素
t.right(135)#基于现在的方向,右转135°
t.fd(300)
t.left(135)
t.fd(150)
t.done()
7.绘制五角星
import turtle as tl
tl.pensize(2)
tl.shape("turtle")
tl.color('red','yellow')#设置线和乌龟为红色,乌龟填充颜色为黄色
tl.begin_fill()#开始填充(图像中间部分)
for i in range(5):
tl.fd(200)#向前走200
tl.rt(144)#Turn turtle right by angle units,向右转144度
tl.end_fill()#结束填充
8.绘制7段数码管
import turtle as t
def drawline(draw):
if draw:
t.pendown()#下笔
else:
t.penup()#提笔
t.fd(40)#不论是下笔还是提笔,turtle都会向前走40个像素,即单段数码管的长度为40
t.right(90)#turtle走一段,就向右转90度
def drawdigit(digit):#指定哪些段显示和不显示
drawline(True) if digit in [2,3,4,5,6,8,9] else drawline(False)#第1条线
drawline(True) if digit in [0,1, 3, 4, 5, 6, 7,8, 9] else drawline(False)#第2条线
drawline(True) if digit in [0,2, 3, 5, 6, 8, 9] else drawline(False)#第5条线
drawline(True) if digit in [0,2, 6, 8] else drawline(False)#第4条线
t.left(90)#绘制完第4条线后,drawline函数让turtle向右转了90度(right(90)),但是,第5条线和第4条线是同方向,因此,需要向左转90度,转回来!
drawline(True) if digit in [0, 4, 5, 6, 8, 9] else drawline(False)#第5条线
drawline(True) if digit in [0,2, 3, 5, 6, 7,8, 9] else drawline(False)#第6条线
drawline(True) if digit in [0,1,2, 3, 4, 7, 8, 9] else drawline(False)#第7条线
t.left(180)
'''执行完上一步后,第一个数字就绘制完成了!
但是,在绘制第7条线时drawline函数让turtle向右转了90度(right(90)),此时乌龟头超左。
但是,接下来要绘制新的数字,需要留一定的间隔(20像素),所以要向右走20像素,需要乌龟头朝右,所以要left(180)
'''
t.penup()#提笔
t.fd(20)#沿着笔的方向前进20,绘制下一个数字
def drawdate(date):
for i in date:
drawdigit(eval(i))
def main():
t.setup(800,350,200,200)#设置画布大小
t.penup()
t.fd(-300)#画笔默认的初始位置为画布中心,fd(-300)表示将画笔向左边移动300个像素
t.pensize(5)#设置笔的粗细
drawdate('0123456789')#要绘制的数字
t.hideturtle()#表示绘制完成后,隐藏乌龟
t.done()#一定要执行done()函数!否则会一致转圈圈……
main()

效果如下:

8.输入两边长度和两边的夹角度数,求第3边长度
import math
x= input('请输入两个边长和角度,并用英文逗号隔开:').split(',')#split运行后的结果是一个list
a,b,theta = map(float,x)#将float函数应用到x列表中的每个元素
c = math.sqrt(a**2 + b**2 - 2*a*b*math.cos(theta*math.pi/180))#根据数学公式求第三边
print('c=',c)
9.输入一个三位数,计算出百位数、十位数、个位数
#方法1:
x = input('请输入一个三位数:')
a = int(x[0])
b = int(x[1])
c = int(x[2])
print('百位数:{},十位数:{},个位数:{}'.format(a,b,c))
#方法2:
x = input('请输入一个三位数:')
a,b,c = map(int,x)#input的结果为字符串,是可迭代对象
print('百位数:{},十位数:{},个位数:{}'.format(a,b,c))
10.明文和密文转换(凯撒密码)
#基础知识:取余数
print(divmod(29,26))
print(divmod(29,26)[1])
#明文和密文转换:如果输入abc,则转换为def。如果输入xyz,则转换为abc
txt = input('请输入明文')
for p in txt:
if 'a'<= p <= 'z':
print(chr(divmod(ord(p)-ord('a')+3,26)[1]+ord('a')),end='')
elif 'A' <= p <= 'Z':
print(chr(divmod(ord(p)-ord('A')+3,26)[1]+ord('A')),end='')
else:
print(p,end='')#对于非字母的字符,则显示其原来的样子
#密文还原为明文
txt = input('请输入密文')
for p in txt:
if 'a'<= p <= 'z':
print(chr(divmod(ord(p)-ord('a')-3,26)[1]+ord('a')),end='')
elif 'A' <= p <= 'Z':
print(chr(divmod(ord(p)-ord('A')-3,26)[1]+ord('A')),end='')
else:
print(p,end='')#对于非字母的字符,则显示其原来的样子
11.输出1~100之间,能被7整除,但不能被5整除的全部整数
#解题:x能被y整除,意味着x除以y的余数为0,即x%y==0
for i in range(1,101):
if i%7 == 0 and i%5 != 0:
print(i,end=',')
12.求1+2+3+……+100
#方法1:
s = 0
for i in range(1,101):
s += i
print(s)
#结果:5050
#方法2:
print(sum(range(1,101)))
13.绘制一个星图
def drawstar(n):
for i in range(n,0,-1):#range(n,0,-1)表示从n(n>0)到0,以-1为步长生成一个递减的序列,如n=5,将生成5,4,3,2,1,不含0.
print((' * ' * i).center(n*4))#center(width, fillchar=' ', /),修改n*4为n*8,会发现绘制的图形整体向中间移动了,因为图形的width(宽度)增加了,所以中心位置也会变化。
drawstar(10)
效果:

打印正向的星图:
def drawstar(n):
for i in range(1,n+1):
print((' * '*i).center(n*3))
drawstar(10)
效果如下:

14.打印九九乘法表
基础写法:
for i in range(1,10):
for j in range(1,10):
print('{}*{} = {}'.format(i,j,i*j),end=',')#{}为占位符,也称为槽,槽中的值与format()函数中的数值一一对应
print()#打印空行
效果:

高级写法1:
for i in range(1,10):
for j in range(1,i+1):
print('{}*{} = {}'.format(i,j,i*j),end=',')
print()#打印空行
效果:

高级写法2:
for i in range(1,10):
for j in range(i,10):
print('{}*{} = {}'.format(i,j,i*j),end=',')
print()#打印空行

高级写法3:
for i in range(1,10):
for j in range(9,i-1,-1):
print('{}*{} = {}'.format(i,j,i*j),end=',')
print()#打印空行

15.多层嵌套:百元买百鸡问题
公鸡5元/只,母鸡3元/只,小鸡1元/只,现有100元,想买100只鸡,共有多少种买法?
for x in range(21):#公鸡20元/只,100元最多买20只
for y in range(34):#母鸡3元/只,100元最多买33只
z = 100 - x - y#小鸡数是买完公鸡、母鸡剩下的数量
if (z%3 == 0 and 5*x+3*y+z//3 == 100):
print('公鸡',x,'母鸡',y,'小鸡',z)
结果:
公鸡 0 母鸡 25 小鸡 75
公鸡 4 母鸡 18 小鸡 78
公鸡 8 母鸡 11 小鸡 81
公鸡 12 母鸡 4 小鸡 84
16.break和continue效果对比
(1)练习1
#continue语句结束本层本次循环,不结束所属循环层的其他循环
for i in range(10):
if i%2 == 1:
continue
print(i)
#只要检测到一个奇数,就跳过该奇数,然后判断下一个数是否为奇数,最终会打印所有的偶数
#结果:
0
2
4
6
8
#break语句,结束本循环层全部循环
for i in range(10):
if i%2 == 1:
break
print(i)
#只要检测到一个奇数,就跳出for循环,最终只打印了0
(2)练习2
for s in 'BIT':
for i in range(10):
if s == 'I':
break
print(s, end='')
#结果:BBBBBBBBBBTTTTTTTTTT
#说明:先取出‘B’,打印10次B,然后取出‘I’,if s == 'I'为真,则执行break语句,break的所属循环层为:for i in range(10),因此,当s=='I'时,程序跳出for i in range(10),但for s in 'BIT'继续运行,继续取s=='T'并打印10次T
for s in 'BIT':
if s == 'I':
break
print(s,end='')
#结果:B
#说明:先取出‘B’,打印1次B,然后取出‘I’,if s == 'I'为真,则执行break语句,break的所属循环层为:for s in 'BIT',因此,当s=='I'时,跳出for s in 'BIT',那么整个循环都结束了,不会打印T
17.查看BMI指数

height,weight = eval(input('请分别输入身高,体重【使用英文逗号分隔】:'))
BMI = weight / pow(height,2)
WHO = ''#指标初始化
CHINA = ''#指标初始化
#分割点:30,28,25,24,18.5
if BMI >= 30:
WHO = '肥胖'
CHINA = '肥胖'
elif BMI >= 28:
WHO = '偏胖'
CHINA = '肥胖'
elif BMI >= 25:
WHO = '偏胖'
CHINA = '偏胖'
elif BMI >= 24:
WHO = '正常'
CHINA = '偏胖'
elif BMI >= 18.5:
WHO = '正常'
CHINA = '正常'
else:
WHO = '偏瘦'
print('根据国际卫生组织标准,您的体重质量指数为:{}n根据国内标准,您的体重质量指数为:{}'.format(WHO,CHINA))
运行效果:

注意:身高单位为米,体重单位kg。n为换行符。
18.判断输入年份是否为闰年
闰年判断标准:①能被400整除的是闰年 ②能被4整除,且不能被100整除的也是闰年
year = eval(input('请输入一个四位数年份:'))
if year%400 == 0:
print('{}是闰年'.format(year))
elif year%4 == 0 and year%100 != 0:
print('{}是闰年'.format(year))
else:
print('{}是平年'.format(year))
运行效果:


优化后的代码:
year = eval(input('请输入一个四位数年份:'))
if year%400 == 0 or(year%4 == 0 and year%100 != 0):
print('{}是闰年'.format(year))
else:
print('{}是平年'.format(year))
#上述需求也可以通过python自带的日历满足:
import calendar
calendar.isleap(2012)#isleap判断是否闰年,返回True表示是闰年
19.分段函数
x = eval(input('请输入一个数:'))
y = 0
if x >= 20:
y = 0
elif x >= 10:
y = 0.5*x-2
elif x >= 5:
y = 3*x-5
elif y >= 0:
y = x
else:
y = 0
print(y)
运行效果:

20.计算圆周率

lst = []
for i in range(10000):
x = pow(16,-i)*(4/(8*i+1)-2/(8*i+4)-1/(8*i+5)-1/(8*i+6))
lst.append(x)
pi = sum(lst)
print(pi)
#结果:3.141592653589793
21.找出100以内的奇数并求和
写法1:
lst = []
for i in range(101):
if i%2 != 0:
lst.append(i)
result = sum(lst)
print(result)
#结果:2500
写法2:
x = 0
for i in range(101):
if i%2 != 0:
x += i
print(x)
#结果:2500
22.输入成绩并计算均值
numbers = []#存储下面输入的成绩
while True:
x = input('请输入一个成绩:')
try:
numbers.append(float(x))
except:
print('非法输入')
while True:
flag = input('继续输入成绩吗?【yes/no】')
if flag.lower() not in ('yes','no'):
print('只能输入yes或no')
else:
break#输入的是yes或no就跳出本层循环(第二个while True循环层),进入第一个while True循环
if flag.lower() == 'no':
break#如果输入的是no就跳出本层循环(第一个while True循环),结束输入。如果输入的是yes,while True会自动运行
print(sum(numbers)/len(numbers))#计算输入成绩的均值
对上述程序执行过程::
①创建列表变量numbers ,用来存储输入的成绩。
②while True表示条件恒为真,则进入第一个while True后续代码段。
③ x = input('请输入一个成绩:'):用户输入一个成绩,并赋值给x,此时x为字符串格式。
④try:
numbers.append(float(x))
except:
print('非法输入')
检查输入的是否为数字,如果是数字,则可以正常执行numbers.append(float(x)),即将输入的数字变成浮点型,并追加(append)到numbers列表中。否则,print('非法输入')。
⑤while True表示条件恒为真,继续进入第二个while True后续代码段。
⑥flag = input('继续输入成绩吗?【yes/no】')
if flag.lower() not in ('yes','no'):
print('只能输入yes或no')
else:
break
询问是否继续输入成绩,用户输入的内容赋值给变量flag,然后flag.lower()将用户输入的内容转换为小写状态,并用if语句检查用户输入的是否为yes和no。
if flag.lower() not in ('yes','no'):
print('只能输入yes或no')
表示如果用户输入的内容不是yes和no,则告知用户,只能输入yes和no。
else:
break
表示如果用户输入的是yes或no,则跳出该循环层(注意!该循环层是指第二个while True循环层。),继续运行下一个代码段。
⑦如果用户输入的是yes或no,则跳出第二个while True循环层。继续运行下面的代码:
if flag.lower() == 'no':
break
该代码段表示如果用户输入的内容(flag)是no,那么就跳出该循环层,注意!该循环层是指第一个while True循环层。跳出了第一个while True循环层后,则应该执行print(sum(numbers)/len(numbers)),即计算输入成绩的均值。
换言之,如果用户输入的flag是yes,那么if flag.lower() == 'no':这个条件就不成立,就不会执行后面的break命令,程序会自动运行第一层while True。
所以,在使用while True的程序中,一定要有一个带break语句的条件判断语句来跳出循环层,否则会无限循环,即发生死循环。
23.生成斐波拉契序列
def fib(n):
a,b = 1,1
while a<n:
print(a,end=',')
a,b = b,a+b
print()
#注意,定义的函数可以没有return
fib(100)#生成100以内的斐波拉契序列
#1,1,2,3,5,8,13,21,34,55,89,
24.定义函数,设置参数默认值
def dup(str,times=2):
print(str*times)
dup(str='knock-')#times使用默认值2
#结果:knock-knock-
dup(str='knock-',times=4)
#结果:knock-knock-knock-knock-
25.定义的函数可以没有参数,也没有return
def foo():
print('wow!')
foo()
#结果:wow!
26.定义函数,含多个参数
def vfunc(a,*b):
'''
:param a:
:param b: 可变参数,可以传入多个值,多个值会组成一个元组
:return: 实现参数a与参数b的求和
'''
print(type(b))#<class 'tuple'>
for n in b:
a+=n
return a
vfunc(1,2,3)#a=1,b=(2,3)
#结果:6
*b可以改为*m、*h……
27.定义函数,返回多个值,返回的多个值是一个元组
def fun(x):
a = x+1
b = x-1
return a,b
r = fun(10)
print(r)
#结果:(11, 9)
a,b = fun(10)
print(a,b)
#结果:11,9
28.lambda函数
lambda函数特征:函数名fun和存储函数运算结果的变量名fun一体化
fun = lambda x:x**2
fun(4)
#结果:16
#注释:x为变量参数,x**2是需要对x变量进行的运算
#lambda函数可以没有变量参数
fun = lambda : 'Hello~'
fun()
#结果:Hello~
29.求10的阶乘
#求10的阶乘-法1
def fact(n):
r = 1
while n >=1:
r = r*n
n = n-1
return r
print(fact(10))
#结果:3628800
#求10的阶乘-法2
def fact(n):
r=1
for i in range(1,n+1):
r = r*i
return r
print(fact(10))
#结果:3628800
#求10的阶乘-法3:基于递归的方法
def fact(n):
r = 1
if n==0:
r = 1
return r
else:
r = n*fact(n-1)
return r
print(fact(10))
#结果:3628800
30.求sin(x)在0-2pi的面积
import math
import numpy as np
width = 0.001
x = np.arange(0,math.pi,0.001)
hight = []
for i in x:
h = math.sin(i)
hight.append(h)
def squre(y,x=0.001):
result = []
for i in range(len(y)):
h = y[i]
s = x*h
result.append(s)
return sum(result)
squre(hight)
#0到2pi的面积
S = 2*squre(hight)
print(S)
31.有30人在一家饭店用餐,其中有男人、女人、小孩。每个男人花3元,每个女人花2元,每个小孩花1元,一共花了50元。问男人、女人、小孩各有多少人?
for x in range(1,16):#要保障至少有1个男人,且保证至少有1个女人和1个小孩,因此男人最多15人
for y in range(1,23):#要保证至少有1个男人,有1小孩,所以女人最多22人
z = 30 - x - y#小孩数是余下的数量
if (3*x+2*y+z == 50):
print('男人',x,'女人',y,'小孩',z)
结果:
男人 1 女人 18 小孩 11
男人 2 女人 16 小孩 12
男人 3 女人 14 小孩 13
男人 4 女人 12 小孩 14
男人 5 女人 10 小孩 15
男人 6 女人 8 小孩 16
男人 7 女人 6 小孩 17
男人 8 女人 4 小孩 18
男人 9 女人 2 小孩 19