此篇指南是针对python中易混淆的知识点和内置的数据类型
1、python是解释执行的编译语言,相较于c++这类编译后执行的语言效率低一些
a = 10 / 3 //3.3.3.3.3
a = 10 / 2 //5.0
a = 10 / -3 //-3.3.3.3.3
b = 10 // 3 //3 (全部向下取整)
b = 10 // -3 //-4
c = int(10 / 3) = 3
c = int(10 / -3) = -3 (全部取整数部分)
Leecode翻转3位数
def reverse():
num = 123
digit1 = num % 10 //个位
digit2 = num // 10 % 10 //十位
digit3 = num // 100 //百位
newnum = digit1 * 100 + digit2 * 10 + digit3
float并不能精确到具体位,比如计算4.5*2.9=13.049999999999999是错误的,所以比较两个数值是否相等abs(num-13.5)<1e-5
//python实现数据交换
def swap(a, b):
a, b = b, a //多个也可以
2、变量:存储数据的容器,python可以存储多种类型数据
python类名是首字母大写的驼峰命名法
构造函数:一个特殊函数,构造对象时自动调用,不能显示调用,没有返回值,名称固定为init,每个类默认有一个构造函数
变量或函数前加__则变成私有
def __init__(self, name, age):
self.name = name
self.age = age
self._name = name //_子类/本类可使用,其他处使用不会报错,只会警告
self.__name = name //只能在本类使用,其他类不可,main也不可
属性赋值并不一定在构造函数内:
def speak(self):
self.age = 18
只有把所有创建的对象都del之后,才会调用__del__打印print
class Client:
def __init__(self):
print('我是初始化函数')
def __del__(self):
print('我是垃圾回收函数'))
实例化对象的属性
① hasattr(实例化对象, 属性) :检查对象中是否包含属性,返回值类型bool
② getattr(实例化对象, 属性):获取实例化对象的属性值
③ getattr(实例化对象, 属性,参数3) :当对象不包含属性值,打印第三个参数
④ setattr(实例化对象, 属性, 值):设置对象的属性值
⑤delattr(实例化对象, 属性):删除对象的属性,若属性不存在,报错
class Ball:
def __init__(self,name): #默认情况下只有self
self.name = name
ball = Ball('乔丹') #init参数的改变相对实例化的参数也跟着改变
hasattr(ball,'name') #检查对象中是否包含name属性,返回true
getattr(ball,'name') #获取对象中name的值
getattr(ball,'age','age不存在') #当属性不存在时打印第三参数
setattr(ball,'age',23) #给属性赋值
delattr(ball,'age') #删除属性,若属性不存在则抛出异常
继承
issubclass(父类, 子类) 若第2参数是第1参数子类,返回true
isinstance(对象,类) 若第1参数是第2参数类的实例化对象,返回true
class Fish:
def __init__(self):
pass
class Shark(Fish):
def __init__(self): #子类会覆盖父类方法
super().__init__() #将父类方法传进去
issubclass(Shark,Fish) #若Shark是Fish的子类则返回true
isinstance(fish,Fish) #若fish是Fish类的实例化对象则返回true(若第一个参数传入的不是对象类型,则永远返回false,第二个参数可以是一个元祖isinstance(fish,(Fish,Shark))
魔法方法,在赋值的时候会自动调用
def getattribute(self,name):对象属性访问拦截器,任何对象想调用属性都要经过该方法
def getattr(self,name):对象获取一个不存在的类调用的方法,不重写直接抛异常,调用顺序在getattribute之后
def setattr(self,name,value):设置属性name的值
def delattr(self,name):删除name属性
a = class Animal()
a.x
#x不存在先调用__getattribute__,在调用__getattr__,但是在__getattribute__已经被拦截不会继续执行__getattr__
举例1:
class Animal:
def __getattribute__(self,name):
print("get attribute:%s" % name)
def __getattr__(self,name):
print("nothing")
if __name__ == '__main__':
a = Animal()
a.speak
a.x
class Animal:
def __getattr__(self,name):
print("get not existed attribute %s" % name):
def __setattr__(self, name, value):
print("set attr no matter attr exist %s:%d" % (name, value))
if __name__ == '__main__':
a = Animal()
a.x = 3
输出结果:没错,即使属性不存在也会执行,并且与getattr没有任何关系
python输出默认换行,添加end参数后以指定分隔符分割
for i in range(10):
print(i, end=' ')
enumerate同时取下标和值
scores = {
1, 2, 3, 4, 5}
for (i, val) in enumerate(scores):
print(i, val)
python用缩进表示层次关系,缩进的空白没有严格要求,但要保持统一,建议4空格或制表符
python中所有变量都是引用,存储的是对象的地址
python中常量地址固定
python中所有变量和传参都是复制地址
a = 10
b = 20
print(id(a))
print(id(b)) //打印地址
if a is b: //判断变量地址是否相同
3、数据结构:存储数据的方式
列表:任意对象的有序集合
a = [1, ‘A’]
b = [2, ‘B’]
①数组加和:c = a + b
c = [1, ‘A’,2, ‘B’]
②数组乘法:c = a * 3
a = [1, ‘A’,1, ‘A’,1, ‘A’]
③数组追加元素c = a.append(‘m’) 改变原数组结构
a = [1, ‘A’,‘m’]
④插入元素:a.insert(2, ‘k’)
a = [1, ‘k’ ,‘A’]
⑤合并两个数组:c = a.extend(b) 改变原数组结构
c = c = [1, ‘A’,2, ‘B’]
⑥删除指定下标元素:a.pop(1) 不传参默认删除最后一个元素
a = [1]
⑦删除指定元素:a.remove(‘A’) 只删除遇见的第一个
⑧排序:a.sort(reverse=True) 反序
⑨更改顺序:a.reverse()
⑩删除指定下标元素 :del a[0]
⑾切片组成新数组:a[0:1] ==包含前下标,不包含后下标
⑿查询下标:a.index(‘A’)
⒀数组转换:m = “hello” list(m)
m = [‘h’, ‘e’, ‘l’, ‘l’, ‘o’]
列表生成器
result = [ i for i in range(100) if i % 5 == 0]
result = [0, 5, 10, 15, 20, 25, 30, …]
tuple是python自带的线性数据结构,可以存储不同类型的值,长度固定不可变,里面元素不可修改,效率高,可以哈希
tuple = 1,2,3,4 ()可以省略
tuple = (1, ‘a’, [1, 2])
如下图所示,元组里存储的是各元素的地址,且元素内容是不允许修改,但是
tuple[2].append(3)是允许的
string结构固定长度不可变,可用单引号或双引号
str = “hello”
①查找指定字符下标:str.find(‘e’)
②替换:str.replace(‘h’, ‘m’) 生成新字符串
③字符串长度:len(str)
④拼接:res = ‘/’.join(str)
res = “h/e/l/l/o”
Unicode转换
⑴将字符转换为int型
>>> ord('A')
65
>>> ord('中')
20013
⑵将int转换为字符串
>>> chr(66)
'B'
⑶encode和decode(中文无法用ASCII,中文编码范围超过ASCII编码范围)
#将字符串按指定类型转码为byte
>>> 'ABC'.encode('ascii')
b'ABC'
#将byte转为字符串
>>> b'ABC'.decode('ascii')
'ABC'