零基础掌握Python入门到实战(2)

python基础篇之面向对象和常用模块

注:适合萌新学习python并且里面的内容会持续的更新!
说明:并非是最优代码,但程序完全正确!因为此时作者也处在学习阶段!

对象(object):表示客观世界问题空间中的某个具体事物,又表示软件系统解空间中的基本元素。
面向对象程序设计:是一种程序设计范型,也是一种程序开发的方法。

例题:

编写一个程序,用于判断学生是否已经完成作业,如果完成教师会给予表扬,否则要进行批评 。

class Student:
   def __init__(self,name,grade,subject):
       self.name=name 
       self.grade=grade
       self.subject=subject
   def do_work(self,time):
       if self.grade >3 and time>2:
           return True
       elif self.grade <3 and time>0.5:
           return True
       else:
           return False
class Teacher:
   def __init__(self,name,subject):
       self.name = name
       self.subject=subject
   def evaluate(self,result=True):
       if result:
           return "you are great"
       else:
           return "you should work hard"
wrr=Student('wrr',4,'math')
tea =Teacher ( '杨老师','math')
tea_said=tea.evaluate(wrr.do_work(7))
print("Teacher:{0}said:{1} ,{2}".format(tea.name,wrr.name,tea_said))
 结果是:
 Teacher:杨老师said:wrr ,you are great

例题:
创建一个类,用于可以计算任意两个日期之间的天数和周数

import datetime
from dateutil import rrule
class BetDate:
    def __init__(self,start_date,stop_date):
        self.start=datetime.datetime.strptime(start_date,"%Y,%m,%d")
        self.stop=datetime.datetime.strptime(stop_date,"%Y,%m,%d")
    def day(self):
        d=self.start-self.stop
        return d.days if d.days > 0  else  False
    def weeks(self):
        weeks = rrule.rrule(rrule.WEEKLY,dtstar t= self.start,until=self.stop)  
        return weeks.count()
fir_twe =BetDate("2020,1,1","2020,10,1")   
d = fir_twe.day()
w = fir_twe.weeks()
print("Between 2020-1-1,2020-10-1:")
print("Days is:",d)
print("Week is:",w)  

例题:
创建类,能够通过“年-月-日”字符串创建实例,并检查年月日是否合法。

class Date(object):
    def __init__(self,year,month,day):
        self.year = year
        self.month = month
        self.day = day
    @classmethod #创建类方法
    def from_string(cls,date_as_string):
        year,month,day = map(int,date_as_string.split('-'))
        date1 = cls(year,month,day)#通过date_as_string字符串创建实例,这里的cls相当于Date
        return date1
    @staticmethod #创建静态方法
    def is_date_valid(date_as_string):
        year,month,day = map(int,date_as_string.split('-'))
        return day <= 31 and month <= 12 and year <= 2050 #判断年月日是否合法
d = Date.from_string("2020-10-1")#实例化
is_date = Date.is_date_valid("2020-10-1")  #实例化
print(is_date)      

继承

单继承:

'''
如果在子类里写了一个与父类同名的方法,
那么子类的这个方法会把父类的这个方法覆盖掉(重写)
'''
class Person:
    def __init__(self,name,age):
        self.name=name
        self.age=age
    def get_name(self):
        return self.name
    def get_age(self):
        return self.age
class Student(Person):
     #实现父类被覆盖的方法继续在子类中使用 
    def __init__(self,school,name,age):#增加了父类的name和age
        self.school=school
        super().__init__(name,age) #括号内是父类参数,注意:不需要加self ,此处与Person.__init__(self,name,age)相同的意思
    def grade(self,n):
        print("{0} is in {1} class {2}".format(self.name,str(n),self.age))
stu1 = Student('nanshan',"wrr","20")
stu1.grade(15)
print("年龄是:",stu1.get_age())
print("姓名是:",stu1.get_name())
运行的结果:
wrr is in 15 class 20
年龄是: 20
姓名是: wrr

多继承:

class K1:
    def foo(self):
        print("k1-foo")
class K2:
    def foo(self):
        print("k2-foo")
    def bar(self):
        print("k2-bar")
class J1(K1,K2):#多继承
    pass #表示除了继承在J1中什么也不做
class J2(K1,K2):#多继承
    def bar(self):
        print("J2-bar")
class C(J1,J2):#多继承
    pass  #表示除了继承在J1中什么也不做
print(C.__mro__)  #__mro__算法体现的是一个继承的顺序
结果就是表示查找某一个方法或者属性的顺序就是如下:
(<class '__main__.C'>, <class '__main__.J1'>, <class '__main__.J2'>, <class '__main__.K1'>, <class '__main__.K2'>, <class 'object'>)

斐波那契数列
这个数列从第3项开始,每一项都等于前两项之和。

在这里插入图片描述

利用迭代器实现:

'''
斐波那契数列利用迭代器实现优化内存
'''
class Fibs:
    def __init__(self,max):
        self.max = max
        self.a = 0 # 斐波那契数列的第一二项值是01
        self.b = 1
    def __iter__(self):#定义的此方法表示当前的类是可迭代的
        return self
    def __next__(self):
        fib = self.a
        if fib > self.max:
            raise StopIteration
        self.a,self.b = self.b,self.b + self.a  #实现斐波那契数列。前两项的和是第三项
        return fib
fibs = Fibs(1000000) #初始化了一个100万个元素。但是这一百万个元素并没有读入到内存,而是使用多少个读入多少个
lst = [fibs.__next__() for i in range(10)] #使用__next__方法依次获取前十个数
print(lst)
输出的结果:
[0, 1, 1, 2, 3, 5, 8, 13, 21, 34]
'''
利用生成器写斐波那契数列
引入import itertools 专门用来创建迭代器对象的工具
'''
def fibs():
    prev,curr = 0,1
    while True:
        yield prev
        prev,curr = curr,prev + curr#实现斐波那契数列。前两项的和是第三项
import itertools 
print(list(itertools.islice(fibs(),10)))#fibs()里面有无限多个对象,用itertools.islice方法取前十个


利用生成器实现:

'''
利用生成器写斐波那契数列
引入import itertools 专门用来创建迭代器对象的工具
'''
def fibs():
    prev,curr = 0,1
    while True:
        yield prev
        prev,curr = curr,prev + curr #实现斐波那契数列。前两项的和是第三项
import itertools 
print(list(itertools.islice(fibs(),10))) #fibs()里面有无限多个对象,用itertools.islice方法取前十个

异常处理
主要用到try …except…

while True:
    try:
        a=float(input("please enter first number:"))
        b=float(input("please enter second number:"))
        r=a/b
        print("{0}/{1}={2}".format(a,b,r))
        break
    except ZeroDivisionError:
        print ("Please enter the second number again")
    except ValueError:
        print ("plase enter the number")
    except:
        break
    #也可以组合异常
    # except (ZeroDivisionError,ValueError):   #表示遇到这两个异常中的一个就会执行下面的代码
   #      print ("Please enter the second number again")

猜你喜欢

转载自blog.csdn.net/m0_48915964/article/details/108810957