分类: Python

  • Python 函数

    概念理解

    定义

    • 执行特定任务, 完成特定功能的一段代码.

    作用

    • 复用
    • 隐藏实现细节
    • 提高可维护性

    基本形式

    def fname([parameters]):
        code
        [return variable/expression]
    
    fname(arguments)
    
    
    def dao(x, y):
        z = x + y
        return z
    dao(1, 2)
    

    函数参数

    Python 函数的参数有很多变化, 主要从以下三个方面来阐述.

    1. 按顺序(位置), 还是按指定的参数名称传递和调用?
    2. 参数的默认值
    3. 参数的数量

    形参

    是在定义函数名和函数体的时候使用的参数,目的是用来接收调用该函数时传递的参数。

    位置参数

    dao(10 , 20)

    关键词参数

    dao(a = 10, b = 20)

     

    默认参数

    在形参中设置默认值, 调用函数传入实参时如果不传入参数, 则使用默认值; 如传入参数则使用实参.

    def dao(a, b, c=100): # 含有默认值的参数, 必须置于不含默认值参数的后面.
        print(a, b , c)
    dao(86, 32)  # 此处调用函数时, 并未传入第三个实参, 但因为在形参中给其设置了默认值, 故运行时会自动使用默认值.

     

    参数传递

    可变形参

    数量可变的顺序参数

    def dao(*args):
        print(args)
    dao(10, 20)

    数量可变的关键字参数

    def dao(**args):
        print(args)
    dao(a = 10, b = 20)

    实参

    可变实参

    def dao(a, b, c):
        print(a, b , c)
    
    dict = {
    'a' : 1,
    'b' : 2,
    'c' : 3,
    }
    dao(**dict)

     

    return

     

    闭包函数

    概念理解

    为什么会有闭包? 出于各种原因,有时候需要在函数外部访问函数内的数据。但由于Python中作用域的约束, 子对象会一级一级地向上寻找所有父对象的变量,就导致这一点通常是无法实现的。

    def outer():
    v =100;
    
    print(v)
    
    

    很显然此时, 程序会报错: NameError: name ‘v’ is not defined. 在函数外部, 无法调用函数内部的变量v.

    所以问题来了, 如果想在函数外部访问函数内部的数据, 该怎么做?

    def outer(a):  # 定义外部函数
        b = 10  # 定义一个外部函数的变量b
    
        def inner():  # 定义内部函数
            return a + b  # 为内部函数添加简单的功能, 并用return返回.
    
        return inner  # 外部函数被调用后, 返回内部函数. (这里是突破函数作用域约束, 让内外函数进行沟通得关键之处.)
    
    outer(9)()  # 如所期望的, 输出结果19, 这表明outer函数内部的变量b, 在它的外面被访问到了.
    

    那么此时, 内部函数, 即被称为 “闭包”.

    
    

     

     

    简单总结

    • 闭包是一个函数
    • 闭包函数是由其他代码生成的
    • 闭包函数携带了生成环境的信息
    • 闭包可以让一个变量常驻内存
    • 闭包可以避免变量被修改

    装饰器

    定义

    • 装饰器本质上是一个函数,用来对另一个函数(被装饰的函数对象)在不改动代码的前提下做功能上的补充, 如增加身份或权限验证、插入日志等。
    • 装饰器以被装饰的函数对象为输入参数,返回一个新的对象。
    • 装饰器的概念本身不难理解,可能令初学者最感到困惑的是,如何在装饰器函数和被装饰的函数对象之间建立联系。

    实例

    我们想象这样一个情景:

    1. 你喜欢玩LOL和TOC.
    2. 可技不如人, 抑或运气不佳, 联盟总输, 云顶总第八,  于是想到外挂.
    3. 这样一来, 游戏体验大幅上升, 但还剩最后一个”不是问题的问题”.
    4. 每次打开游戏前, 需要先打开外观. 游戏结束后, 需要关闭外挂 — 这对于任性有钱的你而言, 很麻烦.
    5. 所以你打算聘请一个无所不能的, 智能的秘书, 她总能在你想玩游戏的3分钟前, 替你打开外挂.

     

     

    # 1. 你喜欢玩LOL和TOC.
    def play_lol():
        print("玩英雄联盟")
    
    def play_toc():
        print("玩云顶之弈")
    

     

    # 2/3/4  每次打开游戏前, 需要先打开外观. 游戏结束后, 需要关闭外挂 -- 这对于任性有钱的你而言, 很麻烦.
    def play_lol():
        print("玩英雄联盟")
    
    def play_toc():
        print("玩云顶之弈")
    
    
    print("打开外挂")
    play_lol()
    print("关闭外挂") 
    
    print("打开外挂")
    play_toc()
    print("关闭外挂")
    # 所以你打算聘请一个无所不能的, 智能的秘书, 她总能在你想玩游戏的3分钟前, 替你打开外挂.
    def assistant(game):
        def inner():
            print("打开外挂")
            game()
            print("关闭外挂")
        return inner
    
    def play_lol():
        print("玩英雄联盟")
    
    def play_toc():
        print("玩云顶之弈")
        
        
    assistant(play_lol)()
    assistant(play_toc)()

     

    # 所以你打算聘请一个无所不能的, 智能的秘书, 她总能在你想玩游戏的3分钟前, 替你打开外挂.2
    # 为了便于理解, 这里做了一个小调整, 将函数assistant(play_lol)赋值给变量, 使用时调用变量即可.
    def assistant(game):
        def inner():
            print("打开外挂")
            game()
            print("关闭外挂")
        return inner
    
    def play_lol():
        print("玩英雄联盟")
    
    def play_toc():
        print("玩云顶之弈")
        
        
    play_lol = assistant(play_lol)
    play_toc = assistant(play_toc)
    
    play_lol()
    play_toc()

    执行流程

    • 假设现在想玩LOL, 那么调用函数assistant(play_lol)
    • 进入到assistant(play_lol)内部的功能代码
    • assistant(play_lol)的返回结果是 return inner
    • assistant(play_lol)()即是inner()
    • 执行inner函数
      • 开外挂
      • 玩游戏 play_lol()
      • 关外挂

    装饰器的雏形

    def assistant(game):
        def inner():
            print("打开外挂")
            game()
            print("关闭外挂")
        return inner
    
    
    @assistant
    def play_lol():
        print("玩英雄联盟")
    
    @assistant
    def play_toc():
        print("玩云顶之弈")
        
        
    # play_lol = assistant(play_lol)  相当于 @assistant
    # play_toc = assistant(play_toc)  相当于 @assistant
    
    play_lol()
    play_toc()

    带参数的装饰器

    • 需求升级: 玩游戏, 开外挂, 需要账号和密码, 玩英雄联盟时, 还需要设置想玩的英雄.
    def assistant(game):
        def inner(*args, **kwargs):   #不定形参
            print("打开外挂")
            game(*args, **kwargs)
            print("关闭外挂")
        return inner
    
    
    @assistant
    def play_lol(username, password, champion):
        print("玩英雄联盟")
        print(username, password, champion)
        
    
    @assistant
    def play_toc(username, password):
        print("玩云顶之弈")
        print(username, password)
        
        
    # play_lol = assistant(play_lol)
    # play_toc = assistant(play_toc)
    
    play_lol("jin", "123456", "kasha")
    play_toc("xin", "123456")

     

     

    参数调用说明

    在形参中:
    *args 传递可变的顺序参数给实参, 其形式是元组
    **kwargs 传递可变的关键字参数给函数实参, 其形式是列表

    在实参中:
    *args 将元组形式的形参, 解散成字符串
    **kwargs 将列表形式的形参, 解散成字符串

     

    带 返回值的装饰器

     

    装饰器总结

    • 从代码可以看出,  函数里的play_lol = assistant(play_lol) 相当于 装饰器里的@assistant, 所以装饰器实际上是一种语法糖, 不使用装饰器, 也一样可以实现.
    •  装饰器本质是一个闭包, 即外部函数调用内部函数数据, 在不改动代码的前提下做功能上的补充.
    • 装饰器的用途: 比如想统计某段代码执行所需的时间, 那么可以在其前后调用装饰器.
  • Python 常见的语言特性有哪些?

    变量与数据类型

    a = 10          # 整型
    b = 3.14        # 浮点型
    c = "hello"     # 字符串
    d = [1, 2, 3]   # 列表
    

    条件与循环语句

    for i in range(3):
        if i % 2 == 0:
            print(i)
    

    函数与参数

    def add(x, y=1):
        return x + y
    print(add(2))  # 输出3
    

    列表推导式与生成器表达式

    lst = [x*x for x in range(5)]        # 列表推导式
    gen = (x*x for x in range(5))        # 生成器表达式
    

    迭代器与生成器

    it = iter([1, 2, 3])                 # 迭代器
    print(next(it))                      # 输出1
    
    def gen():
        yield 1
        yield 2
    

    装饰器

    def deco(func):
        def wrapper():
            print("before")
            func()
        return wrapper
    
    @deco
    def hello():
        print("hello")
    

    面向对象编程

    class Dog:
        def __init__(self, name):
            self.name = name
        def bark(self):
            print(self.name + "汪汪")
    

    异常处理

    try:
        1 / 0
    except ZeroDivisionError:
        print("除零错误")
    

    模块与包

    import math
    print(math.sqrt(16))
    

    文件操作

    with open("test.txt", "w") as f:
        f.write("hello")
    

    内置函数与标准库

    nums = [1, 2, 3]
    print(len(nums))         # 内置函数
    

    注释与文档字符串

    # 这是单行注释
    def foo():
        """这是文档字符串"""
        pass
    

    推导式

    d = {x: x*x for x in range(3)}   # 字典推导式
    s = {x for x in range(3)}        # 集合推导式
    

    反射与动态特性

    class A:
        x = 1
    print(getattr(A, "x"))   # 输出1
    

    协程与异步编程

    import asyncio
    async def main():
        await asyncio.sleep(1)
    

    类型注解

    def add(x: int, y: int) -> int:
        return x + y
    

    其他特性

    a, b = 1, 2      # 解包赋值
    s = "hello"[1:4] # 切片
    

  • Python 面向对象

    简介

    对具象化的事物进行抽象, 尽管细节有偏差, 但与其他大部分编程语言的面向对象概念类似.

    一个极简实例

    class Animal(object):
    
        def __init__(self, name, color):
            self.name = name
            self.color = color
    
        def describe(self):
            # return self.name + self.score
            print(f'名字:{self.name} | 颜色:{ self.color}')
    
    
    # 注意到__init__方法的第一个参数永远是self,表示创建的实例本身,
    # 因此,在__init__方法内部,就可以把各种属性绑定到self,因为self就指向创建的实例本身。
    # 构造函数 ,是一种特殊的方法。主要用来在创建对象时初始化对象, 即为对象成员变量赋初始值
    xialing = Animal('黠灵', '灰白')
    xialing.describe()
    
    # 名字:黠灵 | 颜色:灰白
    # Process finished with exit code 0

    魔术方法 __init__

    class Human(object):
        def describe(self):
            pass
    
    xialing = Human()
    xialing.name= "黠灵"
    xialing.ability= "飞翔"
    
    huban = Human()
    xialing.name= "虎斑"
    xialing.ability= "瞬移"
    
    ...
    ...
    ...

     

    • 这其实是一个不是问题的问题,  初始化, 在其他语言和很多程序的设计中, 都会使用到.
    • 比如人, 有些属性是需要通过学习和机遇才能获得, 想象科学家和普通人的区别.
    • 有些属性则是人类天生就有的共性, 比如一出生就拥有了机体, 会睡觉, 会摄取营养.
    • 很显然, 作为实例/个体的人, 有许多共性, 都具有姓名, 年龄, 族别, 性别等.  如果为每一个实例去一个个添加这些共同的属性, 会非常麻烦.
    class Human(object):
        def __init__(self, name, age, gender, nationality):
            self.name = name
            self.age = age
            self.gender = gender
            self.nationality = nationality
    
        def describe(self):
            pass
    
    xialing = Human("黠灵", "6", "男", "汉") # 此时xialing 便具有所有的初始属性
    print(xialing.name, xialing.age, xialing.gender, xialing.nationality )

    望文生义 # initialization / initiate, 初始化,是一种特殊的方法。在创建对象时, 自动初始化对象,不需要手动/显式地调用. 即为对象成员变量赋初始值.

     

    魔术方法 __new__

    __init__ 的功能很明显, 其内部如何实现功能, 则与__new__相关.

    Python 中实例化对象时, 不需要显式地使用new关键字 (其他语言比如PHP中则需要).

    但实际上在实例化对象时, Python会自动效用__new__方法

     

    class Animal(object):
        def __init__(self):
            print('init方法被执行')
    
    
        def __new__(cls, *args, **kwargs):
            print('new方法被执行')
            
            print(cls)                    # cls 是 Animal 类        
            print(object.__new__(cls) )   # 得到 Animal 类的对象     
        
            return super().__new__(cls)   # return object.__new__(cls) 这样写也行
    
    
    xialing = Animal()
    
    # new方法被执行
    # init方法被执行
    # Process finished with exit code 0

    __new__ 先执行

    __init__ 后执行

     

    self 是什么?

    class Person(object):
        def ability(self):
            print(self)
            print('self的内存地址:' + str(id(self)))
    
    laozi = Person()
    laozi.ability()
    print("实例化得到的对象的内存地址:" + str(id(laozi)))
    
    zhuangzi = Person()
    zhuangzi.ability()
    print("实例化得到的对象的内存地址:" + str(id(zhuangzi)))
    
    
    # <__main__.Person object at 0x00000233A6D5D750>
    # self的内存地址:2420865619792
    # 实例化得到的对象的内存地址:2420865619792
    #
    # <__main__.Person object at 0x00000233A6D5D7D0>
    # self的内存地址:2420865619920
    # 实例化得到的对象的内存地址:2420865619920
    #
    # Process finished with exit code 0

     

    由此可知:

    • self 和 当前对象指向相同的内存地址
    • self 是 对象的引用

     

    析构方法 __del__

    # 当一个对象被删除或销毁时, Python 解释器会默认调用__del__()方法, 它称之为析构方法.
    
    class Animal(object):
        def __init__(self, name):
            self.name = name
            print("__init__ 方法被调用")
    
    
        def __del__(self):
            print("__del__ 方法被调用")
            print(f'{self.name}对象被销毁')
    
    cat = Animal("kitty")
    # print(input("请输入"))
    
    # __init__ 方法被调用
    # __del__ 方法被调用
    # kitty对象被销毁
    # Process finished with exit code 0

     

    继承

    单继承: 继承的最简实例

    class Animal(object):  # 创建一个基类
        def run(self):
            print('这是Animal基类内部的run方法')
    
    
    class Dog(Animal):  # 一个Dog子类, 继承自Animal. 子类能获得父类的全部功能, 称之为继承
        pass
    
    class Cat(Animal):  # 一个cat子类
        pass
    
    
    xialing = Dog()  # 将子类实例化, 得到对象xialing, 验证该对象是否获得基类的方法
    xialing.run()
    
    
    # 这是Animal基类内部的run方法
    # Process finished with exit code 0
    • Dog类继承自Animal类
    • Dog类实例化生成的对象xialing获得了Animal类的方法

     

    多继承

    class Animal(object):
        def climb(self):
            print('动物会爬树')
    
    
    class Human(object):
        def talk(self):
            print("人类会说话")
    
    
    class Immortal(object):
        def magic(self):
            print("神仙会仙术")
    
    
    class Monkey(Animal, Human, Immortal):
        pass
    
    wukong = Monkey()
    wukong.climb()
    wukong.talk()
    wukong.magic()
    
    # 动物会爬树
    # 人类会说话
    # 神仙会仙术
    # Process finished with exit code 0
    • Monkey类 继承了三个基类
    • Monkey类实例化的对象获得了三个类的方法

     

    多继承里的查找顺序问题

     

    class Animal(object):
        def climb(self):
            print('动物会爬树')
    
    
    class Human(Animal):
        def climb(self):
            print("人类会会爬树")
    
    
    class Immortal(Animal):
        def climb(self):
            print("神仙也会爬树")
    
    
    class Monkey(Human, Immortal):
        pass
    
    wukong = Monkey()
    wukong.climb()
    print(Monkey.__mro__)
    
    # 人类会会爬树
    # (<class '__main__.Monkey'>, 
    # <class '__main__.Human'>, 
    # <class '__main__.Immortal'>,
    # <class '__main__.Animal'>, 
    # <class 'object'>)
    
    # Process finished with exit code 0
    • 自下往上, 由近及远的去查找climb方法. (注意monkey类的继承顺序, Human在前)
    • 如果Monkey类里增加climb 方法, 并print(“猴子当然会爬树”), 那么最终的输出结果是猴子当然会爬树.
    • 可通过 __mro__ 来查看python内部的查找顺序
    • 这个涉及到语言本身的算法, 如广度优先.

    方法重写

    适用条件

    • 参数列表必须完全和被重写方法的参数列表一致. 如果Human类的__init__方法中添加其他参数, 则会报错. TypeError: Animal.__init__() takes 3 positional arguments but 4 were given
    • 返回类型必须完全和被重写方法的返回类型一致.
    • 访问修饰符的限制一定要大于被重写方法的访问修饰符.

     

    class Animal(object):
        def __init__(self, name, age):
            self.name = name
            self.age = age
    
        def describe(self):
            print('动物会爬树')
    
    
    class Human(Animal):
        def __init__(self, name, age):
    
            # Animal.__init__(self, name, age)    # 手动调用
            super().__init__(name, age)     # super()是一个特殊的类,调用super得到一个对象,该对象指向父类的名称空间。
            self.title = "齐天大圣"          # 拓展其他的属性
    
        def describe(self):
            print(self.name)
            print(self.age)
            print(self.title)
    
    wukong = Human('悟空', '99999')
    wukong.describe()
    
    
    # 悟空
    # 99999
    # 齐天大圣
    # Process finished with exit code 0

     

    方法重载

    重载是让类以统一的方式处理不同类型数据的一种手段。

    适用条件:

    • 一个类里面
    • 方法名字相同
    • 参数不同

    基本设计本原则:

    • 仅仅当两个函数除了参数类型和参数个数不同以外,其功能是完全相同的,此时才使用函数重载

    解决的问题:

    • 可变参数类型
    • 可变参数个数

    由此可知:

    • 函数功能相同,但是参数类型不同,python 如何处理?答案是根本不需要处理,因为 python 可以接受任何类型的参数,如果函数的功能相同,那么不同的参数类型在 python 中很可能是相同的代码,没有必要做成两个不同函数.
    • 函数功能相同,但参数个数不同,python 如何处理?大家知道,答案就是缺省参数。对那些缺少的参数设定为缺省参数即可解决问题。因为你假设函数功能相同,那么那些缺少的参数终归是需要用的。

    进而得到:

    • Python 里并没有语言规范上的方法重载.
    • 但有其他语言里方法重载里的功能
    • 因为Python函数自身的独特性和灵活性,  已经可以实现其他语言里的方法重载功能.

     

    多态

     

    定义: 同一种行为 , 对于不同的子类对象有不同的行为表现

    适用条件:

    • 继承:多态必须发生在父类和子类之间
    • 重写: 子类重写父类的方法
    class Animal(object):  # 创建一个基类
        def describe(self):
            print('这是Animal基类')
    
    class Dog(Animal):
        def describe(self):
            print('这是继承Animal类的Dog类, 这里是狗')
    
    
    class Cat(Animal):  # 子类
        def describe(self):
            print('这是继承Animal类的Cat类, 这里是猫')
    
    xialing = Dog()
    xialing.describe()
    
    lihua = Cat()
    lihua.describe()
    
    # 这是继承Animal类的Dog类, 这里是狗
    # 这是继承Animal类的Cat类, 这里是猫
    # Process finished with exit code 0
    

     

    • 黠灵 之于Animal类, 得到了Dog子类的方法.
    • 狸花 之于Animal类, 得到了Cat子类的方法.
    • 同一个机器, 能根据需求制造出不同的产品
      • Animal类  = 机床
        • 重写和继承 = 调整和设计程序
          • 第一次加工出齿轮/黠灵
          • 第二次加工出叶片/狸花猫

    多态的优越性

     

    class Animal(object):  # 创建一个基类
        def describe(self):
            print('这是Animal基类')
    
    class Dog(Animal):
        def describe(self):
            print('这是继承Animal类的Dog类, 这里是狗')
    
    
    class Cat(Animal):  # 子类
        def describe(self):
            print('这是继承Animal类的Cat类, 这里是猫')
    
    
    class Bird(Animal):  # 子类
        def describe(self):
            print('这是继承Animal类的Bird类, 这里是鸟')
    
    def uniform_invoke(obj):
        obj.describe()
    
    obj_list = [Dog(), Cat(), Bird()]
    for i in obj_list:
        uniform_invoke(i)
    
    # 这是继承Animal类的Dog类, 这里是狗
    # 这是继承Animal类的Cat类, 这里是猫
    # 这是继承Animal类的Bird类, 这里是鸟
    # 
    # Process finished with exit code 0

    这里需要一点想象力, 假设之后需要拓展功能代码, 直接增加bird类, 然后让如列表即可.

     

    鸭子类型 duck typing

    • 鸭子类型(英语:duck typing)是动态类型的一种风格。
    • 在这种风格中,一个对象有效的语义,不是由继承自特定的类或实现特定的接口,而是由”当前方法和属性的集合”决定。
    • “当看到一只鸟走起来像鸭子、游泳起来像鸭子、叫起来也像鸭子,那么这只鸟就可以被称为鸭子。”
    • “当看到一个人走起来像鸭子、游泳起来像鸭子、叫起来也像鸭子,那么这个人就可以被称为鸭子。”
    • 在鸭子类型中,关注点在于对象的行为,能作什么;而不是关注对象所属的类型。

     

    class Animal(object):  # 创建一个基类
        def describe(self):
            print('这是Animal基类')
    
    class Dog(Animal):
        def describe(self):
            print('这是继承Animal类的Dog类, 这里是狗')
    
    
    class Cat(Animal):  # 子类
        def describe(self):
            print('这是继承Animal类的Cat类, 这里是猫')
    
    
    class Bird(Animal):  # 子类
        def describe(self):
            print('这是继承Animal类的Bird类, 这里是鸟')
    
    #### 鸭子类型特性
    class Human(object):
        def describe(self):
            print('这是基类Human')
    
    class Student(Human):
        def describe(self):
            print('这是继承Human类的学生类, 这里是学生')
    ####
    
    
    def uniform_invoke(obj):
        obj.describe()
    
    obj_list = [Dog(), Cat(), Bird(), Student()]
    for i in obj_list:
        uniform_invoke(i)
    
    # 这是继承Animal类的Dog类, 这里是狗
    # 这是继承Animal类的Cat类, 这里是猫
    # 这是继承Animal类的Bird类, 这里是鸟
    # 这是继承Human类的学生类, 这里是学生
    #
    # Process finished with exit code 0

     

    只关注Student()对象本身, 而不管其属于Animal类还是Human类.

     

    封装

     

    前置基础知识

    前瞻与概括

    • 实例方法,第一个参数必须要默认传实例对象,一般习惯用self。如果类调用实例方法,需要显示的传self, 也就是实例对象自己
      • def function_name(self, parm1, parm2)
    • 类方法(由@classmethod装饰的方法),可以被类或类的实例对象调用。第一个参数必须要默认传类,一般习惯用cls。
      • @classmethod
            def function_name(cls):
    • 静态方法,参数没有要求 (但可以带参数)。静态方法(由@staticmethod装饰的方法)
      • @staticmethod
            def function_name():
      • 静态方法可以通过类对象和实例对象去访问, 但是很少使用实例对象去访问.
        • 静态方法可通过类对象直接方法, 不需要额外的实例化操作,  减少代码和开销.
        • 由于静态方法主要来存放逻辑性的代码,本身和类以及实例对象没有交互. 即在静态方法中,通常不会涉及到类中方法和属性的操作.
    • 备注:
      • 如果存在相同名称的 实例属性 和 类属性, 实例属性的优先级更高.

    类属性和实例属性

    类属性, 类对象和实例对象, 都可以访问

    实例属性, 只有实例对象可以访问

     

    class Animal(object):
        name = "黠灵"
    
        def __init__(self, age):
            self.age = age
    
    xialing = Animal(3)
    
    print(xialing.name)     # 实例对象 访问 类属性 √
    print(xialing.age)      # 实例对象 访问 实例属性 √
    
    print(Animal.name)      # 类对象 访问 类属性 √
    # print(Animal.age)     # 类对象 访问 实例属性 × # AttributeError: type object 'Animal' has no attribute 'age'
    

     

     

    类方法

    class Animal(object):
        name = "黠灵"  # 声明一个类属性
    
        @classmethod  # 运用 @classmethod 声明一个类方法
        def describe(cls):
            return cls.name
    
    xialing = Animal()
    
    print(xialing.describe())  # 实例对象 访问 类方法 √
    print(Animal.describe())   # 类对象 访问 类方法 √
    
    # 黠灵
    # 黠灵
    # Process finished with exit code 0
    通过类方法修改类属性
    class Animal(object):
        name = "黠灵"  # 声明一个类属性
    
        @classmethod  # 运用 @classmethod 声明一个类方法
        def describe(cls):
            return cls.name
    
        @classmethod  # 运用 @classmethod 声明一个类方法
        def describe_modified(cls, parm):
            cls.name = parm
    
    
    xialing = Animal()
    print(xialing.describe())  # 实例对象 访问 类方法 √ 黠灵
    print(Animal.describe())   # 类对象 访问 类方法 √ 黠灵
    
    Animal.describe_modified('狸花')
    print(Animal.describe())  # 狸花
    
    # 类方法可以修改类属性

    静态方法

    class Animal(object):
        name = "黠灵"  # 声明一个类属性
    
        @classmethod  # 运用 @classmethod 声明一个类方法
        def describe(cls):
            return cls.name
    
    
        @staticmethod
        def describe_again():
            return Animal.name
    
    xialing = Animal()
    print(xialing.describe())  # 实例对象 访问 静态方法 √ 黠灵 
    print(Animal.describe())   # 类对象 访问 静态方法 √ 黠灵
    
    print(xialing.describe_again())  # 实例对象 访问 静态方法 √ 黠灵 (一般不会这么做)
    print(Animal.describe_again())   # 直接通过类对象 访问静态方法 √ 不需要实例化.
    
    直接通过类对象 访问静态方法
    import  time
    class TimeTest:
        # def __init__(self,hour,min,second):
        #     self.hour=hour
        #     self.min = min
        #     self.second = second
    
        @staticmethod
        def showTime():
            return time.strftime("%H:%M:%S",time.localtime())
            pass
        pass
    
    print(TimeTest.showTime())
    
    
    # t=TimeTest(2,10,15)
    # print(t.showTime()) #没有必要通过这种方式去访问 静态方法
    带参数的静态方法
    class Demo(object):
        
        @staticmethod
        def summation(a, b):
            print(a + b)
            
    Demo.summation(1,2)
    
    # 3
    Process finished with exit code 0

     

    什么是封装?

    如何实现封装

    私有属性

    私有化的实例/类属性, 不能在类外部直接访问

    没有使用私有属性封装的代码形式

    class Animal(object):
        def __init__(self):
            self.name = "黠灵"
            self.age = "6"
    
    xialing = Animal()
    print(xialing.name, xialing.age)

    使用了私有属性封装的代码形式

    class Animal(object):
        def __init__(self):
            self.__name = "黠灵"      # 使用双下划线, 设置一个私有化属性__name
            self.age = "9999"
    
        # __str__ 将类的实例变成 str; print打印出来是个对象;使用了就把对象变成字符串
        def __str__(self):
            return f'狗名:{self.__name} | 狗命 {self.age}'
    
    xialing = Animal()
    print(xialing)
    # print(xialing.name, xialing.age) # AttributeError: 'Animal' object has no attribute 'name'
    

     

    如果不理解__str__,  可以看另一个实例

    
    class Animal(object):
        def __init__(self):
            self.__name = "黠灵"      # 设置一个私有化属性
            self.age = "9999"
    
        def get_data(self):
            print(f'狗名:{self.__name} | 狗命 {self.age}')
    
    xialing = Animal()
    xialing.get_data()      # 此时在类的外部, 实例对象, 通过类内部的get_data, 间接地访问__name
    print(xialing.age)      # 此时在类的外部, 实例对象, 直接访问类内部的age
    #print(xialing.__name)  # 此时在类的外部, 实例变量, 直接访问类内部的私有变量 __name (报错)
    
    

     

    父类中私有化的实例/类属性, 不能被子类继承
    class Animal(object):
        def __init__(self):
            self.__name = "黠灵"      # 设置一个私有化属性
            self.age = "9999"
    
        # __str__ 将类的实例变成 str; print打印出来是个对象;使用了就把对象变成字符串
        def __str__(self):
            return f'狗名:{self.__name} | 狗命 {self.age}'
    
    xialing = Animal()
    print(xialing)
    # print(xialing.name, xialing.age) # AttributeError: 'Animal' object has no attribute 'name'
    
    class Cat(Animal):
        pass
    
    lihua = Cat()
    print(lihua.__name)  # AttributeError: 'Cat' object has no attribute '__name'
    # 子类的Cat的实例化对象lihu 在类的外部, 无法访问__name 属性

     

    私有化的实例/类属性, 可以在类的内部访问

    以上代码已证实

     

    私有方法

     

    class Animal(object):
        def fly(self):
            print("fly")
    
        def climb(self):
            print('climb')
    
    
    xialing = Animal()
    xialing.fly(), xialing.climb() # 正常访问
    

     

    class Animal(object):
        def __fly(self):    # 一个私有化方法
            print("fly")
    
        def climb(self):
            print('climb')
    
    
    xialing = Animal()
    xialing.fly(), xialing.climb()  # 报错
    

     

    property方法

     

    封装的目的不是为了完全的封闭, 而是为了更安全, 更高效的提供数据. 大多数情况下, 私有化的属性和方法, 还是要和外部进行交互. 正常情况, 可以在类的内部设计一个用于和外部交换的方法. 但除此之外, Python 还提供了一个专门的函数 property(). 直观和通俗的讲:

    • 通常访问私有属性, 需要设置两个方法, 一个修改, 一个访问.
    • 这种调用方式, “感觉”是调用一个方法, 而不是访问属性. 那么如何让调用者可以直接访问属性, 而且我们又能控制的方式 提供给调用者?
    • property
    • property 还可以和装饰器结合使用, 快速高效地实现一些功能

     

    class Animal(object):
        def __init__(self):
            self.__age = 6
    
    
        def get_data(self):
            return self.__age
    
        def set_data(self, value):
           self.__age = value
    
    
        age = property(get_data, set_data)
    
        print(type(age))
    
    xialing = Animal()
    xialing.age = 999
    print(xialing.age)  

    语法特性

    • property 可以修饰类中属性的 get 、 set 和 del 方法,以及为属性对象创建文档字符串。
    • 原型为 class property(fget=None, fset=None, fdel=None, doc=None) ,它返回 property 属性。
    • fget 是获取属性值的函数。 fset 是用于设置属性值的函数。 fdel 是用于删除属性值的函数。 doc 为属性对象创建文档字符串。

    本实例中

    • xialing.age = 999 调用 setter
    • xialing.age 调用 getter

     

    单例模式

    魔术方法 __new__

    单例模式是常用和典型的”封装”形式和提现. Python里的单例模式有很多种实现方式,  比如模块, 装饰器, 类方法.  这里是通过魔术方法new.

    • 当我们实例化一个对象时,是先执行了类的__new__方法,实例化对象.
    • 然后再执行类的__init__方法,对这个对象进行初始化.
    • 那么在new 和 init之间, 可以进行判断, 如果类里面具有某个属性, 则不再创建对象.
    • 从而实现”一个类里面, 只有一个实例”.

     

    class Animal(object):
        def __init__(self):
            pass
    
    
        def __new__(cls, *args, **kwargs):
            cls._instance = super().__new__(cls, *args, **kwargs)
            return cls._instance
    
    xialing = Animal()
    print(id(xialing))
    
    huban = Animal()
    print(id(huban))
    
    
    # 1639090149520
    # 1639090149648
    # Process finished with exit code 0

    可以看到生成两个类

     

    class Animal(object):
        def __init__(self):
            pass
    
    
        def __new__(cls, *args, **kwargs):
            if not hasattr(cls,'_instance' ):
                cls._instance = super().__new__(cls, *args, **kwargs)
            return cls._instance
    
    xialing = Animal()
    print(id(xialing))
    
    huban = Animal()
    print(id(huban))
    
    
    # 2642697705424
    # 2642697705424
    # Process finished with exit code 0

    单例模式的实现

     

    动态绑定

    动态绑定实例方法

    import types
    
    class Animal(object):
        def __init__(self, name, age):
            self.name = name
            self.age = age
    
        # def __str__(self):
        #     print(f'self.name | self.age')
    
    
    def add_method(self):
        print(f'{self.name} | {self.age}| {self.color}')
    
    
    xialing = Animal('黠灵', '10')
    
    # 动态增加属性 color
    xialing.color = 'yellow'
    
    # 动态绑定add_method方法
    xialing.describe = types.MethodType(add_method, xialing)
    
    # 调用动态绑定的方法
    xialing.describe()

    实例方法describe

     

    动态绑定类方法

    import types
    
    class Animal(object):
        def __init__(self, name, age):
            self.name = name
            self.age = age
    
        # def __str__(self):
        #     print(f'self.name | self.age')
    
    
    def add_method(self):
        print(f'{self.name} | {self.age}| {self.color}')
    
    @classmethod
    def add_classmethod(cls):
        print('Animal类 动态添加了 类方法describe_classmethod ')
    
    Animal.describe_classmethod = add_classmethod
    Animal.describe_classmethod()
    
    # Animal类 动态添加了 类方法describe_classmethod 

     

    动态绑定静态方法

    import types
    
    class Animal(object):
        def __init__(self, name, age):
            self.name = name
            self.age = age
    
        # def __str__(self):
        #     print(f'self.name | self.age')
    
    
    def add_method(self):
        print(f'{self.name} | {self.age}| {self.color}')
    
    @staticmethod
    def add_staticmethod():
        print('Animal类 动态添加了 静态方法describe_staticmethod ')
    
    Animal.describe_staticmethod = add_staticmethod
    Animal.describe_staticmethod()
    
    # Animal类 动态添加了 静态方法describe_staticmethod 

    限制属性动态添加 __slot__()

     

    class Animal(object):
        __slots__ = ('name', 'age')
        # __slots__ = ('name') # AttributeError: 'Animal' object has no attribute 'age'
    
    
        def __init__(self, name, age):
            self.name = name
            self.age = age
    
    
        def describe(self):
            print(f'{self.name} | {self.age}')
    
    xialing = Animal('黠灵', '10')
    xialing.describe()

     

     

     

  • 《道德经》

    《道德经》有哪些版本?

    现代通行本

    传从河上公传下来,魏晋人王弼注释的版本,是现代通行本的祖宗。

    马王堆帛书版

    1973年,长沙马王堆汉墓出土了一批古书,其中就包括2170年前的古本《老子》,有甲、乙两种版本。两版本的书体有些不同,但都属于隶书。乙本避刘邦讳,可以断定它是汉朝的抄写本无疑。甲本由于不避汉高祖刘邦的名讳,因此可推断它当抄写于刘邦称帝之前。

    马王堆帛书版因为在时间上比河上公版更早,应该更为接近原始版,但是它长期被封藏与墓内,或者只被少数人所了解,没有广泛地流传开来,故而其影响不如河上公版本。

    郭店楚简版

    郭店一号楚墓位于湖北省荆门市沙洋区四方乡郭店村,南距楚故都纪南城约九公里,处于庞大的贵族葬区。于一九九三年八月、十月两次被盗。一九九三年十月十八日至二十四日荆门市博物馆考古工作人员被迫进行了抢救性的清理,挖掘出土了包括《老子》子在内的竹简八百零四枚,其中有字竹简七百三十枚,多用楚文字抄写。荆门市博物馆一九九八年五月出版《郭店楚墓竹简·老子》根据竹简形制的不同简本《老子》分别被整理为甲、乙、丙三种文本各本均不分《德经》、《道经》混合编辑。

    郭店楚简版《老子》是我们迄今为止所能看到的最早的版本,从时间上来说大约为公元前316年左右,这个版本是唯一最接近老子原本的《道德经》。但是有两个缺点:

    1. 郭店楚简《老子》所使用的文字是楚国文字,秦国一统天下后再到汉,楚国文字不再流行,导致如今很难解读。
    2. 因为竹简不易保存或者其他各种可能,郭店楚简版的内容不够完整。

    其实《道德经》远远不止这3个版本,自诞生以来,不同时间、不同流派都尝试对其进行解读,如果细分,可能有几十个版本。但河上公版本流传最广,对中国人的影响也最大。

    现代通行本

    《道德经》- 1

    道可道,非常道;名可名,非常名。无,名天地之始;有,名万物之母。故常无,欲以观其妙;常有,欲以观其徼(jiao:四声)。此两者,同出而异名,同谓之玄。玄之又玄,众妙之门。

    道是什么?

    这是《道德经》的第一章。本章开篇名义:“道可道,非常道。”  道作为老子哲学的核心,贯穿其思想体系始终。那么道究竟是什么呢? 关于对老子道的认识和诠释,历来众说纷纭。有的认为,道是精神性的本体,是脱离物质实体而独自存在的最高原理,主张老子的道论是客观唯心主义。有的则认为,道是宇宙处在原始状态中的混沌未分的统一体,主张老子的道论是唯物主义。一般认为道是宇宙的本原及万物运行的规律。陈鼓应在其《老子译注及评介》一书中引用杨兴顺的观点,将道的基本特点归结为:

    • 一、道是物的自然法则,它排斥一切神和“天志”。
    • 二、道永远存在,它是永存的物质世界的自然性。道在时间与空间上都是无限的。
    • 三、道是万物的本质,它通过自己的属性(德)而显现。没有万物,道就不存在。
    • 四、作为本质来说,道是世界的物质基础“气”及其变化的自然法则的统一。
    • 五、道是物质世界中不可破灭的必然性,万物都从属于道的法则。道摧毁一切妨害自己的事物。
    • 六、道的基本法则是:万物与一切现象,处于经常的运动与变化中,在变化的过程中,万物与一切现象都转化为自身的对立物。
    • 七、万物与一切现象,都处于相互联系的状态中,这种联系通过统一的道而完成。
    • 八、道是我们的感官所不能感知的,但在逻辑思维中,它是可以认识的。由是观之,道在天地生成以前就存在于浩瀚的宇宙中,当天地生成以后,道就在万事万物中发挥着自身的作用,贯穿万物的生成、生长、发展、消亡的始终,作为一种自然规律客观地存在着。

    道和名

    “道可道,非常道;名可名,非常名。”,这是道德经的开篇, 后人在诠释这句话时,产生了歧义, 主要有三种不同的诠释:

    • 道若可以言说,就不是永恒常在之道。
      • 持此种观点的人为《老子》注家的主流。从战国末期的韩非,到西汉严遵、东汉河上公、曹魏王弼、唐代成玄英、陆希声等人,都主张道不可言说。这种解读体现出一种宗教美学和神秘的美感。
    • 道可以言说,但不是人间常俗之道。
    • 道可以言说,但道非恒常不变之道。
      • 唐玄宗的看法
      • 道可以言说, 但道常变, 即特定时间空间下的道依赖于此时此地的条件,  当条件发生变化时, 道也随之而变, 而世事易变, 事物永运处于运动和发展过程中, 所以“此时此地的道非彼时彼地的道”, 所以”很难讲清楚”, 这种认识得到与第一种认识里类似的果, 但有不同的因。

     

    《道德经》- 2

    天下皆知美之为美,斯恶已;皆知善之为善,斯不善已。有无相生,难易相成,长短相形,高下相盈,音声相和,前后相随,恒也。是以圣人处无为之事,行不言之教;万物作而弗始, 生而弗有,为而弗恃(shi:四声),功成而弗居。夫唯弗居,是以不去。

    《道德经》- 3

    不尚贤,使民不争。不贵难得之货,使民不为盗;不见可欲,使民心不乱。是以圣人之治,虚其心,实其腹,弱其志,强其骨。常使民无知无欲,使夫智者不敢为也。为无为,则无不治 。

    《道德经》- 4

    道冲,而用之或不盈。渊兮,似万物之宗;挫其锐,解其纷,和其光,同其尘,湛兮,似或存。吾不知谁之子,象帝之先。

    《道德经》- 5

    天地不仁,以万物为刍(chu:二声)狗。圣人不仁,以百姓为刍狗。天地之间,其犹橐(tuo:二声)龠(yue:四声)乎?虚而不屈,动而愈出。多言数穷,不如守中。

    《道德经》- 6

    谷神不死,是谓玄牝(pin:四声)。玄牝之门,是谓天地根。绵绵若存,用之不勤。

    《道德经》- 7

    天长地久。天地所以能长且久者,以其不自生,故能长生。是以圣人后其身而身先,外其身而身存。非以其无私邪!故能成其私。

    《道德经》- 8

    上善若水。水善利万物而不争,处众人之所恶,故几于道。居善地,心善渊,与善仁,言善信,政善治,事善能,动善时。夫唯不争,故无尤。

    《道德经》-9

    持而盈之,不如其已;揣而锐之,不可长保。金玉满堂,莫之能守;富贵而骄,自遗其咎。功遂身退,天之道也。

    《道德经》-10

    载营魄抱一,能无离乎?专气致柔,能如婴儿乎?涤除玄鉴,能无疵(ci:一声)乎?爱民治国,能无为乎?天门开阖(he:二声),能为雌乎?明白四达,能无知乎?生之畜之。生而 不有,为而不恃,长而不宰,是谓“玄德”。

    《道德经》-11

    三十辐,共一毂(gu:三声),当其无,有车之用。埏(shān)埴( zhí)以为器,当其无,有器之用。凿户牖(you:三声)以为室,当其无,有室之用。故有之以为利,无 之以为用。

    《道德经》-12

    五色令人目盲,五音令人耳聋,五味令人口爽,驰骋畋猎,令人心发狂,难得之货,令人行妨。是以圣人为腹不为目,故去彼取此。

    《道德经》-13

    宠辱若惊,贵大患若身。何谓宠辱若惊?宠为下,得之若惊,失之若惊,是谓宠辱若惊。何谓贵大患若身?吾所以有大患者,为吾有身,及吾无身,吾有何患。故贵以身为天下,若可寄 天下。爱以身为天下,若可托天下。

    《道德经》-14

    视之不见,名曰夷;听之不闻,名曰希;搏之不得,名日微。此三者不可致诘(jie:二声),故混而为一。其上不皦(jiao:三声)?其下不昧(mei:四声),绳(min:三声)绳兮不可 名,复归于无物。是谓无状之状,无物之象,是谓惚恍。迎之不见其首,随之不见其后。执古之道,以御今之有。能知古始,是谓道纪。

    《道德经》-15

    古之善为士者,微妙玄通,深不可识。夫唯不可识,故强为之容;豫兮若冬涉川;犹兮若畏四邻;俨兮其若客;涣兮其若凌释;敦兮其若朴;旷兮其若谷;混兮其若浊;澹兮其若海;飂 兮若无止。孰能浊以静之徐清。孰能安以动之徐生。保此道者,不欲盈。夫唯不盈,故能蔽而新成。

    《道德经》-16

    致虚极,守静笃(du:三声)。万物并作,吾以观复。夫物芸芸,各复归其根。归根曰静,静曰复命。复命曰常,知常曰明。不知常,妄作凶。知常容,容乃公,公乃全,全乃天,天乃 道,道乃久,没身不殆。

    《道德经》-17

    太上,下知有之;其次,亲而誉之。其次,畏之。其次,侮之。信不足焉,有不信焉。悠兮其贵言。功成事遂,百姓皆谓:我自然。

    《道德经》-18

    大道废,有仁义;慧智出,有大伪;六亲不和,有孝慈;国家昏乱,有忠臣。

    《道德经》-19

    绝圣弃智,民利百倍;绝仁弃义,民复孝慈;绝巧弃利,盗贼无有;此三者以为文不足。故令有所属,见素抱朴,少私寡欲,绝学无忧。

    《道德经》-20

    唯之与阿,相去几何?善之与恶,相去若何?人之所畏,不可不畏。荒兮,其未央哉!众人熙熙,如享太牢,如春登台。我独泊兮,其未兆;沌(dun:四声)沌兮,如婴儿之未孩;儽儽 (lei:二声)兮,若无所归。众人皆有余,而我独若遗。我愚人之心也哉!俗人昭昭,我独昏昏。俗人察察,我独闷闷。澹(dan:四声)兮其若海?,飂(liao:二声)兮若无止。众人皆有以?,而我独顽且 鄙。我独异于人,而贵食母。

    《道德经》-21

    孔德之容,惟道是从。道之为物,惟恍惟惚。惚兮恍兮,其中有象;恍兮惚兮,其中有物。窈兮冥(míng)兮,其中有精;其精甚真。其中有信。自今及古,其名不去,以阅众甫 。吾何以知众甫之状哉!以此。

    《道德经》-22

    曲则全,枉则直,洼则盈,敝则新,少则得,多则惑。是以圣人抱一为天下式。不自见,故明;不自是,故彰;不自伐,故有功;不自矜(jin:一声),故长。夫唯不争,故天下莫能与 之争。古之所谓“曲则全”者,岂虚言哉!诚全而归之。

    《道德经》-23

    希言自然。故飘风不终朝,骤雨不终日。孰为此者?天地。天地尚不能久,而况于人乎?故从事于道者,同于道;德者,同于德;失者,同于失。同于道者,道亦乐得之;同于德者,德 亦乐得之;同于失者,失亦乐得之。信不足焉,有不信焉。

    《道德经》-24

    企者不立;跨者不行;自见者不明;自是者不彰;自伐者无功;自矜者不长。其在道也.曰:余食赘(zhui:四声)形。物或恶之,故有道者不处。

    《道德经》-25

    有物混成,先天地生。寂兮寥兮,独立而不改,周行而不殆,可以为天地母。吾不知其名,强字之曰道,强为之名曰大。大曰逝,逝曰远,远曰反。故道大,天大,地大,人亦大。域中 有四大,而人居其一焉。人法地,地法天,天法道,道法自然。

    《道德经》-26

    重为轻根,静为躁(zao:四声)君。是以君子终日行不离辎(zi:一声)重。虽有荣观,燕处超然。奈何万乘之主,而以身轻天下?轻则失根,躁则失君。

    《道德经》-27

    善行无辙迹;善言无瑕(xia:二声)谪(zhe:二声);善数不用筹策;善闭无关楗(jian:四声)而不可开;善结无绳约而不可解。是以圣人常善救人,故无弃人;常善救物,故无弃物 。是谓袭明。故善人者,不善人之师;不善人者,善人之资。不贵其师,不爱其资,虽智大迷,是谓要妙。

    《道德经》-28

    知其雄,守其雌,为天下谿(xi:一声)。为天下谿,常德不离,复归于婴儿。知其白,守其黑,为天下式。为天下式,常德不忒(te:四声),复归于无极。知其荣,守其辱,为天下谷 。为天下谷,常德乃足,复归于朴。朴散则为器,圣人用之,则为官长,故大制不割。

    《道德经》-29

    将欲取天下而为之,吾见其不得已。天下神器,不可为也,不可执也。为者败之,执者失之。是以圣人无为,故无败;无执,故无失。夫物或行或随;或歔(xu:一声)或吹;或强或赢 ;或挫或隳(hui:一声)。是以圣人去甚,去奢,去泰。

    《道德经》-30

    以道佐人主者,不以兵强天下。其事好还。师之所处,荆棘生焉。大军之后,必有凶年。善有果而已,不敢以取强。果而勿矜,果而勿伐,果而勿骄,果而不得已,果而勿强。物壮则老 ,是谓不道,不道早已。

    《道德经》-31

    夫兵者,不祥之器,物或恶之,故有道者不处。君子居则贵左,用兵则贵右。兵者不祥之器,非君子之器,不得已而用之,恬淡为上。胜而不美,而美之者,是乐杀人。夫乐杀人者,则 不可得志于天下矣。吉事尚左,凶事尚右。偏将军居左,上将军居右。言以丧礼处之。杀人之众,以悲哀泣之,战胜以丧礼处之。

    《道德经》-32

    道常无名、朴。虽小,天下莫能臣。侯王若能守之,万物将自宾。天地相合,以降甘露,民莫之令而自均。始制有名,名亦既有,夫亦将知止,知止可以不殆。譬道之在天下,犹川谷之 于江海。

    《道德经》-33

    知人者智,自知者明。胜人者有力,自胜者强。知足者富,强行者有志。不失其所者久,死而不亡者寿。

    《道德经》-34

    大道汜(fan:四声)兮,其可左右。万物恃之以生而不辞,功成而不有。衣养万物而不为主,常无欲,可名于小。万物归焉而不为主,可名为大。以其终不自为大,故能成其大。

    《道德经》-35

    执大象,天下往。往而不害安平太。乐与饵,过客止。道之出口,淡乎其无味,视之不足见,听之不足闻,用之不足既。

    《道德经》- 36

    将欲歙(xi:一声)之,必固张之;将欲弱之,必固强之;将欲废之,必固兴之;将欲取之,必固与之:是谓微明。柔弱胜刚强。鱼不可脱于渊,国之利器不可以示人。

    《道德经》- 37

    道常无为而无不为。侯王若能守之,万物将自化。化而欲作,吾将镇之以无名之朴。镇之以无名之朴,夫将不欲。不欲以静,天下将自正。〖解读 〗

    《道德经》-38

    上德不德,是以有德;下德不失德.是以无德。上德无为而无以为;下德无为而有以为。上仁为之而无以为;上义为之而有以为。上礼为之而莫之应,则攘(rang:三声)臂而扔之。故 失道而后德,失德而后仁,失仁而后义,失义而后礼。夫礼者。忠信之薄,而乱之首。前识者,道之华,而愚之始是以大夫处其厚,不居其薄;处其实,不居其华。故去彼取此。

    《道德经》-39

    昔之得一者:天得一以清:地得一以宁;神得一以灵;谷得一以盈;万物得一以生;侯王得一以为天下正。其致之也,谓天无以清,将恐裂;地无以宁,将恐废;神无以灵,将恐歇;谷 无以盈,将恐竭;万物无以生,将恐灭;侯王无以正,将恐蹶(jue:二声)。故贵以贱为本,高以下为基。是以侯王自称孤、寡、不榖(gu:三声)。此非以贱为本邪?非乎?故至誉无誉。是故不欲碌碌 (lu:四声)如玉,珞珞(luo:四声)如石。

    《道德经》- 40

    反者道之动。弱者道之用。天下万物生于有,有生于无。

    《道德经》-41

    上士闻道,勤而行之;中士闻道,若存若亡;下士闻道,大笑之。不笑不足以为道。故建言有之:明道若昧;进道若退;夷道若颣(lei:二声);上德若谷;广德若不足;建德若偷;质真若渝(yu:二声);大白若辱;大方无隅;大器晚成;大音希声;大象无形;道隐无名。夫唯道,善贷且成。

    《道德经》- 42

    道生一,一生二,二生三,三生万物。万物负阴而抱阳,冲气以为和。人之所恶,唯孤、寡、不榖,而王公以为称。故物或损之而益,或益之而损。人之所教,我亦教之,强梁者不得其 死,吾将以为教父。

    《道德经》-43

    天下之至柔,驰骋天下之至坚。无有入无间,吾是以知无为之有益。不言之教,无为之益,天下希及之。

    《道德经》-44

    名与身孰亲?身与货孰多?得与亡孰病?甚爱必大费;多藏必厚亡。故知足不辱,知止不殆,可以长久。

    《道德经》-45

    大成若缺,其用不弊。大盈若冲,其用不穷。大直若屈,大巧若拙,大辩若讷。静胜躁,寒胜热。清静为天下正。

    《道德经》-46

    天下有道,却走马以粪。天下无道,戎马生于郊。罪莫大于可欲;祸莫大于不知足;咎(jiu:四声)莫大于欲得。故知足之足,常足矣。

    《道德经》-47

    不出户,知天下;不窥牖(you:三声),见天道。其出弥远,其知弥少。是以圣人不行而知,不见而明,不为而成。

    《道德经》-48

    为学日益,为道日损。损之又损,以至于无为。无为而无不为。取天下常以无事,及其有事,不足以取天下。

    《道德经》-49

    圣人常无心,以百姓心为心。善者,吾善之;不善者,吾亦善之;德善。信者,吾信之;不信者,吾亦信之;德信。圣人在天下,歙歙(xi:一声)焉,为天下浑其心,百姓皆注其耳目 ,圣人皆孩之。

    《道德经》-50

    出生入死。生之徒,十有三;死之徒,十有三;人之生,动之于死地,亦十有三。夫何故?以其生生之厚。盖闻善摄生者,陆行不遇兕(si:四声)虎,入军不被甲兵;兕无所投其角, 虎无所用其爪,兵无所容其刃。夫何故?以其无死地。

    《道德经》-51

    道生之,德畜之,物形之,势成之。是以万物莫不尊道而贵德。道之尊,德之贵,夫莫之命而常自然。故道生之,德畜之;长之育之;亭之毒之;养之覆之。生而不有,为而不恃,长而 不宰。是谓玄德。

    《道德经》-52

    天下有始,以为天下母。既得其母,以知其子;既知其子,复守其母,没身不殆。塞其兑,闭其门,终身不勤。开其兑,济其事,终身不救。见小曰明,守柔曰强。用其光,复归其明, 无遗身殃,是为袭常。

    《道德经》-53

    使我介然有知,行于大道,唯施是畏。大道甚夷,而人好径。朝甚除,田甚芜,仓甚虚;服文彩,带利剑,厌饮食,财货有余,是谓盗夸。非道也哉!

    《道德经》-54

    善建者不拔,善抱者不脱,子孙以祭祀不辍。修之于身,其德乃真;修之于家,其德乃余;修之于乡,其德乃长;修之于邦,其德乃丰;修之于天下,其德乃普。故以身观身,以家观家 ,以乡观乡,以邦观邦,以天下观天下。吾何以知天下之然哉?以此。

    《道德经》-55

    含德之厚,比于赤子。毒虫不螫,猛兽不据,攫(jue:二声)鸟不搏。骨弱筋柔而握固,未知牝(pin:四声)牡之合而睃(zui:一声)作,精之至也。终日号而不嗄(sha:四声),和之 至也。知和曰常,知常曰明,益生曰祥,心使气曰强。物壮则老,谓之不道,不道早已。

    《道德经》-56

    知者不言,言者不知。塞其兑,闭其门;挫其锐,解其纷,和其光,同其尘,是谓玄同。故不可得而亲,不可得而疏;不可得而利,不可得而害;不可得而贵,不可得而贱。故为天下贵 。

    《道德经》-57

    以正治国,以奇用兵,以无事取天下。吾何以知其然哉?以此:天下多忌讳,而民弥贫;人多利器,国家滋昏;人多伎巧,奇物滋起;法令滋彰,盗贼多有。故圣人云:“我无为 ,而民自化;我好静,而民自正;我无事,而民自富;我无欲,而民自朴。”

    《道德经》-58

    其政闷闷,其民淳淳;其政察察,其民缺缺。祸兮,福之所倚;福兮,祸之所伏。孰知其极?其无正也。正复为奇,善复为妖。人之迷,其日固久。是以圣人方而不割,廉而不刿(gui: 四声),直而不肆,光而不耀(yao:四声)。

    《道德经》-59

    治人事天,莫若啬(se:四声)。夫唯啬,是谓早服;早服谓之重积德;重积德则无不克;无不克则莫之其极;莫之其极,可以有国。有国之母,可以长久。是谓深根固柢(di:三声), 长生久视之道。

    《道德经》-60

    治大国,若烹小鲜。以道莅(li:四声)天下,其鬼不神;非其鬼不神,其神不伤人;非其神不伤人,圣人亦不伤人。夫两不相伤,故德交归焉。〖 解读〗

    《道德经》-61

    大邦者下流,天下之牝(pin:四声),天下之交也。牝恒以静胜牡(mu:三声),以静为下。故大邦以下小邦,则取小邦;小邦以下大邦,则取大邦。故或下以取,或下而取。大邦不过 欲兼畜人,小邦不过欲入事人。夫两者各得其欲,大者宜为下。

    《道德经》-62

    道者万物之奥。善人之宝,不善人之所保。美言可以市尊,美行可以加人。人之不善,何弃之有?故立天子,置三公。虽有拱璧以先驷马,不如坐进此道。古之所以贵此道者何?不曰: 求以得,有罪以免邪?故为天下贵。

    《道德经》-63

    为无为,事无事,味无味。大小多少,报怨以德。图难于其易,为大于其细;天下难事,必作于易;天下大事,必作于细。是以圣人终不为大,故能成其大。夫轻诺必寡信,多易必多难 。是以圣人犹难之,故终无难矣。

    《道德经》-64

    其安易持,其未兆易谋。其脆易泮,其微易散。为之于未有,治之于未乱。合抱之木,生于毫末;九层之台,起于累土;千里之行,始于足下。为者败之,执者失之。是以圣人无为故无 败,无执故无失。民之从事,常于几成而败之。慎终如始,则无败事。是以圣人欲不欲,不贵难得之货;学不学,复众人之所过,以辅万物之自然而敢为。

    《道德经》-65

    古之善为道者,非以明民,将以愚之。民之难治,以其智多。故以智治国,国之贼;不以智治国,国之福。知此两者亦稽式。常知稽式,是谓玄德。玄德深矣,远矣,与物反矣,然后乃 至大顺。

    《道德经》-66

    江海之所以能为百谷王者,以其善下之,故能为百谷王。是以圣人欲上民,必以言下之;欲先民,必以身后之。是以圣人处上而民不重,处前而民不害。是以天下乐推而不厌。以其不争 ,故天下莫能与之争。

    《道德经》-67

    天下皆谓我道大,似不肖。夫唯大,故似不肖。若肖,久矣其细也夫!我有三宝,持而保之:一曰慈,二曰俭,三曰不敢为天下先。慈故能勇;俭故能广;不敢为天下先,故能成器长。 今舍慈且勇,舍俭且广,舍后且先,死矣!夫慈,以战则胜,以守则固,天将救之,以慈卫之。

    《道德经》-68

    善为士者,不武;善战者,不怒;善胜敌者,不与;善用人者,为之下。是谓不争之德,是谓用人之力,是谓配天古之极。

    《道德经》-69

    用兵有言:“吾不敢为主,而为客;不敢进寸,而退尺。”是谓行无行,攘(rang:三声)无臂;扔无敌;执无兵。祸莫大于轻敌,轻敌几丧吾宝。故抗兵相若,哀者胜矣。

    《道德经》-70

    吾言甚易知,甚易行。天下莫能知,莫能行。言有宗,事有君。夫唯无知,是以不我知。知我者希,则我者贵。是以圣人被褐而怀玉。

    《道德经》-71

    知不知,尚矣;不知知,病也。圣人不病,以其病病,夫惟病病,是以不病。

    《道德经》-72

    民不畏威,则大威至。无狎(xia:二声)其所居,无厌其所生。夫唯不厌,是以不厌。是以圣人自知不自见,自爱不自贵。故去彼取此。

    《道德经》-73

    勇于敢则杀,勇于不敢则活。此两者,或利或害。天之所恶,孰知其故?是以圣人犹难之。天之道,不争而善胜,不言而善应,不召而自来,繟(chan:三声)然而善谋。天网恢恢,疏 而不失。

    《道德经》-74

    民不畏死,奈何以死惧之?若使民常畏死,而为奇者,吾得执而杀之,孰敢?常有司杀者杀。夫代司杀者杀,是谓代大匠斫(zhuo:二声)。夫代大匠斫者,希有不伤其手矣。

    《道德经》-75

    民之饥,以其上食税之多,是以饥。民之难治,以其上之有为,是以难治。民之轻死,以其上求生之厚,是以轻死。夫唯无以生为者,是贤于贵生。

    《道德经》-76

    人之生也柔弱,其死也坚强。草木之生也柔脆,其死也枯槁。故坚强者死之徒,柔弱者生之徒。是以兵强则灭,木强则折。强大处下,柔弱处上。〖 解读〗

    《道德经》-77

    天之道,其犹张弓与?高者抑之,下者举之;有余者损之,不足者补之。天之道,损有余而补不足。人之道,则不然,损不足以奉有余。孰能有余以奉天下?唯有道者。是以圣人为而不 恃,功成而不处,其不欲见贤。

    《道德经》-78

    天下莫柔弱于水,而攻坚强者莫之能胜,以其无以易之。弱之胜强,柔之胜刚,天下莫不知,莫能行。是以圣人云:受国之垢(gou:四声),是谓社稷主;受国不祥,是为天下王。正言 若反。

    《道德经》-79

    和大怨,必有余怨,安可以为善?是以圣人执左契,而不责于人。有德司契,无德司彻。天道无亲.常与善人。

    《道德经》-80

    小国寡民。使有什伯之器而不用;使民重死而不远徙(xi:三声)。虽有舟舆(yu:二声),无所乘之;虽有甲兵,无所陈之。使民复结绳而用之。甘其食,美其服,安其居,乐其俗。邻国 相望,鸡犬之声相闻,民至老死,不相往来。

    《道德经》-81

    信言不美,美言不信。善者不辩,辩者不善。知者不博,博者不知。圣人不积,既以为人己愈有,既以与人己愈多。天之道,利而不害;人之道,为而不争。
  • Python 数据类型和基础

    基本数据类型

    Number(数字)

    int

    float

    bool

    complex

    String(字符串)

     

    page = '1'
    pagination='2'
    id='3'
    link = f"https://www.url.com/{page}/{pagination}/{id}/string"
    print(link)
    
    # https://www.url.com/1/2/3/string

     

    List(列表)

    Dictionary(字典)

    Tuple(元组)

    Set(集合)

     

    复杂数据类型

     

     

    推导式, 迭代器, 生成器

    推导式

    迭代器

    生成器

     

    循环和条件控制

    for 循环

    while 循环

    异常处理

    常规异常处理

    try:
        可能出现错误的代码
        
    except:
        出错之后执行的代码
        
    else:
        没有出错的代码
    
    finally:
        无论是否出错都会执行的代码

     

    def f1(number):
        return 10 / int(number)
    
    
    def f2(number):
        return f1(int(number)) * 10
    
    
    def f3():
        try:
            f2('0')
    
        except Exception as e:
            print(e)
        pass
    
    
    if __name__ == "__main__":
        f3()
        
    # division by zero
    # Process finished with exit code 0

     

    try:
        print(a)
    except Exception as e:
        print(e)
    else:
        print("当try里面的代码没有错误时, 此处代码才会执行")
    
    
    
    
    try:
        print('a')
    except Exception as e:
        print(e)
    else:
        print("当try里面的代码没有错误时, 此处代码才会执行")

     

    try:
        print(a)
    except Exception as e:
        print(e)
    finally:
        print("无论try里面的代码没有错误, 此处代码都会执行")

     

    自定义抛出异常

    class NameLengthException(Exception):
        def __init__(self, length):
            self.length = length
    
        def __str__(self):
            return f'你输入的姓名长度是{str(self.length)}, 已超出'
    
    def mame_length_check():
        name = input('请输入姓名:')
    
        try:
    
            if len(name) > 4:
                raise NameLengthException(len(name))
            else:
                print(f'你的姓名长度是{len(name)}, 符合规则.')
        except NameLengthException as e:
            print(e)
    
        else:
            print('你已成功完成姓名输入')
    
    
    
    if __name__ == "__main__":
        mame_length_check()
    
    # 请输入姓名:李桃李满天下
    # 你输入的姓名长度是6, 已超出
    # Process finished with exit code 0

     

     

    文件操作

    文件创建

    文件写入

    目录读取