python 练习(更新)

1.将华氏温度转化成摄氏温度。

#F = 1.8C + 32

我的代码

f=float(input("Give me a temperature with Fahrenheit:"))
c = (f - 32) / 1.8
print("The temperature with Celsius  is %0.1f."%c)

别人的代码

f = float(input('请输入华氏温度: '))
c = (f - 32) / 1.8
print('%.1f华氏度 = %.1f摄氏度' % (f, c))

点评:大体一致,不过别人的有点在于print的时候给出了两个值作对比,值得借鉴。

2.输入半径给出圆的周长和面积

#圆的周长公式:c=2πr
#圆的面积公式:s=πr**2

我的代码

import math
r=float(input("请输入圆的半径:"))
P=math.pi
C=2*P*r
S=P*(r**2)

print("该圆的周长为:%0.1f"%C)
print("该圆的面积为:%0.1f"%S)

别人的代码

import math

radius = float(input('请输入圆的半径: '))
perimeter = 2 * math.pi * radius
area = math.pi * radius * radius
print('周长: %.2f' % perimeter)
print('面积: %.2f' % area)

点评:除了我先把π赋值给了一个变量之外,基本一致。

3.输入年份判断是不是闰年

#输入年份 如果是闰年输出True 否则输出False
#普通闰年:能被4整除但不能被100整除的年份为普通闰年
#世纪闰年:能被400整除的为世纪闰年

我的代码

def judgment():
    y = int(input("请输入一个年份:"))
    if (y%4==0) and (y%100!=0):
        return True
    elif y%400==0:
        return True
    else:
        return False

print(judgment())

别人的代码

year = int(input('请输入年份: '))
# 如果代码太长写成一行不便于阅读 可以使用\或()折行
is_leap = (year % 4 == 0 and year % 100 != 0 or
           year % 400 == 0)
print(is_leap)

点评:别人的代码比较简洁,直接利用布尔逻辑实现,比我的代码简洁。

4.英制单位与公制单位互换

#英制单位英寸和公制单位厘米互换
#1英寸(in)=2.54厘米(cm)

我的代码

while True:
    a = input("请保留一位小数且带单位输入英寸或是厘米,例如5.6in或5.6cm:")
    if "in" in a:
        num=float(a.strip("in"))
        c=num/2.54
        print("您输入的%.1f英寸等于%.1f厘米"%(num,c))
        break
    elif "cm" in a:
        num=float(a.strip("cm"))
        i=num*2.54
        print("您输入的%.1f厘米等于%.1f英寸" % (num,i))
        break
    else:
        continue

别人的代码:

value = float(input('请输入长度: '))
unit = input('请输入单位: ')
if unit == 'in' or unit == '英寸':
    print('%f英寸 = %f厘米' % (value, value * 2.54))
elif unit == 'cm' or unit == '厘米':
    print('%f厘米 = %f英寸' % (value, value / 2.54))
else:
    print('请输入有效的单位')

点评:
虽然比我的代码简洁,但是我的代码功能更多一些,少了一个变量且规定了输入格式,循环可以让用户在得到自己想要的结果时结束而不用再运行一遍程序,利用字符串操作的strip( )函数,见仁见智吧。

5.掷骰子决定做什么

我的代码:

from random import randint

print("开始掷骰子了")
num=randint(1,6)
print("你掷出的是%d"%num)
if num==1:
    print("看文献")
elif num==2:
    print("建模")
elif num==3:
    print("处理数据")
elif num==4:
    print("训练模型")
elif num==5:
    print("看Github")
else:
    print("搞学习")

别人的代码

from random import randint

face = randint(1, 6)
if face == 1:
    result = '唱首歌'
elif face == 2:
    result = '跳个舞'
elif face == 3:
    result = '学狗叫'
elif face == 4:
    result = '做俯卧撑'
elif face == 5:
    result = '念绕口令'
else:
    result = '讲冷笑话'
print(result)

点评:科研狗伤不起。

6.百分制成绩转等级制

#百分制成绩转等级制成绩
#90分以上 --> A
#80分~89分 --> B
#70分~79分 --> C
#60分~69分 --> D
#60分以下 --> E

我的代码

a=int(input("多少分儿?"))

if a>=90:
    print("A")
elif a>=80 and a<90:
    print("B")
elif a>=70 and a<80:
    print("C")
elif a>=60 and a<70:
    print("D")
elif a>=0 and a<60:
    print("E")
else:
    print("憋瞎写")

别人的代码

score = float(input('请输入成绩: '))
if score >= 90:
    grade = 'A'
elif score >= 80:
    grade = 'B'
elif score >= 70:
    grade = 'C'
elif score >= 60:
    grade = 'D'
else:
    grade = 'E'
print('对应的等级是:', grade)

点评:别人用了两个变量,但只调用了一次print( ),还是值得我学习的。

7.输入三条边长如果能构成三角形就计算周长和面积

#三角形两边之和大于第三边
#周长公式C=a+b+c
#面积公式S=1/4sqrt[(a+b+c)(a+b-c)(a+c-b)(b+c-a)]

我的代码

while True:
    a,b,c=map(float,(input("输入三角形三条边用空格隔开:").split()))
    if a+b>c and a+c>b and b+c>a:
        C=a+b+c
        S=(((a+b+c)*(a+b-c)*(a+c-b)*(b+c-a))**0.5)*0.25
        print("该三角形的周长是%.1f且该三角形的面积是%.1f"%(C,S))
        break
    else:
        print("不能构成三角形")
        continue

别人的代码

import math

a = float(input('a = '))
b = float(input('b = '))
c = float(input('c = '))
if a + b > c and a + c > b and b + c > a:
    print('周长: %f' % (a + b + c))
    p = (a + b + c) / 2
    area = math.sqrt(p * (p - a) * (p - b) * (p - c))
    print('面积: %f' % (area))
else:
    print('不能构成三角形')

点评:我用了一个map( ),split( )=和input( )结合的同时给多个变量输入的技巧,用循环避免再次打开程序,但是是用幂函数写的开方,还是应该用math模块的开方会好一点。

8.输入一个数判断是不是素数

#素数定义为在大于1的自然数中,除了1和它本身以外不再有其他因数。

我的代码:

while True:
    num = int(input("请给我一个大于1的自然数:"))
    if num < 1:
         print("请重新输入")
         continue
    else:
        break

yinzi_list=[]
for i in range(2, num):
    if num % i == 0:
        yinzi_list.append(i)

if yinzi_list==[]:
    print("该数为素数")
else:
    yinzi=",".join(map(str,yinzi_list))
    print("该数不是一个素数且该数的因子有:%s"%yinzi)

别人的代码1:

a = int(input(">>>>"))
for i in range(2,a):
    if(a%i==0):
        print("No")
        break
else:
    print("Yes")

别人的代码2:

from math import sqrt

num = int(input('请输入一个正整数: '))
end = int(sqrt(num))
is_prime = True
for x in range(2, end + 1):
    if num % x == 0:
        is_prime = False
        break
if is_prime and num != 1:
    print('%d是素数' % num)
else:
    print('%d不是素数' % num)

点评:之所以放两个代码主要是有两个实现的途径:
(1)任意输入一个数,利用for循环遍历2~a-1的数,用a除以遍历的数i,如果有任意一个数可以整除a,则打印No,即不是素数,否则便是素数
(2)利用初等数论里面的一个整数的因子,一个因子必定大于或等于整数的平方根,一个必定小于或者等于次整数的平方根
我的代码跟第一个实现的方式一样,只不过加入了显示因子的功能,实测九位数以内还是比较快的。

9.输入两个正整数,计算最大公约数和最小公倍数

我的代码

from math import gcd

a,b=map(int,input("按顺序给我两个正整数用空号隔开:").split())

gys=gcd(a,b)
print("最大公约数为%d"%gys)

for i in (b,a*b):
    if i%a==0 and i%b==0:
        print("最小公倍数为%d"%i)
        break
        

别人的代码

x = int(input('x = '))
y = int(input('y = '))
if x > y:
    x, y = y, x
for factor in range(x, 0, -1):
    if x % factor == 0 and y % factor == 0:
        print('%d和%d的最大公约数是%d' % (x, y, factor))
        print('%d和%d的最小公倍数是%d' % (x, y, x * y // factor))
        break

点评:我用了一下math模块里的最大公约数函数,这里他算出最大公约数之后直接算出最小公倍数,这里我没想到这一层。

10.打印三角形图案

打印三种三角形图案

*
**
***
****
   *
  **
 ***
****
   *   
  ***  
 ***** 
*******

我的代码

h=int(input("请输入行数:"))

for i in range(1,h+1):
    g=i*"*"
    print(g)


for i in range(1,h+1):
    g=i*"*"
    print(g.rjust(h))


for i in range(1,h+1):
    g=(2*i-1)*"*"
    print(g.center(2*h-1))

别人的代码

row = int(input('请输入行数: '))
for i in range(row):
    for _ in range(i + 1):
        print('*', end='')
    print()


for i in range(row):
    for j in range(row):
        if j < row - i - 1:
            print(' ', end='')
        else:
            print('*', end='')
    print()

for i in range(row):
    for _ in range(row - i - 1):
        print(' ', end='')
    for _ in range(2 * i + 1):
        print('*', end='')
    print()

点评:我用的字符串操作符,第一个是直接利用字符串结尾默认是换行符,别人是将字符串结尾默认的换行符替换为空,见仁见智吧。

11.寻找水仙花数

#水仙花数是指一个 3 位数,它的每个位上的数字的 3次幂之和等于它本身

我的代码:

num=[]
for a in range(1,10):
    for b in range(10):
        for c in range(10):
            if a**3+b**3+c**3==100*a+10*b+c:
                num.append(100*a+10*b+c)

s=",".join(map(str,num))

print("水仙花数有%s"%s)

别人的代码:

for i in range(100,1000):
    if i ==sum(int(c)**3 for c in str(i)):
        print (i)

点评:别人的没有考虑个十百位数,直接找三位数,然后在字符串中把每位数相加。不过这个第二个for玄幻的用法可以学习一下。

12.完美数

#完全数(Perfect number),又称完美数或完备数,是一些特殊的自然数。它所有的真因子(即除了自身以外的约数)的和(即因子函数),恰好等于它本身。
#如果一个数恰好等于它的因子之和,则称该数为“完全数”。
#第一个完全数是6,第二个完全数是28,第三个完全数是496,后面的完全数还有8128、33550336等等。

我的代码

max=int(input("设定一个范围,以正整数的形式给出"))
print("在这个范围内完全数有:")
for i in range(1,max+1):
    sum=0
    for j in range(1,i):
        if i%j==0:
            sum+=j
    if i==sum:
        print(i)

别人的代码

for number in range(2,1001):
    tempList = []    
    myTemp=number
    for i in range(1,number):
            if number % i == 0:                
                tempList.append(i)
                myTemp-=i
     
    if myTemp == 0:
        print (number)
        for i in range(len(tempList)-1):
            print(tempList[i],end=' ')
        print (tempList[-1])
        print('###########')

点评:别人判定的方法是用数减去因数,如果为零说明是完全数。我的就是比较常规的思路了,稍微改进一下也可以把因数都打出来。

13. 百钱百鸡

#鸡翁一值钱五,鸡母一值钱三,鸡雏三值钱一。百钱买百鸡,问鸡翁、鸡母、鸡雏各几何?

我的代码

for a in range(1,101):
    for b in range(1,101):
        for c in range(1,101):
            if 5*a+3*b+c/3==100 and a+b+c==100:
                print("鸡翁为%d,鸡母为%d,鸡雏为%d"%(a,b,c))

别人的代码

for big in range(1,100):
    for middle in range(1,100):
        for small in range(1,100):
            if big * 3 + middle * 2 + small / 3 == 100:
               if big + middle + small == 100:
                print(“大鸡的只数为”,big)
                print(“中鸡的只数为”,middle)
                print(“小鸡的只数为”,small)

点评:思路一致不过我的代码计算速度快一些。时间测试的代码可以学习一下。
有人做过这两类代码测试:

import time
start = time.clock()
for cock in range(1,101):   # 公鸡
    for hen in range(1,101):  #母鸡
        for chick in range(1,101):  #小鸡
            if cock * 5 + hen * 3 + chick == 100 and cock + hen + chick * 3 == 100:
                pass
end = time.clock()
time1 = end - start
print("方案一所花时间",time1)
start = time.clock()
for cock in range(5,101,5):   # 公鸡
    for hen in range(3,101 - cock,3):  #母鸡
        for chick in range(1,101 - cock - hen): #小鸡
            if cock // 5 + hen // 3 + chick * 3 == 100 and cock + hen + chick == 100:
               pass

end = time.clock()
time2 = end - start
print("方案二所花时间",time2)
print("方案一所花时间是方案二的%d倍"%(time1 // time2))

执行结果

输出: 
方案一所花时间 0.32884016429388524 
方案二所花时间 0.0030011999201297046 
方案一所花时间是方案二的109倍

14.斐波那契数列

因数学家列昂纳多·斐波那契(Leonardoda Fibonacci)以兔子繁殖为例子而引入,故又称为“兔子数列”,指的是这样一个数列:1、1、2、3、5、8、13、21、34、……在数学上,斐波纳契数列以如下被以递推的方法定义:F(1)=1,F(2)=1, F(n)=F(n-1)+F(n-2)(n>=3,n∈N*)

我这里没有想出来,找了大佬的代码研读了一番,每个代码都来点评一下。

def rabbit1(n):
    f1=1
    f2=1
    if (n==1 or n==2):
        return 1
    else:
        for i in range(3,n+1):
            f1,f2=f2,f1+f2
        return f2

点评:用for循环,并利用迭代赋值的方式。

def rabbit2(n):
    if (n==1 or n==2):
        return 1
    else:
        return rabbit2(n-1)+rabbit2(n-2)

点评:递归算法,之后会写一篇总结递归算法的文章。

def rabbit3(n,rabbits={1:1,2:1}):
    if n in rabbits:
        return rabbits[n]
    res=rabbit3(n-1)+rabbit3(n-2)
    rabbits[n]=res
    return res

点评:把算过的都放在字典里,进行递归计算的时候直接存取,不用重新计算。

def iteration_yield(it):
    flag = True
    # a=0
    while flag:
        try:
            print(next(it), end=" ")
        except StopIteration:
            # sys.exit()
            flag = False
    # print(a)


def fibonacci(n):
    a, b, counter = 0, 1, 0
    while True:
        if counter > n:
            return
        yield a
        a, b = b, a + b
        print('%d,%d' % (a, b))
        counter += 1
f = fibonacci(1000)
iteration_yield(f)

点评:迭代器和生成器,之后会写文章总结。

15 实现判断一个数是不是回文数的函数

我的代码:

def huiwen():
    while True:
        num=list(input("给我一个数字"))
        if num==list(reversed(num)):
            print("该数为回文数")
            break
        else:
            print("该数不是回文数,再试一把?")
            continue

huiwen()

别人的代码:

def is_palindrome(num):
    temp = num
    total = 0
    while temp > 0:
        total = total * 10 + temp % 10
        temp //= 10
    return total == num

点评:别人的代码原理是对数取余再整除,比如‘12321’,我们首先得到1,然后是2,接下来将1乘以10加上2就是12,正好等于开头的数字12。我的是将它当做字符串处理,用户用起来可能相对麻烦一些。

16.

评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值