python面试——基础数据类型

此篇指南是针对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

输出结果:
getattribute
举例2:

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'
  • 1
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值