2018-07-31 day12 面向?qū)ο?/h2>

迭代器和生成器

生成器:

a.可以看成是一個可以存儲多個數(shù)據(jù)的容器.需要里面數(shù)據(jù)的時候就生成一個,里面的數(shù)據(jù)只能從前往后依次生成,不能跳躍,不能從后往前.生成后的數(shù)據(jù)不能再生成

b.獲取生成器中的數(shù)據(jù)用._next_()方法

c.函數(shù)聲明中有yield關(guān)鍵字,函數(shù)就變成一個生成器

和列表比較:列表存數(shù)據(jù),數(shù)據(jù)必須是實實在在的的數(shù)據(jù),一個數(shù)據(jù)會占一定的內(nèi)存空間
生成器存數(shù)據(jù),存的是產(chǎn)生數(shù)據(jù)的算法,沒有數(shù)據(jù)占內(nèi)存空間

def Fibonacci(n):
    '''
    '''
    n1 = 1
    n2 = 1
    for x in range(1, n + 1):
        if x == 1 or x == 2:
            current = 1
            yield current
            continue
        current = n1 + n2
        n1, n2 = n2, current
        yield current


def main():
    '''
    生成器:
    a.可以看成是一個可以存儲多個數(shù)據(jù)的容器.需要里面數(shù)據(jù)的時候就生成一個,里面的數(shù)據(jù)只能從前往后依次生成,不能跳躍,不能從后往前.生成后的數(shù)據(jù)不能再生成
    b.獲取生成器中的數(shù)據(jù)用.__next__()方法
    c.函數(shù)聲明中有yield關(guān)鍵字,函數(shù)就變成一個生成器

    和列表比較:列表存數(shù)據(jù),數(shù)據(jù)必須是實實在在的的數(shù)據(jù),一個數(shù)據(jù)會占一定的內(nèi)存空間
    生成器存數(shù)據(jù),存的是產(chǎn)生數(shù)據(jù)的算法,沒有數(shù)據(jù)占內(nèi)存空間
    '''
    x = (i for i in range(10))
    # x就是一個生成器,用來產(chǎn)生數(shù)據(jù)
    print(x)
    print(x.__next__())  # 獲取生成器里面的數(shù)據(jù)(只能獲取一個數(shù)據(jù))
    print(x.__next__())
    print(x.__next__())
    print(x.__next__())  # 用完之后再調(diào)用__next__()會報StopIteration錯誤
    x = Fibonacci(10)
    print(x.__next__())
    print(x.__next__())
    print(x.__next__())
    print(x.__next__())
    print(x.__next__())


if __name__ == '__main__':
    main()

面向?qū)ο?/h1>
  • 1.什么是類:對擁有同一屬性和方法的對象的封裝

    類是抽象的

    類中的相同屬性是不能確定的

  • 2.什么是對象:對象就是類的實例

    對象是具體的

    對象的屬性是確定的

  • 3.面向?qū)ο缶幊?/p>

    面向過程編程:一步一步寫代碼實現(xiàn)功能→工具:邏輯和算法

    函數(shù)式編程:面對問題考慮有沒有擁有某種功能函數(shù)→工具:函數(shù)

    面向?qū)ο缶幊?面對問題考慮有沒有相應(yīng)的對象來解決→工具:類和對象

類的聲明

類的聲明:
class 類名(父類):
    屬性
    方法
  • class:python中聲明類的關(guān)鍵字
  • 類名:標(biāo)識符,首字母大寫,駝峰式命名
  • (父類):類繼承自其他的類,要寫括號,括號里面是父類命,可省略
  • 屬性:對象屬性和類的字段 → 保存數(shù)據(jù)
  • 方法:實質(zhì)就是聲明在類中的函數(shù) → 實現(xiàn)功能

  • 聲明兩個對象方法,需要使用對象來調(diào)用
  • 對象方法默認(rèn)有一個self參數(shù),調(diào)用的時候系統(tǒng)會自動傳參數(shù)
  • 誰調(diào)用這個方法,self就是誰
class Person:
    '''類的說明'''

    # 聲明兩個對象方法,需要使用對象來調(diào)用
    # 對象方法默認(rèn)有一個self參數(shù),調(diào)用的時候系統(tǒng)會自動傳參數(shù)
    # 誰調(diào)用這個方法,self就是誰
    def eat(self):
        print(self)
        print('吃飯呢!!!')

    def sleep(self):
        print(self)
        print('睡覺呢!!!')

聲明對象

  • 通過類的構(gòu)造方法取創(chuàng)建對象(系統(tǒng)自動生成的和類名相同的方法)

對象名 = 類名()

  • 類的對象可以通過.語法使用類中聲名的方法和屬性

方式:對象.方法()/對象.屬性

if __name__ == '__main__':
    # 聲明對象
    p1 = Person()
    print(p1)
    p1.eat()

    # 一個類可以有多個對象
    p2 = Person()
    # 對象可以調(diào)用對象方法
    print(p2)
    p2.sleep()

對象的屬性

聲明對象屬性

class 類名:
    def __init__(self):
        self.屬性名 = 初值
        self.屬性名2 = 初值2
        self.屬性名3 = 初值3
class Person:
    '''人類'''
  • init系統(tǒng)自帶的方法,不能直接調(diào)用,通過類創(chuàng)建對象的時候系統(tǒng)會自動調(diào)用的方法
  • init方法的作用是對對象的屬性進(jìn)行初始化
  • 通過構(gòu)造方法船艦對象的時候,一定要保證init方法中除了self以外,其他每個參數(shù)都有值
    def __init__(self, name='', age=0, gender='Female'):
        # 聲明對象的屬性
        print('++++++++')
        '''
        name,age,gender就是person類的對象屬性,只能通過對象調(diào)用
        '''
        self.name = name
        self.age = age
        self.gender = gender
        self.height = 191


if __name__ == '__main__':
    # 注意構(gòu)造方法中的參數(shù)是直接傳給init方法的參數(shù)的
    p1 = Person('Shin', 21, 'Male')
    print(p1.name)
    print(p1.age)
    print(p1.height)

    p2 = Person('Kris', 18, 'Male')
    print(p2.name, p2.age, p2.gender, p2.height)

    p2 = Person('doge')
    p5 = Person(gender='male')

對象屬性的增刪查改

class Dog:
    '''狗類'''

    def __init__(self, age=1, color='red'):
        self.age = age
        self.color = color


def mian():
    d1 = Dog(0, 'white')
  • 1.查屬性:對象.屬性(屬性不存在會報錯)
  • 對象.getattribute(屬性名)/getattr(對象,屬性名str,默認(rèn)值(不存在返回默認(rèn)值,有默認(rèn)值則不報錯))
print(d1.age, d1.color)
print(d1.__getattribute__('age'))
print(getattr(d1, 'age'))
  • 2.改屬性值:對象.屬性 = 新值
  • 對象.setattr('屬性名','值')
  • setattr(對象,屬性名,新值)
d1.age = 4
print(d1.age)
d1.__setattr__('color', 'brown')
setattr(d1, 'age', 10)
  • 3.增加屬性:對象.屬性 = 值(屬性不存在)
  • 注意屬性是添加給對象的,不是給類
d1.name = '狗哥'
print(d1.name)
d1.__setattr__('type', '金毛')
setattr(d1, 'gender', '雄')
  • 4.刪除對象屬性:del 對象.屬性
  • 注意:刪除的是對象的屬性,不影響這個類的其他對象
  • 對象.delattr(屬性名)/delattr(對象,屬性名)
del d1.color
# print(d1.color)
d1.__delattr__('name')
delattr(d1, 'gender')


class Student:
    def __init__(self, name='', age=18, gender='male'):
        self.name = name
        self.age = age
        self.gender = gender

    def study(self):
        print('%s學(xué)習(xí)呢!!!' % self.name)

case: 聲明學(xué)生類,有屬性:姓名,性別,年齡 方法:學(xué)習(xí)

1.聲明學(xué)生類的對象,聲明的時候給姓名,性別和年齡賦值

2.通過三種方式分別獲取姓名,性別,年齡并打印

3.給學(xué)生對象添加一個電話屬性

4.修改學(xué)生的年齡

5.刪除學(xué)生性別


stu1 = Student('周潤發(fā)', 20, 'Male')
print(stu1.name, stu1.__getattribute__('age'), getattr(stu1, 'gender', None))
setattr(stu1, 'tel', '123321123')
stu1.__setattr__('age', '40')
stu1.__delattr__('gender')
stu1.study()

if __name__ == '__main__':
    mian()

slots魔法

class Person:

slots的功能:就是約束類中對象的屬性.

    __slots__ = ('name', 'age', 'height', 'id')

    def __init__(self, name='', age=0):
        self.name = name
        self.age = age

    # 自定義對象的打印格式
    # id():python內(nèi)置函數(shù),功能是獲取變量地址
    def __str__(self):
        return self.name + ',' + str(self.age)


def main():
    p1 = Person('王根基', 15)
    p1.name = '小三'
    p1.height = 177
    print(p1)


if __name__ == '__main__':
    main()

類中的方法

  • 屬性:對象的屬性,類的字段(屬性)

  • 對象屬性:屬于對象的,不同對象對應(yīng)的值可能不一樣(對象屬性,通過對象使用)

  • 類的字段:聲明在類里面 函數(shù)外面 類屬性屬于類(類的字段,通過類使用)

  • 方法:對象方法(方法),類方法,靜態(tài)方法

  • 對象方法:自帶一個self參數(shù),一般要通過對象去調(diào)用

  • 類方法:

    1.使用@classmethod修飾

    2.自帶一個cls參數(shù),不傳參,誰調(diào)用就指向誰

  • 靜態(tài)方法:

    1.使用@staticmethod修飾函數(shù)

    2.沒有默認(rèn)參數(shù)

    3.只能通過類來調(diào)用

怎么選擇用對象方法,類方法,靜態(tài)方法?

  • 如果實現(xiàn)函數(shù)功能需要使用對象屬性就聲明對象方法
  • 如果實現(xiàn)函數(shù)功能需要使用類的字段或者調(diào)用類方法就聲明類方法
  • 都不需要就聲明靜態(tài)方法
class Person:
    # number是類字段
    number = 0

    def __init__(self, name='', age=1):
        self.name = name
        self.age = age

    # eat 方法是對象方法
    def eat(self, food):
        print('%s吃%s' % (self.name, food))

    @classmethod
    def ruinEarth(cls):
        # cls指向調(diào)用這個方法的類,cls可以當(dāng)作類來用
        p2 = cls('z3')  # 可以使用cls創(chuàng)建對象
        print(p2.name)
        print(cls.number)  # 可以通過cls使用類的自段
        print('魂淡')

    # 使用@staticmethod修飾靜態(tài)方法,沒有默認(rèn)參數(shù)
    @staticmethod
    def saveWater():
        print('節(jié)約用水')


def main():
    # 類的字段要用類來使用
    print(Person.number)

    # 對象的屬性要通過對象來使用
    p1 = Person('根基')
    print(p1.name)
    p1.eat('人')

    # 類方法通過類來調(diào)用
    Person.ruinEarth()

    # 靜態(tài)方法通過類來調(diào)用
    Person.saveWater()


case1:班級類,屬性:班級名,學(xué)生,功能添加學(xué)生,查找學(xué)生

case2:一個類,封裝所有和數(shù)學(xué)運算相關(guān)的功能

class Student:
    def __init__(self, name='', age=10):
        self.name = name
        self.age = age

    def __str__(self):
        return 'name:'+str(self.name)+'   age:'+str(self.age)


class ClassA:
    def __init__(self, name='', students=None):
        self.name = name
        self.students = students

    def addStudent(self):
        stu = Student('渣渣輝', 18)
        self.students.append(stu)
        print('增加一個學(xué)生')

    def searcherStudent(self):
        for stu in self.students:
            print(stu)

    def __str__(self):
        return str(self.name)+str(self.students)


class mathMethod:
    def plus(self, x, y):
        return x + y

    def sub(self, x, y):
        return x - y

    def mul(self, x, y):
        return x * y

    def div(self, x, y):
        return x / y


cls1 = ClassA('py1805', [])
cls1.addStudent()
print(cls1.students[0])

if __name__ == '__main__':
    main()

作業(yè)

  • 1.聲明一個電腦類:
    屬性:品牌、顏色、內(nèi)存大小
    方法:打游戲、寫代碼、看視頻

    a.創(chuàng)建電腦類的對象,然后通過對象點的方式獲取、修改、添加和刪除它的屬性
    b.通過attr相關(guān)方法去獲取、修改、添加和刪除它的屬性

'''
 @Author: Kris Shin
 @Date: 2018-07-31 19:00:25
 @Last Modified by: Kris Shin
 @Last Modified time: 2018-07-31 19:00:25
    1.聲明一個電腦類:
    屬性:品牌、顏色、內(nèi)存大小
    方法:打游戲、寫代碼、看視頻

    a.創(chuàng)建電腦類的對象,然后通過對象點的方式獲取、修改、添加和刪除它的屬性
    b.通過attr相關(guān)方法去獲取、修改、添加和刪除它的屬性
'''


class Computer:
    def __init__(self, brand='', color='', memory=1):
        self.brand = brand
        self.color = color
        self.memory = memory

    def playGame(self):
        print('%s can playing game' % self.brand)

    def typeCodes(self):
        print('%s can typing code' % self.brand)

    def watchVideo(self):
        print('%s can watching video' % self.brand)


def main():
    # 創(chuàng)建對象
    cpt1 = Computer('God of war', 'black', 8)
    # 點語句獲取值
    print(cpt1.brand, cpt1.color, cpt1.memory)
    # 增加屬性
    cpt1.fans = 3
    print(cpt1.fans)
    # 修改屬性
    cpt1.memory = 32
    print(cpt1.memory)
    # 刪除屬性
    del cpt1.fans
    # print(cpt1.fans)  # 報錯computer對象沒有fans屬性

    cpt2 = Computer('Dell', 'sliver', 4)
    # getattr相關(guān)方法
    print(cpt2.__getattribute__('brand'))
    print(cpt2.__getattribute__('color'))
    print(getattr(cpt2, 'memory'))
    # setattr相關(guān)方法
    cpt2.__setattr__('fans', 2)
    print(cpt2.__getattribute__('fans'))
    # delattr 相關(guān)方法
    delattr(cpt2, 'fans')
    # print(getattr(cpt2,'fans'))  # 報錯computer對象沒有fans屬性
    setattr(cpt2, 'color', 'white')
    print(cpt2.__getattribute__('color'))


if __name__ == '__main__':
    main()
  • 2.聲明一個人的類和狗的類:
    狗的屬性:名字、顏色、年齡 狗的方法:叫喚
    人的屬性:名字、年齡、狗 人的方法:遛狗
    a.創(chuàng)建人的對象小明,讓他擁有一條狗大黃,然后讓小明去遛大黃
'''
 @Author: Kris Shin
 @Date: 2018-07-31 19:20:53
 @Last Modified by: Kris Shin
 @Last Modified time: 2018-07-31 19:20:53
2.聲明一個人的類和狗的類:
狗的屬性:名字、顏色、年齡  狗的方法:叫喚
人的屬性:名字、年齡、狗   人的方法:遛狗
a.創(chuàng)建人的對象小明,讓他擁有一條狗大黃,然后讓小明去遛大黃
'''


class Dog(object):
    def __init__(self, name='', age=1, color=''):
        self.name = name
        self.age = age
        self.color = color

    def woof(self):
        print('%s is woofing' % self.name)


class Person(object):
    def __init__(self, name='', age=0, dog=Dog()):
        self.name = name
        self.age = age
        self.dog = dog

    def playWithDog(self):
        print('%s is playing with %s' % (self.name, self.dog.name))


def main():
    huang = Dog('大黃', color='brown')
    ming = Person('小明', 23, huang)
    ming.playWithDog()


if __name__ == '__main__':
    main()
  • 3.聲明一個矩形類:
    屬性:長、寬 方法:計算周長和面積
    a.創(chuàng)建不同的矩形,并且打印其周長和面積
'''
 @Author: Kris Shin
 @Date: 2018-07-31 19:32:19
 @Last Modified by: Kris Shin
 @Last Modified time: 2018-07-31 19:32:19
3.聲明一個矩形類:
屬性:長、寬   方法:計算周長和面積
a.創(chuàng)建不同的矩形,并且打印其周長和面積
'''


class Rect(object):
    def __init__(self, width=0, height=0):
        self.width = width
        self.height = height
        print('width:' + str(width) + '   height:' + str(height))

    def getArea(self):
        return str(self.width * self.height)

    def gerCLength(self):
        return str(2 * (self.height + self.width))


def main():
    rt1 = Rect(5, 6)
    rt2 = Rect(12, 19)
    rt3 = Rect(3.1415, 15.9876)
    rt4 = Rect(2, 6)
    rt5 = Rect(4, 4)
    print('rect1    area:' + rt1.getArea() + '  girth:' + rt1.gerCLength())
    print('rect2    area:' + rt2.getArea() + '  girth:' + rt2.gerCLength())
    print('rect3    area:' + rt3.getArea() + '  girth:' + rt3.gerCLength())
    print('rect4    area:' + rt4.getArea() + '  girth:' + rt4.gerCLength())
    print('rect5    area:' + rt5.getArea() + '  girth:' + rt5.gerCLength())


if __name__ == '__main__':
    main()
  • 4.創(chuàng)建一個學(xué)生類:
    屬性:姓名,年齡,學(xué)號 方法:答到,展示學(xué)生信息
    創(chuàng)建一個班級類:
    屬性:學(xué)生,班級名 方法:添加學(xué)生,刪除學(xué)生,點名
'''
 @Author: Kris Shin
 @Date: 2018-07-31 19:42:49
 @Last Modified by: Kris Shin
 @Last Modified time: 2018-07-31 19:42:49
4.創(chuàng)建一個學(xué)生類:
屬性:姓名,年齡,學(xué)號   方法:答到,展示學(xué)生信息
創(chuàng)建一個班級類:
屬性:學(xué)生,班級名   方法:添加學(xué)生,刪除學(xué)生,點名
'''


class Student(object):
    def __init__(self, name='', age=0, id=''):
        self.name = name
        self.age = age
        self.id = id

    def arriveAt(self):
        print(
            '%s %s %d %s is here!!' % (self.id, self.name, self.age, self.id))


class Class(object):
    def __init__(self, name='', students=[]):
        self.name = name
        self.students = students

    def addStu(self, stu=Student()):
        self.students.append(stu)
        print('add a student %s !!' % stu.name)

    def delStu(self, stu):
        self.students.remove(stu)
        print('del a student %s !!' % stu.name)

    def getStu(self):
        for i in range(len(self.students)):
            self.students[i].arriveAt()


def main():
    stu1 = Student(name='aaa', id='001', age=18)
    stu2 = Student('bbb', 20, '002')
    cls = Class("lala", [stu1])
    cls.addStu(stu2)
    stu3 = Student('liupi', 50, '003')
    cls.addStu(stu3)
    cls.delStu(stu1)
    cls.getStu()


if __name__ == '__main__':
    main()
  • 5.寫一個類,封裝所有和數(shù)學(xué)運算相關(guān)的功能(包含常用功能和常用值,例如:pi,e等)
'''
 @Author: Kris Shin
 @Date: 2018-07-31 20:06:47
 @Last Modified by: Kris Shin
 @Last Modified time: 2018-07-31 20:06:47
5.寫一個類,封裝所有和數(shù)學(xué)運算相關(guān)的功能(包含常用功能和常用值,例如:pi,e等)
'''


class MathMethod(object):
    e = 2.71
    pi = 3.14

    @staticmethod
    def addNums(*nums):
        rt = 0
        for i in range(len(nums)):
            rt += nums[i]
        return rt

    @staticmethod
    def subNums(*nums):
        rt = nums[0]
        for i in range(1, len(nums)):
            rt -= nums[i]
        return rt

    @staticmethod
    def mulNums(*nums):
        rt = 1
        for i in range(len(nums)):
            rt *= nums[i]
        return rt

    @staticmethod
    def divNums(*nums):
        for i in range(1, len(nums)):
            if not nums[i]:
                print('illegal calculate!!!')
                return -1
        if nums[0] == 0:
            rt = 0
        else:
            rt = nums[0]
            for i in range(1, len(nums)):
                rt /= nums[i]
            return rt


def main():
    mas = MathMethod
    print(mas.addNums(1, 2, 3, 4, 5, 7))
    print(mas.subNums(1, 2, 3, 4, 5, 7))
    print(mas.mulNums(1, 2, 3, 4, 5, 7))
    print(mas.divNums(1, 2, 3, 4, 5, 7))
    print('e', mas.e, '   pi', mas.pi)


if __name__ == '__main__':
    main()

6.寫一個班級類,屬性:班級名、學(xué)生;功能:添加學(xué)生、刪除學(xué)生、根據(jù)姓名查看學(xué)生信息,展示班級的所有學(xué)生信息

'''
 @Author: Kris Shin
 @Date: 2018-07-31 20:36:37
 @Last Modified by: Kris Shin
 @Last Modified time: 2018-07-31 20:36:37
6.1.寫一個班級類,屬性:班級名、學(xué)生;功能:添加學(xué)生、刪除學(xué)生、根據(jù)姓名查看學(xué)生信息,展示班級的所有學(xué)生信息
'''


class Student(object):
    def __init__(self, name='', age=0, id=''):
        self.name = name
        self.age = age
        self.id = id

    def ShowStu(self):
        print('%s %s %d %s' % (self.id, self.name, self.age, self.id))


class Class(object):
    def __init__(self, name='', students=[]):
        self.name = name
        self.students = students

    def addStu(self, stu=Student()):
        self.students.append(stu)
        print('add a student %s !!' % stu.name)

    def delStu(self, stu):
        self.students.remove(stu)
        print('del a student %s !!' % stu.name)

    def ShowStus(self):
        for i in range(len(self.students)):
            self.students[i].ShowStu()


def main():
    stu1 = Student(name='aaa', id='001', age=18)
    stu2 = Student('bbb', 20, '002')
    cls = Class("lala", [stu1])
    cls.addStu(stu2)
    stu3 = Student('liupi', 50, '003')
    cls.addStu(stu3)
    cls.delStu(stu1)
    cls.ShowStus()


if __name__ == '__main__':
    main()
最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時請結(jié)合常識與多方信息審慎甄別。
平臺聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點,簡書系信息發(fā)布平臺,僅提供信息存儲服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

友情鏈接更多精彩內(nèi)容