随便写写

随便写写

函数

for循环 + else

for 变量 in 集合:
    循环体代码

else:
    没有通过break推出循环,则在循环结束后,会执行else后的代码

TODO注释

单行注释#后面加 TODO ,可以注释还未完成的代码

全局变量

函数内部可以使用全局变量,但是不允许修改全局变量,在函数内部对全局变量赋值,回生成一个新的局部变量
若想在函数内部对全局变量进行修改,需要使用global声明变量

多值参数

python中有两种多值参数

  • *args——存放 元组 参数,调用时不需要用()括起来,只需要用逗号分隔
  • **kwargs——存放 字典 参数,调用时不需要用{}括起来,只需要用key=value形式指明,且key默认为字符串,不需要加""或者’’

拆包

需要将元组/字典变量直接传递给函数时,需要拆包
传入参数时,元组参数前加*,字典参数前加**

dir查看类的所有属性和方法

dir(对象),可以返回对象的所有方法和属性

类外添加属性(不推荐)

直接使用.属性名,利用赋值语句就可以,这样做只会给该对象增加属性

self的含义

self是指具体对象的引用
比如:

class Cat():
    def __init__(self):
        print(self)

my_cat = Cat()
print(my_cat)

可以看到my_cat和self的地址是一样的。
class中的属性都是具体对象的,而类方法的第一个参数必须是self。

None初始值

当一个属性不知道该如何赋值时可以使用None,比如初始化时并没有该属性,是后期需要用的;
在判断是否为None时,建议使用is和is not方法,这两个方法是用来判断是否为同一个对象,类似于对id()地址的判断,而==和!=是判断值
也即,用 self.属性名 is None代替self.属性名 == None

私有属性和私有方法

如果某些属性不行让外部直接访问,只需要在属性名前加__就可以,如
self.__age = age
这样,外部就不可以访问,而只允许类内部访问;
同样的,如果某些方法不想外部直接访问,可以使用__方法名

伪私有属性

上面讲的私有属性和私有方法,实际并不是私有,只是python自动将其处理为_类名__属性/方法名,用这样的方法仍然可以在外部访问,但是最好不要

class Woman:
    def __init(self, name):
        self.name = name
        self.age = 18
    def __secret(self):
        print("%s 的年龄是 %d" % (self.name, self.__age))

xianfang = Woman("小芳")
#下面两个是可以读取(伪)私有变量的,只是python伪装了一下
print(xiaofang._Woman__age)
xiaofang._Woman__secret()
#而下面的不可以
print(xiaofang.__age)
xiaofang.__secret()

方法重写

如果子类的方法想要和父类的方法不同,只需要重新写该方法就可以,使用时会调用子类中的方法

方法的扩展

子类中需要在父类的基础上进行扩展,只需要在需要的位置使用super()对象使用原本父类中的方法,然后再添加子类特有的代码

多继承

子类可以从多个父类继承,只需要在类名的括号里,把多个父类用,隔开写就行;
父类之间又同名方法或者属性时尽量要避免这种方法,可以使用对象的.__mro__方法来查看方法调用的顺序;
如果没有父类,应该指定object作为父类

类属性

类本身也是一个对象,类自己也可以有属性和方法。类属性只需要不加self就可以,直接使用变量形式,在类内部使用时,可以使用类名.属性名调用,一般用来记录类自己的一些属性(比如创建了多少个对象),类属性要写在函数外,也就是直接在类名下面写就可以

类方法

类方法需要使用修饰器@classmethod,而且类方法的第一个参数必须是cls,可以使用该参数调用类的其他类方法和类属性

@classmethod
def 方法名(cls):
    pass

静态方法

一个方法既不需要使用实例属性也不需要使用类属性,可以使用静态方法,静态方法不需要创建对象就可以调用,不需要传递self和cls参数

@staticmethod
def 静态方法名():
    pass

单例

也就是说同一时间只允许一个实例存在
__new__方法:为对象分配地址空间,而__init__方法是为对象赋初始值,注意__new__方法是一个静态方法(不是类方法哦),不管有没有加修饰器
单例实现:重写__new__方法

class MusicPlayer(object):
    instance = None

    init_flag = False

    def __new__(cls, *args, **kwargs):
        if instance is None:
            instance = super().__new__(cls)
            # new是静态方法,所以要手动输入cls作为参数
        return instance

    # 初始化动作只执行一次(如果需要的话)
    def __init__(self):
        if MusicPlayer.init_flag:
            return
        print("播放器初始化")
        MusicPlayer.init_flag = True

异常

异常处理格式

使用try和except来处理异常,不能确定正确执行的代码放在try下方,而粗无处理代码放在except下面,而执行时不会在错误处停止,会继续

对不同错误进行处理

try:
    num = int(input("输入一个整数:"))
    result = 8/num
    print(result)

except ZeroDivisionError:
    print("除0错误")

except ValueError:
    print("请输入正确的整数")

捕获未知错误

try:
    num = int(input("输入一个整数:"))
    result = 8/num
    print(result)

except ZeroDivisionError:
    print("除0错误")

except ValueError:
    print("请输入正确的整数")

except Exception as error:
    print("未知错误 %s"%error)

异常处理完整语法

try:
    ...

except 错误类型1:
    ...

except 错误类型2:
    ...

except (错误类型3, 错误类型4):
    #处理错误3和错误4
    ...

except Exception as error:
    print("未知错误 %s " % error)

else:
    #没有异常会执行
    ...

finally:
    #无论是否异常都会执行,一般用来做收尾工作
    ...

异常的传递

异常发生时会向上级函数传递,因此可以在上级函数中处理异常,也就是可以在主程序捕获异常来处理

主动抛出异常

创建Exception异常类,使用raise关键字抛出异常

if 条件:
    ex = Exception("抛出异常信息")
    raise ex

import 模块

每一个py文件都是模块,当被导入时,所有没有被缩进的代码都会被执行

同名问题

会优先导入当前目录下的模块,因此自己写代码时,不要和系统的模块名重名,可以使用模块的__file__属性查看模块的完整路径

name

if __name__ == "__main__": 

使用以上代码可以实现只有直接运行该文件时才会被运行,而import时不会被运行

包(Package)

就是一个目录,包含多个模块,必须有__init__.py文件
在该文件中需要写希望外界可以使用的模块

from . import 模块名1
from . import 模块名2
# .表示当前目录

发布模块

如果需要发布自己的模块,可以发布模块,具体方法百度,使用setup.py

其他

eval()

将字符串当成表达式,并且返回计算结果

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值