目录
7. 已知a = [1, 2, 3]和b = [1, 2, 4],那么id(a[1])==id(b[1])的执行结果
19. Python中单下划线_foo与双下划线__foo与__foo__的成员,下列说法正确的是?
23.什么是GIL(Global Interpreter Lock)
25.标准库线程安全的队列是哪一个,不安全是哪一个?logging是线程安全的吗?
26.@staticmethod,@classmethod区别
47.MySQL case...when 和 left join
54.Python中的@property有什么作用?如何实现成员变量的只读属性
1. Python的映射类型
映射是一种关联式的容器类型,它存储了对象与对象之间的映射关系,字典是python里唯一的映射类型,它存储了键值对的关联,是由键到键值的映射关系
2.python中的标识符
第一个字符必须是字母表中字母或下划线 _ 。 标识符的其他的部分由字母、数字和下划线组成。 标识符对大小写敏感。 不可以是python中的关键字,如False、True、None、class等。 注意:self不是python中的关键字。类中参数self也可以用其他名称命名,但是为了规范和便于读者理解,推荐使用self。
3. 装饰器
装饰器本质上是一个Python函数,它可以让其他函数在不需要做任何代码变动的前提下增加额外功能,装饰器的返回值也是一个函数对象。它经常用于有切面需求的场景,比如:插入日志、性能测 试、事务处理、缓存、权限校验等场景。装饰器是解决这类问题的绝佳设计,有了装饰器,我们就可以抽离出大量与函数功能本身无关的雷同代码并继续重用。概括的讲,装饰器的作用就是为已经存在的对象添加额外的功能内置装饰器@staticmathod、@classmethod、@property@标记是语法糖(syntactic sugar),可以让你以简单易读得方式装饰目标对象
4.Python中的复数
虚数不能单独存在,它们总是和一个值为 0.0 的实数部分一起来构成一个复数。 复数由实数部分和虚数部分构成 表示虚数的语法: real+image j 实数部分和虚数部分都是浮点数 虚数部分必须有后缀 j 或 J
5.函数参数定义
Python2参数顺序:必选参数、默认参数、可变参数和关键字参数。 Python3参数顺序:必选参数、默认参数、可变参数、命名关键字参数和关键字参数。
6.Python闭包
- 必须有一个内嵌函数
- 内嵌函数必须引用外部函数中的变量
- 外部函数的返回值必须是内嵌函数
def w1():print('正在装饰')def inner():print('正在验证权限')return inner()w1()如果外层函数返回的是一个函数名[return inner]的话,运行结果应该是:正在装饰如果外层函数返回的是函数调用的话,运行结果是:正在装饰 正在验证权限
7. 已知a = [1, 2, 3]和b = [1, 2, 4],那么id(a[1])==id(b[1])的执行结果
True
8.可变与不可变数据类型
可变(mutable)对象类型 :( 列表,字典,集合) list、dict、set、bytearray、user-defined classes (unless specifically made immutable)不可变(immutable)对象类型 :(数字,字符串,元组) int、float、decimal、complex、bool、 str、tuple、range、frozenset、bytes
9.最大公约(因)数
def f(a, b):
if b == 0:
return a
else:
f(b, a % b)
a, b = input("Enter two natural numbers: ")
ans=f(a, b)
a % b 是求余数。辗转相除法,又称欧几里得算法,以除数和余数反复做除法运算,当余数为 0 时,取当前算式除数为最大公约数。
10.比较大小
在进行两者之间的比较时,先从第一个元素开始比较 ASCII 码值大小,如果相等,则依次向后比较,如果全部相等,则比较数量大小。
11.字符串编解码:
urllib.quote(line.decode("gbk").encode("utf-16"))
请问经过该编码的字符串的解码顺序
字符串编译的过程:gbk==>unicode==>utf16==>url解码字符串解码顺序为:url解码==>utf16==>unicode==>gbk
12.质数:
def countPrimes(self, n: int) -> int:
import math
"""
求n以内的所有质数个数
"""
if n < 2: # 小于2质数为0
return 0
sieve = [True] * n # 使用bool类型降低内存消耗
sieve[0] = False
sieve[1] = False # 0和1都不是质数,先排除掉
for i in range(2, int(math.sqrt(n)) + 1):
k = i * 2
# 埃氏筛
while k < n: # 将所有k的倍数置为False/0
sieve[k] = False
k += i
return sum(1 for x in sieve if x)
13.正则匹配字符串
str1 = "Python's features"
str2 = re.match( r'(.*)on(.*?) .*', str1, re.M|re.I)
re.M:多行匹配,影响 ^ 和 $
r表示后面的字符串是一个普通字符串(比如\n会译为\和n,而不是换行符)()符号包住的数据为要提取的数据,通常与.group()函数连用。.匹配单个任意字符*匹配前一个字符出现0次或无限次?匹配前一个字符出现0次或1次(.*)提取的数据为str1字符串中on左边的所有字符,即Pyth(.*?)提取的数据为str1中on右边,空格前面,即's.group(0)输出的是 匹配正则表达式整体结果. group(1) 列出第一个括号匹配部分,.group(2) 列出第二个括号匹配部分
14.python socket操作
数据以字符串形式返回,bufsize指定 最多 可以接收的数量。flag提供有关消息的其他信息,通常可以忽略。
其中data是包含接收数据的字符串,address是发送数据的套接字地址。
通常是一个元组(ipaddr,port)
一般,address的格式为元组(hostname,port),如果连接出错,返回socket.error错误。
backlog指定在拒绝连接之前,可以挂起的最大连接数量。
15. 解释型语言的特性有什么
16. Python元组的定义方式
17. Python内存管理
-
Python 是弱类型脚本语言,变量就是变量, 没有特定类型 ,因此 不需要声明 。
-
但每个变量在 使用前都必须赋值 ,变量赋值以后该变量才会被创建。
-
用 del 语句可以 释放已创建的变量 (已占用的资源)
18.列表 切片操作不会引起下标越界异常
19. Python中单下划线_foo与双下划线__foo与__foo__的成员,下列说法正确的是?
- _foo 不能直接用于’from module import *’
- __foo解析器用_classname__foo来代替这个名字,以区别和其他类相同的命名
- __foo__代表python里特殊方法专用的标识
- __foo 可以直接用于’from module import *’
第四个错误
1、object #公用方法2、_object #半保护#被看作是“protect”,意思是只有类对象和子类对象自己能访问到这些变量, 在模块或类外不可以使用,不能用’from module import *’导入。# __object 是为了避免与子类的方法名称冲突, 对于该标识符描述的方法, 父 类的方法不能轻易地被子类的方法覆盖, 他们的名字实际上是 _classname__methodname。3、_ _ object #全私有,全保护# 私有成员“private”,意思是只有类对象自己能访问 连子类对象也不能访 问到这个数据, 不能用’from module import *’导入 。4、_ _ object_ _ # 内建方法,用户不要这样定义
20. __new__和__init__的区别
-
__init__是当实例对象创建完成后被调用的,然后设置对象属性的一些初始值。
-
__new__是在实例创建之前被调用的,因为它的任务就是创建实例然后返回该实例,是个静态方法。
- __new__是一个静态方法,而__init__是一个实例方法.
- __new__方法会返回一个创建的实例,而__init__什么都不返回.
- 只有在__new__返回一个cls的实例时后面的__init__才能被调用.
- 当创建一个新实例时调用__new__,初始化一个实例时用__init__.
21.Python函数
- 函数可以赋值给一个变量
- 函数可以作为元素添加到集合对象中
- 函数可以作为参数值传递给其它函数
- 函数可以当做函数的返回值
22.python参数传递是值传递还是引用传递
23.什么是GIL(Global Interpreter Lock)
24 with原理
with 语句实质是上下文管理。1、上下文管理协议。包含方法__enter__() 和 __exit__(),支持该协议对象要实现这两个方法。2、上下文管理器,定义执行with语句时要建立的运行时上下文,负责执行with语句块上下文中的进入与退出操作。3、进入上下文的时候执行__enter__方法,如果设置as var语句,var变量接受__enter__()方法返回值。4、如果运行时发生了异常,就退出上下文管理器。调用管理器__exit__方法。with语句适用于对资源进行访问的场合,确保不管使用过程中是否发生异常都会执行必要的“清理”操作,释放资源,比如文件使用后自动关闭、线程中锁的自动获取和释放等。
25.标准库线程安全的队列是哪一个,不安全是哪一个?logging是线程安全的吗?
线程安全即解决线程同步问题,Queue是线程安全队列,logging是线程安全的。
1、python queue模块的FIFO队列先进先出2、LIFO类似于堆。即先进后出。3、还有一种是优先级队列级别越低越先出来。
1、class Queue.Queue(maxsize) FIFO2、class Queue.LifoQueue(maxsize) LIFO3、class Queue.PriorityQueue(maxsize) 优先级队列
26.@staticmethod,@classmethod区别
-
对于classmethod的参数,需要隐式地传递类名,而staticmethod参数中则不需要传递类名,其实这就是二者最大的区别。
-
二者都可以通过类名或者类实例对象来调用,因为强调的是classmethod和staticmethod,所以在写代码的时候最好使用类名。
-
对于staticmethod就是为了要在类中定义而设置的,一般来说很少这样使用,可以使用模块级(module-level)的函数来替代它。既然要把它定义在类中,想必有作者的考虑。
-
对于classmethod,可以通过子类来进行重定义。
27.迭代器、生成器
[迭代器的优点]:使用迭代器不要求事先准备好整个迭代过程中的所有元素。迭代器仅仅在迭代到某个元素时才计算该元素,而在这之前或之后元素可以不存在或者被销毁。因此 迭代器适合遍历一些数量巨大甚至无限的序列 。
可以直接作用于for循环的对象统称为可迭代对象:Iterable。
生成器都是Iterator对象,但list、dict、str虽然是Iterable,却不是Iterator。
28.猴子补丁(Monkey Patching)
因为猴子补丁破坏了封装,而且容易导致程序与补丁代码的实现细节紧密耦合,所以被视为临时的变通方案,不是集成代码的推荐方式。
- 进程是具有一定独立功能的程序关于某个数据集合上的一次运行活动,
- 进程是系统进行资源分配和调度的一个独立单位。
- 每个进程都有自己的独立内存空间,不同进程通过进程间通信来通信。
- 由于进程比较重量,占据独立的内存,所以上下文进程间的切换开销(栈、寄存器、虚拟内存、文件句柄等)比较大,但相对比较稳定安全。
- 线程是进程的一个实体,是CPU调度和分派的基本单位,它是比进程更小的能独立运行的基本单位.
- 线程自己基本上不拥有系统资源,只拥有一点在运行中必不可少的资源(如程序计数器,一组寄存器和栈),但是它可与同属一个进程的其他的线程共享进程所拥有的全部资源。
- 线程间通信主要通过共享内存,上下文切换很快,资源开销较少,但相比进程不够稳定容易丢失数据。
- 协程是一种用户态的轻量级线程,协程的调度完全由用户控制。
- 协程拥有自己的寄存器上下文和栈。
- 协程调度切换时,将寄存器上下文和栈保存到其他地方,在切回来的时候,恢复先前保存的寄存器上下文和栈,直接操作栈则基本没有内核切换的开销,可以不加锁的访问全局变量,所以上下文的切换非常快。
简单点说协程是进程和线程的升级版,
进程和线程都面临着内核态和用户态的切换问题而耗费许多切换时间,而协程就是用户自己控制切换的时机,不再需要陷入系统的内核态
线程是指进程内的一个执行单元,也是进程内的可调度实体。线程与进程的区别:1) 地址空间:线程是进程内的一个执行单元,进程内至少有一个线程,它们共享进程的地址空间,而进程有自己独立的地址空间2) 资源拥有:进程是资源分配和拥有的单位,同一个进程内的线程共享进程的资源3) 线程是处理器调度的基本单位,但进程不是4) 二者均可并发执行5) 每个独立的线程有一个程序运行的入口、顺序执行序列和程序的出口,但是线程不能够独立执行,必须依存在应用程序中,由应用程序提供多个线程执行控制
1) 一个线程可以多个协程,一个进程也可以单独拥有多个协程,这样python中则能使用多核CPU。2) 线程进程都是同步机制,而协程则是异步3) 协程能保留上一次调用时的状态,每次过程重入时,就相当于进入上一次调用的状态
30.调度算法
31.死锁
互斥条件:进程要求对所分配的资源进行排它性控制,即在一段时间内某资源仅为一进程所占用。 请求和保持条件:当进程因请求资源而阻塞时,对已获得的资源保持不放。 不剥夺条件:进程已获得的资源在未使用完之前,不能剥夺,只能在使用完时由自己释放。 环路等待条件:在发生死锁时,必然存在一个进程--资源的环形链。
- 资源一次性分配:一次性分配所有资源,这样就不会再有请求了:(破坏请求条件)
- 只要有一个资源得不到分配,也不给这个进程分配其他的资源:(破坏请保持条件)
- 可剥夺资源:即当某进程获得了部分资源,但得不到其它资源,则释放已占有的资源(破坏不可剥夺条件)
- 资源有序分配法:系统给每类资源赋予一个编号,每一个进程按编号递增的顺序请求资源,释放则相反(破坏环路等待条件)
首先为每个进程和每个资源指定一个唯一的号码; 然后建立资源分配表和进程等待表。
剥夺资源:从其它进程剥夺足够数量的资源给死锁进程,以解除死锁状态; 撤消进程:可以直接撤消死锁进程或撤消代价最小的进程,直至有足够的资源可用,死锁状态.消除为止;所谓代价是指优先级、运行代价、进程的重要性和价值等。
32.Python运算符的优先顺序
33.Python是如何进行内存管理的?
Python内部使用引用计数,来保持追踪内存中的对象,所有对象都有引用计数。引用计数增加的情况:1,一个对象分配一个新名称2,将其放入一个容器中(如列表、元组或字典)引用计数减少的情况:1,使用del语句对对象别名显示的销毁2,引用超出作用域或被重新赋值sys.getrefcount( )函数可以获得对象的当前引用计数多数情况下,引用计数比你猜测得要大得多。对于不可变数据(如数字和字符串),解释器会在程序的不同部分共享内存,以便节约内存。
1,当一个对象的引用计数归零时,它将被垃圾收集机制处理掉。2,当两个对象a和b相互引用时,del语句可以减少a和b的引用计数,并销毁用于引用底层对象的名称。然而由于每个对象都包含一个对其他对象的应用,因此引用计数不会归零,对象也不会销毁。(从而导致 内存泄露 )。为解决这一问题,解释器会定期执行一个循环检测器,搜索不可访问对象的循环并删除它们。3, 分代回收,将系统中的所有内存块根据其存活时间划分为不同的集合,每一个集合就成为一个“代”,Python默认定义了三代对象集合,垃圾收集的频率随着“代”的存活时间的增大而减小 , 存活时间通常是利用几次垃圾收集动作来衡量也就是说,活得越长的对象,就越不可能是垃圾,就应该减少对它的垃圾收集频率。
Python提供了对内存的垃圾收集机制,但是它将不用的内存放到内存池而不是返回给操作系统。1,Pymalloc机制。为了加速Python的执行效率,Python引入了一个内存池机制,用于管理对小块内存的申请和释放。2,Python中所有小于256个字节的对象都使用pymalloc实现的分配器,而大的对象则使用系统的malloc。3,对于Python对象,如整数,浮点数和List,都有其独立的私有内存池,对象间不共享他们的内存池。也就是说如果你分配又释放了大量的整数,用于缓存这些整数的 内存就不能再分配给浮点数。
34. 垃圾回收机制
当一个对象的引用被创建或者复制时,对象的引用计数加1;当一个对象的引用被销毁时,对象的引用计数减1,当对象的引用计数减少为0时,就意味着对象已经再没有被使用了,可以将其内存释放掉。
基本思路是先按需分配,等到没有空闲内存的时候从寄存器和程序栈上的引用出发,遍历以对象为节点、以引用为边构成的图,把所有可以访问到的对象打上标记,然后清扫一遍内存空间,把所有没标记的对象释放。
将系统中的所有内存块根据其存活时间划分为不同的集合,每一个集合就成为一个“代”,Python默认定义了三代对象集合,垃圾收集的频率随着“代”的存活时间的增大而减小, 存活时间通常是利用几次垃圾收集动作来衡量。
35.什么是lambda函数?它有什么好处?
36.(赋值,浅拷贝,深拷贝的区别)
就是创建了对象的一个新的引用,修改其中任意一个变量都会影响到另一个。
创建一个新的对象,但它包含的是对原始对象中包含项的引用(如果用引用的方式修改其中一个对象,另外一个也会修改改变){1,完全切片方法;2,工厂函数,如list();3,copy模块的copy()函数}
创建一个新的对象,并且递归的复制它所包含的对象(修改其中一个,另外一个不会改变){copy模块的deep.deepcopy()函数}
37.Python中pass语句的作用是什么?
38.Python查询和替换一个文本字符串
39.map,reduce,filter
list(map(str,[1,2,3]))#['1','2','3']
reduce(lambda x,y:x*10+y,[1,2,3,4] )#结果:1234
list(filter(lambda x: x % 2 == 1, [1, 2, 4, 5, 6, 9, 10, 15]))# 结果: [1, 5, 9, 15]
40.Python使用简单的方式实现问号表达式:
n = (a > b) and a or b#主要用到逻辑运算符的优先级(not >and > or)以及隔断性质
41.正则提取网页链接
href=re.findall(r'<a.*?href=(http://.*?)>',string)
42.正则匹配ip
m=re.search('ip=(\d(1,3)\.\d(1,3).\d(1,3).\d(1,3))',src,re.S)print(m.group(1))
43.inspect模块的作用
44.字符串格式化:%和.format的区别
45.实现一个字典类,要求元素只能被设置一次
class CDict(dict):
def __setitem__(self, key, value):
if self.__contains__(key):
raise ValueError('The Value Existes')
else:
super(CDict, self).__setitem__(key, value)
if __name__ == '__main__':
d=CDict()
d['hello']='world'
d['hello']='1111'
46. 使用修饰器实现一个单例
实现单例模式主要有四种方法:__new__、共享属性、装饰器、import。
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 MyClass(object):
a = 1
def __init__(self, x=0):
self.x = x
if __name__ == '__main__':
one = MyClass()
two = MyClass()
one.x = 2
two.a = 5
print(one.x)# 2
print(two.x)# 2
print(one.a)# 5
print(one.a)# 5
47.MySQL case...when 和 left join
name subject score name level张三 数学 97 张三 1张五 数学 63 张五 5杨七 科学 84 杨七 4杨三 科学 88 杨三 8王五 语文 54 王五 2王六 语文 72 王六 6赵七 英语 91 赵七 7赵六 英语 78 赵六 3
select *from (
select case
when (score >=60 and score <70) then "60-70"
when (score >=70 and score <80) then "70-80"
when (score >=80 and score <90) then "80-90"
when (score >=90 ) then "90-100"
else '100'
end "val1",
count(*) 'val2' from demo1
group by
case
when (score >=60 and score <70) then "60-70"
when (score >=70 and score <80) then "70-80"
when (score >=80 and score <90) then "80-90"
when (score >=90 ) then "90-100"
end
order by 1
) as bbb
where bbb.val2>=2
select distinct
demo2.name,level from demo1 left join demo2 on (demo2.level>5);
48.*args与**kwargs
49.Python命名空间(作用域)
Python使用叫做命名空间的东西来记录变量的轨迹。命名空间是一个 字典(dictionary) ,它的键就是变量名,它的值就是那些变量的值。
Python的变量名解析机制也称为 LEGB 法则:本地作用域(Local)→当前作用域被嵌入的本地作用域(Enclosing locals)[存在嵌套函数]→全局/模块作用域(Global)→内置作用域(Built-in)
50.为什么lambda没有语句
51.Python docstring
52.简述函数式编程
53.如何捕获异常,常用的异常机制有哪些?
- try...except...finally语句
- assert语句:判断assert后面紧跟的语句是True还是False,如果是True则继续执行print,如果是False则中断程序,调用默认的异常处理器,同时输出assert语句逗号后面的提示信息。
- with语句:如果with语句或语句块中发生异常,会调用默认的异常处理器处理,但文件还是会正常关闭。
54.Python中的@property有什么作用?如何实现成员变量的只读属性
55.什么是Python
-
Python是一种解释型语言。这就是说,与C语言和C的衍生语言不同,Python代码在运行之前不需要编译。其他解释型语言还包括PHP和Ruby。
-
Python是动态类型语言,指的是你在声明变量时,不需要说明变量的类型。你可以直接编写类似x=111和x="I'm a string"这样的代码,程序不会报错。
-
Python非常适合面向对象的编程(OOP),因为它支持通过组合(composition)与继承(inheritance)的方式定义类(class)。Python中没有访问说明符(access specifier,类似C++中的public和private),这么设计的依据是“大家都是成年人了”。
-
在Python语言中,函数是第一类对象(first-class objects)。这指的是它们可以被指定给变量,函数既能返回函数类型,也可以接受函数作为输入。类(class)也是第一类对象。
-
Python代码编写快,但是运行速度比编译语言通常要慢。好在Python允许加入基于C语言编写的扩展,因此我们能够优化代码,消除瓶颈,这点通常是可以实现的。numpy就是一个很好地例子,它的运行速度真的非常快,因为很多算术运算其实并不是通过Python实现的。
-
Python用途非常广泛——网络应用,自动化,科学建模,大数据应用,等等。它也常被用作“胶水语言”,帮助其他语言和组件改善运行状况。
-
Python让困难的事情变得容易,因此程序员可以专注于算法和数据结构的设计,而不用处理底层的细节。
55.设计模式
56.Python自省
57.什么是PEP8
58.CRSF是什么
59.for-else
for i in range(4):
print(i)
#break
else:
print('end')
60.super在多继承的解析
super(),当出现多继承时,调用的顺序是根据类实例化时的执行顺序决定。
class A:
def __init__(self):
print('Enter A')
print('Exit A')
class B(A):
def __init__(self):
print('Enter B')
super(B, self).__init__()
print('Exit B')
class C(A):
def __init__(self):
print('Enter C')
print(super())
super(C, self).__init__()
print('Exit C')
class D(B,C):
def __init__(self):
print('Enter D')
print(super())
super(D, self).__init__()
print('Exit D')
if __name__ == '__main__':
# single=B()#单继承情况
# print(B.mro())#[<class '__main__.B'>, <class '__main__.A'>, <class 'object'>]
'''
创建B类的实例化对象时,执行初始化函数:
打印输出Enter B,
当遇到super()调用父类初始化函数(此时是调用B类的父类A的__init__函数),
输出Enter A、Exit A,
调用完成父类初始化函数后,继续执行下一句代码,
输出Leave B
'''
multi=D()
print(D.mro())#[<class '__main__.D'>, <class '__main__.B'>, <class '__main__.C'>, <class '__main__.A'>, <class 'object'>]
'''
解析:
1、执行顺序:D->B->C->A->object
2、根据执行顺序,执行D类,
输出Enter D,
第一次执行super()时,调用D的父类B的__init__(),
输出Enter B,
第二次执行super()时,则调用D的父类C的__init__(),
输出Enter C,
第三次执行super()时,则调用A类的__init__(),
输出Enter A和Exit A
C类执行完super().__init__()后,继续执行下一句,
输出Exit C
B类执行完super().__init__()后,继续执行下一句,
输出Exit B
D类执行完super().__init__()后,继续执行下一句,
输出Exit D
'''