随便写写
文章目录
函数
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()
将字符串当成表达式,并且返回计算结果