面试题_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,它可以进行深拷贝,不仅拷贝了对象,同时也拷贝了对象中的元素,获得了全新的对象,与被拷贝对象完全独立,但这需要牺牲一定的时间和空间。

 

posted on 2018-02-12 23:01  Mr_Bai  阅读(111)  评论(0编辑  收藏  举报

导航