Python语言程序设计(笔记)

1、平方根的格式化
知识点:平方根计算

  • pow(a,0.5)[可以计算负数,结果为复数]
  • a**b

例题:
获得用户输入的一个整数a,计算a的平方根,保留小数点后3位,并打印输出。‪‬‪‬‪‬‪‬‪‬‮‬‭‬‪‬‪‬‪‬‪‬‪‬‪‬‮‬‫‬‮‬‪‬‪‬‪‬‪‬‪‬‮‬‪‬‫‬‪‬‪‬‪‬‪‬‪‬‮‬‫‬‪‬‪‬‪‬‪‬‪‬‪‬‮‬‪‬‫‬

输出结果采用宽度30个字符、右对齐输出、多余字符采用加号(+)填充。‪‬‪‬‪‬‪‬‪‬‮‬‭‬‪‬‪‬‪‬‪‬‪‬‪‬‮‬‫‬‮‬‪‬‪‬‪‬‪‬‪‬‮‬‪‬‫‬‪‬‪‬‪‬‪‬‪‬‮‬‫‬‪‬‪‬‪‬‪‬‪‬‪‬‮‬‪‬‫‬

如果结果超过30个字符,则以结果宽度为准。

我的答案:

a=eval(input())
    print("{0:+>30.3f}".format(pow(a,0.5)))

运行结果:

1、10
+++++++++++++++++++++++++3.162
2、-10
++++++++++++++++++0.000+3.162j

点评分析:

这是一个简单题,重点在于理解格式化输出的方法。

注意:如果平凡根后产生一个复数,由于复数的实部和虚部都是浮点数,.3f可以将实部和虚部分别取三位小数。

1.1、凯撒密码( 栅栏密码 )

plaincode=input("请输入明文:")
for p in plaincode:
    if ord("a")<=ord(p)<=ord("z"):
        print(chr(ord('a')+(ord(p)-ord('a')+3)%26),end="")
          #end="",是不想让【循环】输出换行。因为print自带换行。
    else:
          # %26,mod26是因为+3后可能超出范围,通过这个操作限定范围
        print(p,end="")

1.2、随机密码生成
描述
补充编程模板中代码,完成如下功能:‪‬‪‬‪‬‪‬‪‬‮‬‭‬‪‬‪‬‪‬‪‬‪‬‪‬‮‬‫‬‮‬‪‬‪‬‪‬‪‬‪‬‮‬‪‬‫‬‪‬‪‬‪‬‪‬‪‬‮‬‫‬‪‬‪‬‪‬‪‬‪‬‪‬‮‬‪‬‫‬

以整数17为随机数种子,获取用户输入整数N为长度,产生3个长度为N位的密码,密码的每位是一个数字。每个密码单独一行输出。‪‬‪‬‪‬‪‬‪‬‮‬‭‬‪‬‪‬‪‬‪‬‪‬‪‬‮‬‫‬‮‬‪‬‪‬‪‬‪‬‪‬‮‬‪‬‫‬‪‬‪‬‪‬‪‬‪‬‮‬‫‬‪‬‪‬‪‬‪‬‪‬‪‬‮‬‪‬‫‬

产生密码采用random.randint()函数。

建议答案:

import random

def mima(length):
    a=10**(length-1)
    b=10**length - 1
    return "{}".format(random.randint(a,b))  #居然可以return这个东西

length=eval(input())
random.seed(17)
for i in range(3):
    print(mima(length))

2、字符串分段组合
知识点:str.split("xxxxx"),返回一个 列表 ,由str中被 xxxxx 分隔的部分组成
例题:
获得输入的一个字符串s,以字符减号(-)分割s,将其中首尾两段用加号(+)组合后输出。

我的答案:

s=input()
for i in range(0,99991):
    if(s[i]=="-"):
        a=s[0:i]
        break
for j in range(1,99999):
    if(s[-j]=="-"):
        b=s[(-j)+1:-1]
        break
print("{}+{}{}".format(a,b,s[-1]))

运行结果:

1-2-3-4
1+4

建议答案:

s=input()
ls=s.split("-")
print("{}+{}".format(ls[0],ls[-1]))

运行结果:

1-2-3-4
1+4

3、四位玫瑰数
描述‪‬‪‬‪‬‪‬‪‬‮‬‭‬‪‬‪‬‪‬‪‬‪‬‪‬‮‬‫‬‮‬‪‬‪‬‪‬‪‬‪‬‮‬‪‬‫‬‪‬‪‬‪‬‪‬‪‬‮‬‫‬‪‬‪‬‪‬‪‬‪‬‪‬‮‬‪‬‫‬:

四位玫瑰数是4位数的自幂数。自幂数是指一个 n 位数,它的每个位上的数字的 n 次幂之和等于它本身。‪‬‪‬‪‬‪‬‪‬‮‬‭‬‪‬‪‬‪‬‪‬‪‬‪‬‮‬‫‬‮‬‪‬‪‬‪‬‪‬‪‬‮‬‪‬‫‬‪‬‪‬‪‬‪‬‪‬‮‬‫‬‪‬‪‬‪‬‪‬‪‬‪‬‮‬‪‬‫‬

例如:当n为3时,有1^3 + 5^3 + 3^3 = 153,153即是n为3时的一个自幂数,3位数的自幂数被称为水仙花数。‪‬‪‬‪‬‪‬‪‬‮‬‭‬‪‬‪‬‪‬‪‬‪‬‪‬‮‬‫‬‮‬‪‬‪‬‪‬‪‬‪‬‮‬‪‬‫‬‪‬‪‬‪‬‪‬‪‬‮‬‫‬‪‬‪‬‪‬‪‬‪‬‪‬‮‬‪‬‫‬

请输出所有4位数的四位玫瑰数,按照从小到大顺序,每个数字一行。 ‪‬‪‬‪‬‪‬‪‬‮‬‭‬‪‬‪‬‪‬‪‬‪‬‪‬‮‬‫‬‮‬‪‬‪‬‪‬‪‬‪‬‮‬‪‬‫‬‪‬‪‬‪‬‪‬‪‬‮‬‫‬‪‬‪‬‪‬‪‬‪‬‪‬‮‬‪‬‫‬

我的答案:

for i in range(1000,10000):
    a=i//1000
    b=(i%1000)//100
    c=((i%1000)%100)//10
    d=((i%1000)%100)%10
    if(a**4+b**4+c**4+d**4==i):
        print("{}\n".format(i))

建议答案:

s = ""
for i in range(1000, 10000):
    t = str(i)
    if pow(eval(t[0]),4) + pow(eval(t[1]),4) + pow(eval(t[2]),4) + pow(eval(t[3]),4) == i :
        print(i)

分析解释

1、print()本身就带有换行了
2、eval()评估函数,居然可以把数当作字符串处理,及其简单的得到这个数的个位、十位、百位、等等

4、100以内素数之和
描述
求100以内所有素数之和并输出。‪‬‪‬ ‪‬‪‬‪‬‮‬‭‬‪‬‪‬‪‬‪‬‪‬‪‬‮‬‫‬‮‬‪‬‪‬‪‬‪‬‪‬‮‬‪‬‫‬‪‬‪‬‪‬‪‬‪‬‮‬‫‬‪‬‪‬‪‬‪‬‪‬‪‬‮‬‪‬‫‬
素数指从大于1,且仅能被1和自己整除的整数。 ‪‬‪‬‪‬‪‬‪‬‮‬‭‬‪‬‪‬‪‬‪‬‪‬‪‬‮‬‫‬‮‬‪‬‪‬‪‬‪‬‪‬‮‬‪‬‫‬‪‬‪‬‪‬‪‬‪‬‮‬‫‬‪‬‪‬‪‬‪‬‪‬‪‬‮‬‪‬‫‬

提示:可以逐一判断100以内每个数是否为素数,然后求和。

我的答案:

在cpp里,是两个for循环,然后判断(2,n)之后,n是否还等于i

建议答案:

#Prime
def is_prime(n):
    for i in range(2,n):
        if n%i == 0:
            return False
    return True
sum = 0
for i in range(2,100):
    if is_prime(i):
        sum += i
print(sum)

5、连续素数(质数)计算

  • str字符串不能单独赋值,和cpp不一样,所以直接输出
  • python在使用变量前不需要定义,用的时候,进行什么样的操作,就可以看出是什么变量类型
  • 与cpp不同的是:python中 for一般是遍历,while一般限定循环次数。

描述
补充编程模板中代码,完成如下功能: ‪‬‪‬‪‬‪‬‪‬‮‬‭‬‪‬‪‬‪‬‪‬‪‬‪‬‮‬‫‬‮‬‪‬‪‬‪‬‪‬‪‬‮‬‪‬‫‬‪‬‪‬‪‬‪‬‪‬‮‬‫‬‪‬‪‬‪‬‪‬‪‬‪‬‮‬‪‬‫‬

获得用户输入数字N,计算并输出从N开始的5个质数,单行输出,质数间用逗号,分割。‪‬‪‬‪‬‪‬‪‬‮‬‭‬‪‬‪‬‪‬‪‬‪‬‪‬‮‬‫‬‮‬‪‬‪‬‪‬‪‬‪‬‮‬‪‬‫‬‪‬‪‬‪‬‪‬‪‬‮‬‫‬‪‬‪‬‪‬‪‬‪‬‪‬‮‬‪‬‫‬

注意:需要考虑用户输入的数字N可能是浮点数,应对输入取整数;最后一个输出后不用逗号。

我的答案:

建议答案:

def sushu(m): #判断素数的函数
    for i in range(2,m):
        if m%i == 0:
            return False
    return True  #注意缩进,是for循环完了还不满足,才return True

n=eval(input())
n_=int(n)+1   #把浮点数换成整数
count=5       #限定输出个数
while count>0: # count =5,4,3,2,1都可以循环,不就是循环5次嘛🐎
    if sushu(n_):
        if count>1: #这个东西是为了前4次输出有结尾的逗号,
            print(n_,end=",")
        else:
            print(n_,end="")
        count-=1  #注意缩进,不管啥,只要 if sushu()成立[是素数],都要把计数器减1
    n_+=1     #注意缩进,不管啥,每次搞完都要把 n_加1,方能遍历 【遍历】

6、七段数码管turtle绘制
知识点:

  • 函数定义与编写
  • return
  • 局部变量和全局变量
  • 参数传递问题

建议答案:

import turtle
def drawgap():      #画空白函数
    turtle.penup()
    turtle.fd(5)
def drawline(line): #画线条函数
    drawgap()
    turtle.pendown() if line else turtle.penup
    turtle.fd(20)
    drawgap()
    turtle.right(90)
def drawdigit(digit):  #画一个数码函数
    drawline(1) if digit in [2,3,4,5,6,8,9] else drawline(0)
    drawline(1) if digit in [0,1,3,4,5,6,7,8,9] else drawline(0)
    drawline(1) if digit in [0,2,3,5,6,8,9] else drawline(0)
    drawline(1) if digit in [0,2,6,8] else drawline(0)
    turtle.left(90)
    drawline(1) if digit in [0,4,5,6,8,9] else drawline(0)
    drawline(1) if digit in [0,2,3,5,6,7,8,9] else drawline(0)
    drawline(1) if digit in [0,1,2,3,4,7,8,9] else drawline(0)
    turtle.right(180)
    turtle.fd(10)
def drawdate(date):   #需要的日期函数
    for p in date:
        drawdigit(eval(p))
def main():           #主函数
    turtle.setup(800,250,200,300)
    turtle.pensize(5)
    turtle.penup()
    turtle.fd(-150)
    drawdate("20200117")
    turtle.hideturtle()
    turtle.done()
main()

7、汉诺塔问题
知识点:函数递归调用
三个部分

  • 函数+分支(if ->3 else ->2)
  • 链条
  • 基例

建议答案

count=0
def han(n,A,C,B):  #四个参数采用位置传递,代表的含义分别为:搬运圆盘编号,圆盘起始位置,圆盘目标位置,过渡位置
    global count
    if n==1:
        print("{}:{}->{}".format(1,A,C))
        count+=1
    else:          #递归链条表示:先把上面n-1个搬到过渡位置,剩的那个最大的放到目标位置,再把那n-1个放到目标位置
        han(n-1,A,B,C)
        print("{}:{}->{}".format(n,A,C))
        count+=1
        han(n-1,B,C,A)
print(han(3,"A","C","B"))  #以三个圆盘为例
print(count)

输出结果:

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

8、基本统计值计算
总和、平均数、中位数、方差

def getnum():
    ls=[]
    nums=input("请输入数字:")
    while nums !='':
        ls.append(eval(nums))
        nums=input("请输入数字:")
    return ls
def pingjun(ls):
    sum=0.0
    for p in ls:
        sum+=p
    return sum/len(ls)

def fangcha(ls,ave):
    sum=0.0
    for p in ls:
        sum+=(p-ave)**2
    return sum

def mid(ls):
    sorted(ls)
    size=len(ls)
    if size%2==0:
        med=(ls[size//2-1]+ls[size//2])/2
    else:
        med=ls[size//2]
    return med

n=getnum()

print("平均数:{}\n方差{}\n中位数{}\n".format(pingjun(n),fangcha(n,pingjun(n)),mid(n)))

posted @ 2020-02-18 22:03  wangenhui123  阅读(1452)  评论(0编辑  收藏  举报