day 13

part 1 迭代器和生成器

生成器:可以看出一个可以存储多个数据的容器
获取生成器里面的数据需要使用next()方法。
只要在函数声明中有yield关键字,函数就不再是一个单纯的函数,而是变成一个生成器。

1,1,2,3,5,8,13,21....

和列表比较:列表存数据,数据必须是实实在在的数据,一个数据会占一定的内存空间。
生成器存数据,存的是产生数据的算法。没有数据去占内存空间。

def xu_lie(n):
    pre_1 =1
    pre_2 =1
    for x in range(n,n+1):
        if x == 1 or x == 2:
            current = 1
            continue
        current = pre_1 + pre_2
        pre_1, pre_2 = pre_2, current
        yield current
print(xu_lie(5))

if __name__ == '__main__':
    list1 = list(i for i in range(10))
    print(list1)
    x = (i for i in range(10))
    #x就是生成器,生产器的功能就是创建一个迭代器,用来产生数据的,需要里面数据的时候就生成一个
    #里面的数据只能从前往后依次生成,不能跳跃,也不能从后往前。生成后的数据,不能再生成。
    print(x)
    print(x.__next__())
    print(x.__next__())

part 2 面向对象和类

1、什么类:对拥有相同属性方法的对象的封装,类是抽象,相同属性值是不能确定的

2、什么是对象:对象就是类的实例,对象是具体的,对象的属性是确定

3、面向过程编程:一步一步的写代码实现过程,逻辑和算法

4、函数式编程:面对问题有没有一个函数有没有一个函数有这样的功能。工具是函数

5、面向对象编程:面对问题,考虑有没有相应的对象来帮我解决这个问题。工具是类和对象

part 3

类的声明:
格式
class 类名(父类):
属性
方法
class是Python中声明类的关键字
类名:标识符,类名的首字母大写,驼峰式命名(首字母大写)
(父类):类如果继承其他类,需要写括号,括号里面是父类的名字,可以省略。
属性:对象属性和类的字段---保存数据
方法:声明在类中的函数,声明在类中的函数叫方法---实现功能

声明类Person

class Person:
    """类的说明:人类"""


    #声明两个对象方法,需要使用对象来调用
    def eat(self):
        print('人在吃饭')
    def Sleep(self):
        print("人在睡觉(~﹃~)~zZ")
"""
声明对象:
通过类的构造方法创建对象(名字和类名同门的方法就是构造方法。自动生成的)
对象名=类名()
"""
if __name__ == '__main__':
    #声明对象
    p1 = Person()
    print(p1)
    p2 = Person()
    print(p2)

part 4 对象的属性

class Person:
    """人类"""
    """
    1.init方法是相系统自带的一个方法,这个放到不能直接调用,通过类创建对象的时候,系统会自动调用这个方法
    init方法的作用就是将对象的属性进行初始化
    2.通过构造方法创建对象的时候,一定要保证,init方法除了self之外,其他的每个参数都必须有值
    
    """
    def __init__(self, name1='', age1=0, sex = '女'):
        #在这个地方声明对象的属性
        print('====')
        print(name1)
        #在init 方法中声明对象的属性
        #name,age,sex就是Person这个类的对象属性,类的对象属性,需要通过对象来使用
        self.name = name1
        self.age = age1
        self.sex = '男'
if __name__ == '__main__':
    #注意:构造方法中的参数,实质是传给init方法参数的
    p1 = Person('luzhi',18)
    print(p1.name,p1.age,p1.sex)
    #通过不同方式创建对象
    #创建对象时候不给属性赋值
    p3 = Person()
    p4 = Person('张道清')
    p5 = Person(sex = '男')

part 5 对象的基础操作

class Dog:
    """狗类"""
    def __init__(self, age=0, color='yellow'):
        self.age = age
        self.color = color


if __name__ == '__main__':



    dog1 = Dog(3, 'white')
    #1.获取属性方法1、对象.属性(如果属性不存在,会报错)
    #方法2.对象.__getattribute__(属性名)和getattr(对象,属性名)
    print(dog1.age, dog1.color)
    print(dog1.__getattribute__('age'))
    #如果设置了default的值,当属性不存在的时候,不会报错,并且返回default的值。
    print(getattr(dog1, 'age', None))

    """2.改
    方法1.对象.属性 = 新值
    方法2.对象.__setattr__(属性名,新值)
    
    """
    dog1.age = 4
    print(dog1.age)
    dog1.__setattr__('color', 'block')
    setattr(dog1, 'color', 'yellow')

    print(dog1.color)
    #3.增加
    """对象.属性=值
    (值不存在)
    """
    dog1.name = "大黄"
    print(dog1.name)
    setattr(dog1, 'type','huskie')
    print(dog1.type)
    #4、删除
    """del 对象.属性
    方法2.dog.__delattr__('age')
    方法3.delattr(属性名,值)
    删除对象的属性也是删除某个对象的属性,不会影响这个类的其他对象"""
    del dog1.name
    #print(dog1.name)AttributeError: 'Dog' object has no attribute 'name'
    #dog.__delattr__('age')


    #练习,声明一个学生类,有姓名,年龄,性别。方法:学习
    #声明学生类的对象,声明的时候就给姓名。性别、年龄赋值。
    #三种方式获取姓名,性别,和年龄,打印
    #给学生对象添加一个属性,电话

    #修改学生的年龄
    #删除学生的性别


    class   Student:
        def __init__(self,name="",age=0,sex=''):
            self.name =name
            self.age =age
            self.sex =sex
        def study(self):
            print('%s学习' % self.name)

stu1 = Student('小明', 30, '男')
print(stu1.name)

part 6 slots魔法

class Person:
    __slots__ = ('name', 'age', 'sex')#约束类中对象的属性
    def __init__(self, name='', age=0):
        self.name = name
        self.age = age
    def __str__(self):#自定义对象的打印格式
        return self.name + "今年"+str(self.age) + '岁'

if __name__ == '__main__':
    p1 = Person('小王', 26)
    p1.name = '老张'
    p1.sex = '男'
    print(p1)

part 7

属性:对象的属性(属性)、类的属性(类的字段)
方法:对象方法(方法)、类方法、静态函数、
对象属性:属于对象的,不同的对象对应的值可能不一样()
类的字段:声明在类里面,函数外面。类属性属于类(类的字段,通过类来使用)
对象方法:自带一个self参数,一般通过对象去调用
类方法:使用@classmethod修饰,自带一个cls参数,并且这个参数不用传参,谁来调用这个方法,cls就指向谁
类方法要用类来调用
静态函数:1.使用@staticmethod
        2.没有默认参数
        3.静态方法通过类来调用

怎么选择对象方法,类方法,静态方法?
if 如果你实现函数的功能,需要使用对象的属性,就声明成对象方法。否则就选择类方法和静态方法
elif 如果实现函数的功能需要使用类的字段或者调用类的方法,就声明成类方法。
else 如果实现函数功能既不需要对象的属性,也不需要类的字段就声明成静态方法。
补充:ctrl+r 查找替换
     ctrl+f 查

class Person:
    number = 0
    #number 是类字段



    def __init__(self, name='',age=''):
        self.name = name#name和age都是对象属性
        self.age = age


    def eat(self,food):#eat方法是对象方法
        print('%s在吃%s' % (self.name, food))
    @classmethod
    #damage_earth就是一个类方法
    def damage_earth(cls):#可以使用cls创建对象
        print('人类破坏环境!!')
        pt =cls('张三')
        print(cls.number)#可以使用cls使用类的字段
        print(pt)


    @staticmethod  #静态方法
    def protact_earth():
        print('人类保护地球')

if __name__ == '__main__':
    #类的字段要用类来使用
    print(Person.number)
    #对象属性
    p1 = Person('小明')
    print(p1.name)
    #对象方法用对象调用
    p1.eat('面条')
    #通过类调用
    Person.damage_earth()
    Person.protact_earth()


#练习:写一个类班级类,属性有班级名字,学生,功能:添加学生、查找学生

#写一个类,封装所有和数学运算相关的功能
class Student:
    def __init__(self, name='', age=0):
        self.name = name
        self.age = age

    def __str__(self):
        return print('name:%s age:%d' % (self.name, self.age))


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

    def add_student(self):
        name = input('name:')
        age = input('age:')
        #根据输入的信息创建学生对象
        stu = Student(name, int(age))
        #添加学生
        self.students.append(stu)
#创建类和对象
cls1 = Class('PY1805',[])
cls1.add_student()
print(cls1.students[0])
©著作权归作者所有,转载或内容合作请联系作者
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

推荐阅读更多精彩内容

  • Spring Cloud为开发人员提供了快速构建分布式系统中一些常见模式的工具(例如配置管理,服务发现,断路器,智...
    卡卡罗2017阅读 134,853评论 18 139
  • 《刻意练习》这本书总共只有300多页,我用了一个月,只读了一遍。 一方面是由于过去一个月事情多,每天阅读时间变少,...
    张智坤878阅读 825评论 3 4
  • Hola todos, me llamo Tina . 文/小蜗牛 幸运数字: 7 ...
    小蜗牛Tina阅读 208评论 0 0
  • 出差,晚上无事,出去闲逛,见一精品衣服店,橱窗里的衣服很别致,不觉心动,推门而入,哇,布置的很有特点啊,衣服很多,...
    郝乐乐阅读 91评论 0 0
  • 1.跟钱钱学理财 请不要忘记, 除非你做出行动, 否则生活不会因此而变化。 2.你是否愿意变得富有 钱并不是生命中...
    长歌7788阅读 98评论 0 0