面试题_day0212
1.请写出下面代码的输出结果:
1 class Parent(object): 2 x = 1 3 4 class Child1(Parent): 5 pass 6 7 class Child2(Parent): 8 pass 9 10 --print(Parent.x,Child1.x,child2.x) # 结果都是1 ,面向对象继承问题,派生类中没有,去基类中找, 11 12 Child1.x = 2 13 print(Parent.x,Child1.x,child2.x) # 结果1 2 1 # 自己类中有此属性,则用自己的。 14 15 Child2.x = 3 16 17 print(Parent.x,Child1.x,child2.x) # 结果1 2 3 # 同上
2.请写出下边的运算结果
a = 1 def fun(a): a = 2 fun(a) # 执行函数后,会在fun函数的局部创建一个局部变量a = 2,跟全局是不一样的。 print(a) # 结果是1,首先在自己的全局空间找a,找到了a = 1,打印1 a = [] def fun(a): a.append(1) fun(a) print(a) # [1] a是可变对象,程序运行时候,在内存中绑定了一块地址,函数一运行,就给这个列表增加了一个元素,但是内存地址不变,假如下边在执行一次,a的元素就会再增加一个,但是内存地址不变,可用id(a)来测试。
3.如何判断一个邮箱是否合法
邮箱的组成是:用户名@服务器地址,一般是每个网站会要求用户名大于多少个长度之类的。 按照这个基础规则来用正则匹配, [a-zA-Z0-9]{3,16}@([a-zA-Z0-9])\.([a-zA-Z0-9]) 在正则中,最基本的是两部分:要匹配的内容+前边内容出现的次数,还有就注意特殊字符的转义问题。可以在前边加r,或者用\,
4.请实现一个装饰器,限制该函数被调用的频率,如10秒一次
1 import time 2 3 def freq(func): 4 def inner(*args,**kwargs): 5 while True: 6 time.sleep(3) 7 func(*args,**kwargs) 8 return inner 9 10 @freq 11 def f(): 12 print('ffff') 13 14 f()
5.迭代器与生成器的理解。
讨论迭代器与生成器 1.在python中一切皆对象,如果一个对象,含有__iter__方法,则这个对象就是可迭代对象; 2.如果一个对象拥有__next__方法,其是迭代器。 3.定义可迭代对象,必须实现__iter__方法;定义迭代器,必须实现__iter__和next方法。 4.具有yield关键字的函数都是生成器,yield可以理解为return,返回后面的值给调用者。
不同的是return返回后,函数会释放,而生成器则不会。在直接调用next方法或用for语句进行下一次迭代时,生成器会从yield下一句开始执行,直至遇到下一个yield。
6.mysql有哪些存储引擎,优化mysql数据库的方式有哪些?
MySQL5.5以后默认使用InnoDB存储引擎,其中InnoDB和BDB提供事务安全表,其它存储引擎都是非事务安全表。 1.MyISAM 它不支持事务,也不支持外键,尤其是访问速度快,对事务完整性没有要求或者以SELECT、INSERT为主的应用基本都可以使用这个引擎来创建表。 2.InnoDB InnoDB存储引擎提供了具有提交、回滚和崩溃恢复能力的事务安全。但是对比MyISAM的存储引擎,InnoDB写的处理效率差一些并且会占用更多的磁盘空间以保留数据和索引。 3.MEMORY memory使用存在内存中的内容来创建表。每个MEMORY表实际对应一个磁盘文件,格式是.frm。MEMORY类型的表访问非常快,因为它到数据是放在内存中的,
并且默认使用HASH索引,但是一旦服务器关闭,表中的数据就会丢失,但表还会继续存在。 4.MERGE merge存储引擎是一组MyISAM表的组合,这些MyISAM表结构必须完全相同,MERGE表中并没有数据,对MERGE类型的表可以进行查询、更新、删除的操作,这些操作实际上是对内部的MyISAM表进行操作
优化方式:看自己摘抄的一篇文章。地址:
7.尽可能列举python列表的成员方法,并给出下列的结果
a = [1,2,3,4,5] ret = a[::2] print(ret) # 【1,3,5】 步长为2取值 print(a[-2]) # 4 ,取倒数第二个 ######################### 一行代码实现对列表a偶数位置上的数加3,然后再计算列表元素的和 sum(map(lambda x:x+3 if a.index(x)%2 == 0 else x,a)) 使用了map函数、lambda函数、sum函数,都是内置函数。
8.python中如何动态的获取和设置对象的属性
其实就是Python的自省。。。。看题目没明白
dir([obj]):
调用这个方法将返回包含obj大多数属性名的列表(会有一些特殊的属性不包含在内)。obj的默认值是当前的模块对象。
hasattr(obj, attr):
这个方法用于检查obj是否有一个名为attr的值的属性,返回一个布尔值。
getattr(obj, attr):
调用这个方法将返回obj中名为attr值的属性的值,例如如果attr为’bar’,则返回obj.bar。
setattr(obj, attr, val):
调用这个方法将给obj的名为attr的值的属性赋值为val。例如如果attr为’bar’,则相当于obj.bar = val。
9.python是如何进行类型转换的
常见数据类型转换 ''' int() str() list() dict() ''' a = 100 print('nan'+str(a)) stre = '1111' print(int(stre)) ''' print(type(len(stre))) #len是int类型 print("打印长度"+str(len(stre))) '''
10.python中如何拷贝一个对象
在Python中,无论是对象赋值,作为为参数传递,作为函数返回值,都是引用传递的.如果需要拷贝对象,需要使用标准库中的copy模块(import copy)。 1.浅拷贝 : 使用copy.copy,它可以进行对象的浅拷贝(shallow copy),它复制了对象,但对于对象中的元素,依然使用引用(换句话说修改拷贝对象元素,则被拷贝对象元素也被修改) 2.深拷贝 : 使用copy.deepcopy,它可以进行深拷贝,不仅拷贝了对象,同时也拷贝了对象中的元素,获得了全新的对象,与被拷贝对象完全独立,但这需要牺牲一定的时间和空间。