1.在python中,如何交换两个变量的值?
这个问题,考了python特殊的语法,也就是a, b = b, a,这个表达式,也是其他语⾔所没有的,是只有python⾃带的。
2. 字符串的拼接–如何⾼效的拼接两个字符串?
我们都知道python中,拼接字符串可以⽤”+”来拼接,然⽽这个⽅法并不是⾼效的,因为如果需要拼接的字符串有很多(n个)的情况下,使⽤”+”的话,python解释器会申请n-1次内存空间,然后进⾏拷贝,因为字符串在python中是不可变的,所以当进⾏拼接的时候,会需要申请⼀个新的内存空间。所以,正确答案是,使⽤.join(list),因为它只使⽤了⼀次内存空间。
3. list = [a,a,a,1,2,3,4,5,A,B,C]提取出”12345”
这个考点考了python的解压赋值的知识点,即 a,b,c,*middle, e,f,g = list, *middle = [1,2,3,4,5]。注意,解压赋值提取出来的是列表。
4. python的⾯向对象?
类是对象的蓝图和模板,⽽对象是类的实例。类是抽象的概念,⽽对象是具体的东西。在⾯向对象编程的世界中,⼀切皆为对象,对象都有属性和⾏为,每个对象都是独⼀⽆⼆的,⽽且对象⼀定属于某个类(型)。当我们把⼀⼤堆拥有共同特征的对象的静态特征(属性)和动态特征(⾏为)都抽取出来后,就可以定义出⼀个叫做“类”的东西。⾯向对象有三⼤⽀柱:封装、继承和多态。
5. 什么是元类?
同上,我们讲到在python中皆为对象,⽽元类即是⽤来创建类的”东西”。类也是元类的实例。⽽在python中,它们要么是类的实例,要么是元类的实例,除了type。type实际上是它⾃⼰的元类。元类主要的⽤途是⽤来创建API,⽐如django的ORM。
6.python的search和match知识点?
search和match都在re模块中,match只匹配字符串的开始,如果字符串开始不符合正则表达式,则匹配失败,函数返回None。search匹配整个字符串,直到找到⼀个匹配。
7. python中深浅拷贝的区别?
浅拷贝没有拷贝⼦对象,所以原对象发⽣改变,其⼦对象也发⽣了改变,⽽深拷贝拷贝了⼦对象,原对象发⽣改变,其本⾝也不会改变。具体的可以看我之前的博客python深浅copy⼀分钟掌握
8. 类的初始化:new() 和 init()?
new()⽅法⽤来实例化最终的类对象,在类创建之前被调⽤,它在类的主体被执⾏完后开始执⾏。 init()⽅法是在类被创建之后被调⽤,⽤来执⾏其他的⼀些输出化⼯作
当我们构造元类的时候,通常只需要定⼀个init()或new()⽅法,但不是两个都定义。但是,如果需要接受其他的关键词参数的话,这两个⽅法就要同时提供,并且都要提供对应的参数签名。
9.类的初始化?
B类继承A类,在B类⾃⼰的基础上可以调⽤A类所有⽅法,如果A,B同时拥有init, B会改写A中的init⽅法,A类的⽅法失效。
Super函数可以调⽤A类中的属性,B类中有同名属性时,覆盖A类中的同名属性。但调⽤函数时,总是先查找它⾃⾝的定义,如果没有定义,则顺着继承链向上插座,知道在某个⽗类中找到为⽌。
B类 init参数需⼤于或等于A ⽗类的init⽅法,因为super初始化了,参数量为⽗类参数量。
10.多线程?
多线程可以共享进程的内存空间,因此要实现多个线程之间的通信相对简单,⽐如设置⼀个全局变量,多个线程共享这个全局变量。但是当多个线程共享⼀个资源的时候,可能导致程序失效甚⾄崩溃,如果⼀个资源被多个线程竞争使⽤,那么对临界资源的访问需要加上保护,否则会处于“混乱”状态,⽐如银⾏存100块钱,最终很可能存不到⼀百块多个线程得到的余额状态都是0,所有操作都是在0上⾯加1,从⽽导致错误结果。这种情况下,锁就可以得到⽤处了。多线程并不能发挥cpu多核特性,因为python解释器有⼀个gil锁,任何线程执⾏前必须获得GIL锁,然后每执⾏100条字节码,解释器就会⾃动释放GIL锁让别的线程有机会执⾏。
11.python内存管理?
python内部使⽤引⽤计数,来保持追踪内存中的对象,Python内部记录了对象有多少个引⽤,即引⽤计数,当对象被创建时就创建了⼀个引⽤计数,当对象不再需要时,这个对象的引⽤计数为0时,它被垃圾回收。所有这些都是⾃动完成,不需要像C⼀样,⼈⼯⼲预,从⽽提⾼了程序员的效率和程序的健壮性。
12.python的filter⽅法?
filter就像map,reduce,apply,zip等都是内置函数,⽤C语⾔实现,具有速度快,功能强⼤等 优点。 ⽤于过滤与函数func()不匹配的值, 类似于SQL中select value != ‘a’
相当于⼀个迭代器,调⽤⼀个布尔函数func来迭代seq中的每个元素,返回⼀个是bool_seq返 回为True的序列 第⼀个参数: function or None, 函数或None 第⼆个参数: sequence,序列
13. 字符串的查询替换?
考点:python的find和replace函数。 给定⼀串字符串:
string = 'life is short, I use python'# 返回的为0或正数时,为其索引号>>> string.find('life')
string.replace('short','long')# replace 将short替换为long
>>> life is long, I use python
14.给定⼀串排好序的列表,打乱这个函数?这个题考了python⾥的shuffle函数的⽤法。# random模块中的shuffle(洗牌函数) import random list = [1, 2, 3, 4] random.shuffle(list) print(list)
15. 装饰器?
装饰器是⼀个函数,接收⼀个函数返回另⼀个函数。⽤法如下:import time
from functools import wraps
def timethis(func):'''
Decorator that reports the execution time.'''
@wraps(func)
def wrapper(*args, **kwargs):start = time.time()
result = func(*args, **kwargs)end = time.time()
print(func.__name__, end-start)return resultreturn wrapper@timethis
def countdown(n):'''
Counts down'''
while n > 0:n -= 1
>>> countdown(100000)
countdown 0.0017808532714844>>> countdown(10000000)
countdown 0.87188299392912”
16.给定⼀串字典(或列表),找出指定的(前N个)最⼤值?最⼩值?
这道题的考点是python内的heapq模块的nlargest() 和 nsmallest(), ⽽不是min()和max()。这两个函数都能接收关键字参数,⽤于复杂的结构数据中:
portfolio = [
{'name': 'IBM', 'shares': 100, 'price': 91.1},{'name': 'AAPL', 'shares': 50, 'price': 3.22},{'name': 'FB', 'shares': 200, 'price': 21.09},{'name': 'HPQ', 'shares': 35, 'price': 31.75},{'name': 'YHOO', 'shares': 45, 'price': 16.35},{'name': 'ACME', 'shares': 75, 'price': 115.65}]
# 参数3为最⼤的3个值(最⼩的3个值)
cheap = heapq.nsmallest(3, portfolio, key=lambda s: s['price'])expensive = heapq.nlargest(3, portfolio, key=lambda s: s['price'])# 上⾯代码在对每个元素进⾏对⽐的时候,会以price的值进⾏⽐较。17. python实现单例模式?
这个题考的是python中对单例模式的理解和运⽤,有4个⽅法实现单例模式:#⽅法1,实现__new__⽅法
#并在将⼀个类的实例绑定到类变量_instance上,
#如果cls._instance为None说明该类还没有实例化过,实例化该类,并返回 #如果cls._instance不为None,直接返回cls._instance class Singleton(object):
def __new__(cls, *args, **kw): if not hasattr(cls, '_instance'):
orig = super(Singleton, cls)
cls._instance = orig.__new__(cls, *args, **kw) return cls._instanceclass MyClass(Singleton): a = 1
one = MyClass() two = MyClass()
two.a = 3 print(one.a) #3
#one和two完全相同,可以⽤id(), ==, is检测 print(id(one)) #29097904 print(id(two)) #29097904
print(one == two)#True
print(one is two) #True
class MyClass2(Borg): a = 1
one = MyClass2() two = MyClass2()
#one和two是两个不同的对象,id, ==, is对⽐结果可看出 two.a = 3 print(one.a)#3
print(id(one)) #28873680 print(id(two)) #28873712
print(one == two)#False
print(one is two) #False
#但是one和two具有相同的(同⼀个__dict__属性),见: print(id(one.__dict__)) #30104000
print(id(two.__dict__)) #30104000
print '----------------------⽅法3--------------------------' #⽅法3:本质上是⽅法1的升级(或者说⾼级)版 #使⽤__metaclass__(元类)的⾼级python⽤法 class Singleton2(type):
def __init__(cls, name, bases, dict):
super(Singleton2, cls).__init__(name, bases, dict) cls._instance = None
def __call__(cls, *args, **kw): if cls._instance is None:
cls._instance = super(Singleton2, cls).__call__(*args, **kw) return cls._instance
class MyClass3(object): __metaclass__ = Singleton2one = MyClass3() two = MyClass3()two.a = 3 print(one.a) #3
print(id(one)) #314972
print(id(two)) #314972
print(one == two) #True
print(one is two) #True
print '----------------------⽅法4--------------------------' #⽅法4:也是⽅法1的升级(⾼级)版本, #使⽤装饰器(decorator),
#这是⼀种更pythonic,更elegant的⽅法,
#单例类本⾝根本不知道⾃⼰是单例的,因为他本⾝(⾃⼰的代码)并不是单例的 def singleton(cls, *args, **kw): instances = {} def _singleton():
if cls not in instances:
instances[cls] = cls(*args, **kw) return instances[cls] return _singleton@singleton
class MyClass4(object): a = 1
def __init__(self, x=0): self.x = x
one = MyClass4() two = MyClass4()two.a = 3 print(one.a) #3
print(id(one)) #29660784 print(id(two)) #29660784
print(one == two) #True
print(one is two) #True one.x = 1 print(one.x) #1
print(two.x)#1
18. 实现⼀个斐波那契数列的⽣成器?
这道题的考点关键是⽣成器的yield关键字将⼀个普通函数改造成⽣成器函数:def fib(n):a, b = 0, 1
for _ in range(n):a, b = b, a + byield a
def main():
for val in fib(20):print(val)
if __name__ == '__main__':main()
19. 使⽤字符串拼接达到字幕滚动效果?import osimport time
def main():
content = '曹查理的python⾯试集-基础篇'while True:
# 清理屏幕上的输出
os.system('cls') # os.system('clear')print(content)# 休眠200毫秒time.sleep(0.2)
content = content[1:] + content[0]if __name__ == '__main__':main()
20. 设计⼀个函数返回给定⽂件名的后缀?
这道题考了正则表达式的简单知识点。代码如下:def get_suffix(filename, has_dot=False):\"\"\"
获取⽂件名的后缀名
:param filename: ⽂件名
:param has_dot: 返回的后缀名是否需要带点:return: ⽂件的后缀名\"\"\"
pos = filename.rfind('.')
if 0 < pos < len(filename) - 1:
index = pos if has_dot else pos + 1return filename[index:]else:return ''
因篇幅问题不能全部显示,请点此查看更多更全内容
Copyright © 2019- sarr.cn 版权所有 赣ICP备2024042794号-1
违法及侵权请联系:TEL:199 1889 7713 E-MAIL:2724546146@qq.com
本站由北京市万商天勤律师事务所王兴未律师提供法律服务