python凯撒密码详解_Python基础题目集--课堂案例

这些案例均为在校期间学习《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()

9803ba78d47861d0fb8bcac319989490.png

效果如下:

2483f18183d129b7dc34ae35e7d54677.png

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)

效果:

d2a137b3e5dda59c87db8ac9c04bfddb.png

打印正向的星图:

def drawstar(n):
    for i in range(1,n+1):
        print((' * '*i).center(n*3))

drawstar(10)

效果如下:

6770c35bfd71235f49f748fd4a3b22cc.png

14.打印九九乘法表

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

效果:

3584c467723171e52d87792d1aa571ef.png

高级写法1:

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

效果:

196bac0159e95b2e42436408b87c194f.png

高级写法2:

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

ab22b112aee90ddf436c65dab5d431b1.png

高级写法3:

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

a9f0d2bb0737cd54d763a3e3f77c9137.png

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指数

bf6c52b34bae4e61b773f5ab859d581a.png
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))

运行效果:

870aa9fbb1160ea878d8e429ea9ab015.png

注意:身高单位为米,体重单位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))

运行效果:

56939c84447db381ac2a7d2b93d07345.png

de69d4f76a927b4af1bfee9faf77e2bb.png

优化后的代码:

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)

运行效果:

e70a35a88187bf3741b700840b9e2bcb.png

20.计算圆周率

9e4aae82b9ef568261217fb3dab96ea4.png
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