python入门(第6节实践课---构造函数解决问题)

版权声明:本文为博主原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。
本文链接: https://blog.csdn.net/jjsjsjjdj/article/details/102640251

第一题

1 编写一个函数,iszhishu(i),如果i为质数,则返回True否则返回false
用这个函数 求100到10000的所有质数,返回列表,并且求它的和
要提交的数据是: 你学号的最后三位,例如是099,则求99(包括)到10000的
所有质数的和,作为第一行数据

def iszhishu(x):
    for i in range(142,10000):
        flag=1
        for j in range(2,i):
            if i%j==0:
                flag=0
                break     
                
        if flag==1:
            x.append(i)
    return x


x=[]  
x=iszhishu(x)
print(sum(x))

第二题

2 编写一个函数gongbei(x),其中x为一个列表,返回x中数据的最小公倍数,并用这个
函数 用你的学号作为x 求x,x+100,x+200,x+1000,x+2000 这5个数的最小公倍数
作为要提交文件的第二行数据

1.常规解法

def demo(m,n):
    if m>n:
        m,n=n,m
    p = m*n
    while m!=0:
        r=n%m
        n=m
        m=r
    return p//n

def gongbei(x):
    i=1
    a=x[0]
    while(i<len(x)):
        b=x[i]
        a=demo(a,b)
        i=i+1    
    return a
        
x=1750300142
x=[x,x+100,x+200,x+1000,x+2000]
p=gongbei(x)
print(p)

2.优化解法:利用math中封装好gcd函数,直接求公约数

import math

#两个数的公倍数
def gongbei(a,b):
    gcd=math.gcd(a,b)
    gongbei=a*b//gcd
    return gongbei

#列表中一系列数的公倍数,采用列表遍历的方式
def gongbei1(x):
    s=1
    for i in x:
        s=gongbei(s,i)
    return s
 
x=1750300142
x=[x,x+100,x+200,x+1000,x+2000]
gongbei1(x)

第三题

3(无提交数据) 产生一个Student类,
1其属性有学习 姓名,年龄,性别,学号,语文成绩,数学成绩,英语成绩
2 其成员函数有 求语数外平均成绩
产生3个student类的实例,并且给他们赋值。

class Student:
    Name=""
    Age=0
    Snum=""
    ChineseScore=0
    MathScore=0
    EnglishScore=0
    
    def  __init__(self,x):
        self.Name=x[0]
        self.Age=x[1]
        self.Snum=x[2]
        self.ChineseScore=x[3]
        self.MathScore=x[4]
        self.EnglishScore=x[5]
        
    def sumScore(self):
        return (self.ChineseScore+self.MathScore+self.EnglishScore)//3
 

x=["Tom",18,"1750300111",60,75,90]
y=["Tony",19,"1750300112",68,85,94]
z=["Tom",18,"1750300113",90,70,40]
a=Student(x)
b=Student(y)
c=Student(z)
print("%s,%d岁,学号为:%s,成绩:语文%d,数学%d,英语%d,平均成绩%0.1f"%(a.Name,a.Age,a.Snum,a.ChineseScore,a.MathScore,a.EnglishScore,a.sumScore()))

第四题

4 编写一个函数,makefile(s,n,fname=‘test.txt’),s为一个字符串,n为整数,fname为
文件名,makefile的意思是创建一个名字为fname的文件,内容是s重复n遍
现在用你的学号作为s,n取1000,文件名随意,产生这个文件。
然后读取该文件,求它的md5,(提示用hashlib.md5(data).hexdigest()),把这个值作为
第3行要提交的数据

import hashlib
def makefile(s,n,fname="test.txt"):
    path="D:/"
    path=path+fname
    open(path,"w").write(s*n)
    data=open(path,"r").read().encode("utf-8")
    #方式2:data=open(path,"rb").read()
    md5=hashlib.md5(data).hexdigest()
    return md5

s="1750300142"
n=1000
r1=makefile(s,n)
print(r1)

第五题

5定义 一个类Vector3D,意思是三维向量,例如10,11,15 可表示为x=Vector3D(10,11,15)
其属性为 _x,_y和_z,表示在x,y,z方向上的取值
其成员函数有 add(d2),返回两个三维向量的和
sub(d2) 返回两个三维向量的差
length(),返回该向量到原点的距离 (提示 利用勾股定理)
_str(), 返回该向量的字符串,例如三维向量(10,11,15)其形式为(10,11,15)
写出该程序,假定学号是x
求Vector3D(x-100,x,x*x)到原点的距离(保留6位有效数字)
例如 1.89282e+18或者 189282
作为提交的4行答案

class Vector3D: 
    #成员变量
    _x=0
    _y=0
    _z=0
    #定义构造方法
    def __init__(self,x=0.0,y=0.0,z=0.0):   #__init__  前后都有两个下划线
        self._x=x                           #self._x=x成员变量赋值的正确形式
        self._y=y
        self._z=z
    
#-------------成员方法----------------------------------------    
    def add(self,d):           #每个函数都要写self
        self._x=self._x+d[0]
        self._y=self._y+d[1]
        self._z=self._z+d[2]       
        
    def sub(self,d):
        self._x=self._x-d[0]
        self._y=self._y-d[1]
        self._z=self._z-d[2]      
                
    def length(self):
        return (self._x**2+self._y**2+self._z**2)**(1/2)  #a**(1/2)表示a开二次方
    
    def _str(self):
        return (self._x,self._y,self._z)      
 

a=1750300142  
v=Vector3D(a-100,a,a*a)
print("向量的长度为%1.5e"%v.length())  #%e表示将数字用科学技术表示   %1.5e表示小数点后保留5位
print("\n")

d=(1,1,0)

#验证成员方法:add
v1=Vector3D(0,0,5)
v1.add(d)
print("v1=",v1._str())
print("v1长度为",v1.length())
print("\n")

#验证成员方法:sub
v2=Vector3D(2,2,5)
v2.sub(d)
print("v2=",v1._str())
print("v2长度为",v1.length())

错误总结:

1.Python运行时出现: takes no arguments错误提示

可能有以下两个容易犯的错误:
1.init写成了int
2.__inint__这个地方前后是两个"_"
inint()有个专业的名称叫做:构造方法,其不对实例方法显示。

2.编写测试代码时候的小错误——takes 0 positional arguments but 1 was given

出现了takes 0 positional arguments but 1 was given。其根本原因是我没有在类中的函数内引入self

猜你喜欢

转载自blog.csdn.net/jjsjsjjdj/article/details/102640251