Python常见面试题

1、如何在一个函数内部修改全局变量?

  • 利用global关键字
a = 10
def func():
    global a
    a = 4
func()
print(a)
4

2、字典如何删除键和合并两个字典

  • del 和 update
dic = {'name':"zx", "age":18}
del dic['name']
print(dic)

dic2 = {"name":"ls"}
dic.update(dic2)
print(dic)
{'age': 18}
{'age': 18, 'name': 'ls'}

3、谈下python的GIL

  • GIL 是python的全局解释器锁,同一进程中假如有多个线程运行,一个线程在运行python程序的时候会霸占python解释器(加了一把锁即GIL),使该进程内的其他线程无法运行,等该线程运行完后其他线程才能运行。如果线程运行过程中遇到耗时操作,则解释器锁解开,使其他线程运行。所以在多线程中,线程的运行仍是有先后顺序的,并不是同时进行。

  • 多进程中因为每个进程都能被系统分配资源,相当于每个进程有了一个python解释器,所以多进程可以实现多个进程的同时运行,缺点是进程系统资源开销大

4、fun(* args, ** kwargs)中的* args, ** kwargs什么意思?

  • * args 和 ** kwargs主要用于函数定义,当我们不知道需要给函数传入几个参数时,可以使用。q其中,前者用于传入非键值对的若干个参数,后者用于传入键值对类型的若干个参数。
def func(a, *args):
    print("第一个位置参数:", a)
    for arg in args:
        print(arg)
func(10, 2,3, 4)
第一个位置参数: 10
2
3
4
def func(**args):
    for k,v in args.items():
        print(k,'=',v)
func(name='Tom', age=18, grade=79)
age = 18
grade = 79
name = Tom

5、一句话解释什么样的语言能够用装饰器?

  • 函数可以作为参数传递的语言,可以使用装饰器

6、简述面向对象中__new__和__init__区别

  • __init__是初始化方法,创建对象后,就立刻被默认调用了,可接收参数
  • 1、__new__至少要有一个参数cls,代表当前类,此参数在实例化时由Python解释器自动识别
  • 2、__new__必须要有返回值,返回实例化出来的实例,这点在自己实现__new__时要特别注意,可以return父类(通过super(当前类名, cls))__new__出来的实例,或者直接是object的__new__出来的实例
  • 3、__init__有一个参数self,就是这个__new__返回的实例,__init__在__new__的基础上可以完成一些其它初始化的动作,__init__不需要返回值
  • 4、如果__new__创建的是当前类的实例,会自动调用__init__函数,通过return语句里面调用的__new__函数的第一个参数是cls来保证是当前类实例,如果是其他类的类名,;那么实际创建返回的就是其他类的实例,其实就不会调用当前类的__init__函数,也不会调用其他类的__init__函数。
class A:
    def __init__(self):
        print("这是init方法", self)
    def __new__(cls):
        print("这是cls的ID",id(cls))
        print("这是new方法",object.__new__(cls))
        return object.__new__(cls)
A()
print("这是A的ID", id(A))
这是cls的ID 2790382132232
这是new方法 <__main__.A object at 0x00000289B1B6A7B8>
这是init方法 <__main__.A object at 0x00000289B1B6A7B8>
这是A的ID 2790382132232
  • 可以看出new方法先执行,init后执行

7、简述with方法打开处理文件帮我我们做了什么?

  • 打开文件在进行读写的时候可能会出现一些异常状况,如果按照常规的f.open写法,我们需要try,except,finally,做异常判断,并且文件最终不管遇到什么情况,都要执行finally f.close()关闭文件,with方法帮我们实现了finally中f.close

8、map()函数

  • map()函数第一个参数是fun,第二个参数是一般是list,第三个参数可以写list,也可以不写,根据需求
def func(x):
    return x**3

a = [1,2,3,4]
list(map(func,a))
[1, 8, 27, 64]

9、python中生成随机整数、随机小数、0–1之间小数方法

import random
import numpy as np
#随机整数
r1 = random.randint(10,20)

#随机小数,不接受参数
r2 = random.random()

#随机小数,接受参数
r3 = np.random.randn(5)

print(r1,'\n',r2,'\n',r3)
16 
 0.0008725290445489309 
 [-0.2745898   0.23278596 -0.17696145  1.02689094  0.99604349]
r2
0.726860396639525

8、断言assert

  • 断言成功则继续执行,失败则报错
a = 7
assert(a>4)
print("断言成功")

assert(a>10)
print("断言失败")
断言成功



---------------------------------------------------------------------------

AssertionError                            Traceback (most recent call last)

 in ()
      3 print("断言成功")
      4 
----> 5 assert(a>10)
      6 print("断言失败")


AssertionError: 

9、可变数据类型和不可变数据类型

  • 不可变的有:数值型、字符串型、元组tuple
  • 可变的有:数组、字典
a=3
b=3
print(id(a), id(b))
b=4
print(id(a), id(b))
1905423056 1905423056
1905423056 1905423088
a='abc'
b='abc'
print(id(a), id(b))
b='abcd'
print(id(a), id(b))
2790330770968 2790330770968
2790330770968 2790418724432
a=[1,2,3]
b=[1,2,3]
print(id(a), id(b))
b = [1,2,3,4,5]
print(id(a), id(b))
2790418675592 2790418674824
2790418675592 2790418675080

10、sort()和sorted()的区别

  • sort()对原数组排序,sorted()排序后返回一个新的对象
a = [3,1,4,8,2]
a.sort()
print(a)
[1, 2, 3, 4, 8]
a = [3,1,4,8,2]
b = sorted(a)
print(a)
print(b)
[3, 1, 4, 8, 2]
[1, 2, 3, 4, 8]

11、lambda匿名函数

Sum  = lambda a,b:a+b
print(Sum(1,2))
3

12、字典根据键从小到大排序

dict1={'a':2,'e':3,'f':8,'d':4}
dict2 = sorted(dict1)
print(dict2)#默认是对字典的键进行排序
['a', 'd', 'e', 'f']
dict1={'a':2,'e':3,'f':8,'d':4}
print(dict1.items())
list1= sorted(dict1.items(),key=lambda x:x[1])
print(list1)
dict_items([('d', 4), ('f', 8), ('a', 2), ('e', 3)])
[('a', 2), ('e', 3), ('d', 4), ('f', 8)]
dict1={'a':2,'e':3,'f':8,'d':4}
list1= sorted(dict1.items(),key=lambda x:x[0])
print(list1)
[('a', 2), ('d', 4), ('e', 3), ('f', 8)]
dict(list1)
{'a': 2, 'd': 4, 'e': 3, 'f': 8}

12、正则表达式的使用

import re
a = "not 404 found 张三 99 深圳"
L = a.split()
print(L)
print('---------------------------------------------')
res = re.findall('\d+|[a-zA-Z]+',a)#匹配数字和字符
print(res)
print('---------------------------------------------')
for i in res:
    if i in L:
        L.remove(i)
new_str = ' '.join(L)
print(new_str)

['not', '404', 'found', '张三', '99', '深圳']
---------------------------------------------
['not', '404', 'found', '99']
---------------------------------------------
张三 深圳

13、filter()函数的用法

  • filter() 函数用于过滤序列,过滤掉不符合条件的元素,返回由符合条件元素组成的新列表。该接收两个参数,第一个为函数,第二个为序列,序列的每个元素作为参数传递给函数进行判,然后返回 True 或 False,最后将返回 True 的元素放到新列表
a = [1,2,3,4,5,6,7,8,9,10]
def fn(n):
    return n%2==1
res = filter(fn,a)
print(list(res))
[1, 3, 5, 7, 9]

14、列表推导式

a = [1,2,3,4,5,6,7,8,9,10]
res = [i for i in a if i%2==1]
print(res)
[1, 3, 5, 7, 9]

14、数据类型判断

a = (1)
b = (1,)
c = ('1')
d = ('1',)
print(type(a), type(b), type(c), type(d))
   

15、extend() 和append()的区别

L1 = [1,2,3,4]
L2 = [5,6,7,8]
L1.extend(L2)#将对象的每个元素逐个添加
print(L1)

L3 = [10,10]
L2.append(L3)#将对象作为一个整体添加
print(L2)
[1, 2, 3, 4, 5, 6, 7, 8]
[5, 6, 7, 8, [10, 10]]

16、数据库优化查询方法

  • 外键、索引、联合查询、选择特定字段等等

17、raise异常

def fn():
    try:
        for i in range(5):
            if i>2:
                raise Exception("数字大与2了")
            else:
                print(i)
    except Exception as ret:
        print(ret)

fn()
0
1
2
数字大与2了

18、正则表达式匹配中,(.)和(.?)匹配区别?

  • (.*)是贪婪匹配,会把满足正则的尽可能多的往后匹配
  • (.*?)是非贪婪匹配,会把满足正则的尽可能少匹配
import re 
s = "哈哈呵呵"
res1 = re.findall("(.*)",s)

res2 = re.findall("(.*?)", s)

print(res1)
print(res2)
['哈哈呵呵']
['哈哈', '呵呵']

19、[[1,2],[3,4],[5,6]]一行代码展开该列表,得出[1,2,3,4,5,6]

a = [[1,2],[3,4],[5,6]]
res = [i for items in a for i in items]
print(res)
[1, 2, 3, 4, 5, 6]

20、join()的用法

  • join()括号里面的是可迭代对象,x插入可迭代对象中间,形成字符串,结果一致,有没有突然感觉字符串的常见操作都不会玩了
# x="abc",y="def",z=["d","e","f"],分别求出x.join(y)和x.join(z)返回的结果
x = 'abc'
y = 'def'
z = ["d", "e", "f"]
m = x.join(y)
n = x.join(z)
print(m)
print(n)
dabceabcf
dabceabcf

21、异常处理

  • 举例说明异常模块中try except else finally的相关意义

  • try…except…else没有捕获到异常,执行else语句

  • try…except…finally不管是否捕获到异常,都执行finally语句

try :
    num = 100
    print(num)
except NameError as errorMsg:
    print("产生了错误: %s"%errorMsg)
else:
    print("没有产生错误,执行此句")
finally:
    print("不管是否捕获异常,均执行此句")
100
没有产生错误,执行此句
不管是否捕获异常,均执行此句

22、zip()函数

  • zip()函数在运算时,会以一个或多个序列(可迭代对象)做为参数,返回一个元组的列表。同时将这些序列中并排的元素配对。
  • zip()参数可以接受任何类型的序列,同时也可以有两个以上的参数;当传入参数的长度不同时,zip能自动以最短序列长度为准进行截取,获得元组。
a = [1,2,3]
b = ['a','b','c']
c = [10,20,30,40]
d = "ABC"

print(list(zip(a,b)))
print(list(zip(a,c)))
print(list(zip(a,d)))
[(1, 'a'), (2, 'b'), (3, 'c')]
[(1, 10), (2, 20), (3, 30)]
[(1, 'A'), (2, 'B'), (3, 'C')]

23、正则表达式替换

import re 
a = "张明 98分"
res = re.sub(r"\d+", "100", a)
print(res)
张明 100分

24、编码

  • a="hello"和b="你好"编码成bytes类型
a = b'hello'
b = "哈哈".encode()
print(a,type(a))
print(b, type(b))
b'hello' 
b'\xe5\x93\x88\xe5\x93\x88' 

25、列表相加

a = [1,2,3]
b = [3,4,5]
print(a+b)
[1, 2, 3, 3, 4, 5]

26、简述mysql和redis区别

  • redis: 内存型非关系数据库,数据保存在内存中,速度快

  • mysql:关系型数据库,数据保存在磁盘中,检索的话,会有一定的Io操作,访问速度相对慢

27、单例模式

  • 因为创建对象时__new__方法执行,并且必须return 返回实例化出来的对象所cls.__instance是否存在,不存在的话就创建对象,存在的话就返回该对象,来保证只有一个实例对象存在(单列),打印ID,值一样,说明对象同一个
class Singleton(object):
    __instance = None
    def __new__(cls,age,name):
        if not cls.__instance:
            cls.__instance = object.__new__(cls)
        return cls.__instance

a = Singleton(18,'dog')
b = Singleton(19, 'dog')
print(id(a))
print(id(b))
2790418922968
2790418922968

28、保留两位小数

a = 123.456789
print("%.2f"%a)
print("{:.2f}".format(a))
print(round(a,2))
123.46
123.46
123.46

29、列出常见的状态码

  • 列出常见的状态码和意义

    • 200 OK 请求正常处理完毕

    • 204 No Content 请求成功处理,没有实体的主体返回

    • 206 Partial Content GET范围请求已成功处理

    • 301 Moved Permanently 永久重定向,资源已永久分配新URI

    • 302 Found 临时重定向,资源已临时分配新URI

    • 303 See Other 临时重定向,期望使用GET定向获取

    • 304 Not Modified 发送的附带条件请求未满足

    • 307 Temporary Redirect 临时重定向,POST不会变成GET

    • 400 Bad Request 请求报文语法错误或参数错误

    • 401 Unauthorized 需要通过HTTP认证,或认证失败

    • 403 Forbidden 请求资源被拒绝

    • 404 Not Found 无法找到请求资源(服务器无理由拒绝)

    • 500 Internal Server Error 服务器故障或Web应用故障

    • 503 Service Unavailable服务器超负载或停机维护

30、使用pop和del删除字典中的"name"字段

d1 = {"name":"Tom", "age":18, "grade":89}
print(d1)
d1.pop("name")
print(d1)
del d1['age']
print(d1)
{'age': 18, 'grade': 89, 'name': 'Tom'}
{'age': 18, 'grade': 89}
{'grade': 89}

31、列出常见MYSQL数据存储引擎

  • InnoDB:支持事务处理,支持外键,支持崩溃修复能力和并发控制。如果需要对事务的完整性要求比较高(比如银行),要求实现并发控制(比如售票),那选择InnoDB有很大的优势。如果需要频繁的更新、删除操作的数据库,也可以选择InnoDB,因为支持事务的提交(commit)和回滚(rollback)。

  • MyISAM:插入数据快,空间和内存使用比较低。如果表主要是用于插入新记录和读出记录,那么选择MyISAM能实现处理高效率。如果应用的完整性、并发性要求比 较低,也可以使用。

  • MEMORY:所有的数据都在内存中,数据的处理速度快,但是安全性不高。如果需要很快的读写速度,对数据的安全性要求较低,可以选择MEMOEY。它对表的大小有要求,不能建立太大的表。所以,这类数据库只使用在相对较小的数据库表。

32、列表、元组转换为字典

a = [['A',1],["B",2]]
dict(a)
{'A': 1, 'B': 2}
a = [('A',1),("B",2)]
dict(a)
{'A': 1, 'B': 2}

33、同源策略

  • 同源策略需要同时满足以下三点要求:

    • 1)协议相同

    • 2)域名相同

    • 3)端口相同

  • http://www.test.com与https://www.test.com 不同源——协议不同

  • http://www.test.com与http://www.admin.com 不同源——域名不同

  • http://www.test.com与http://www.test.com:8081 不同源——端口不同

  • 只要不满足其中任意一个要求,就不符合同源策略,就会出现“跨域”

34、简述cookie和session的区别

  • 1、session 在服务器端,cookie 在客户端(浏览器)

  • 2、session 的运行依赖 session id,而 session id 是存在 cookie 中的,也就是说,如果浏览器禁用了 cookie ,同时 session 也会失效,存储Session时,键与Cookie中的sessionid相同,值是开发人员设置的键值对信息,进行了base64编码,过期时间由开发人员设置

  • 3、cookie安全性比session差

35、简述多线程、多进程

进程:

1、操作系统进行资源分配和调度的基本单位,多个进程之间相互独立

2、稳定性好,如果一个进程崩溃,不影响其他进程,但是进程消耗资源大,开启的进程数量有限制

线程:

1、CPU进行资源分配和调度的基本单位,线程是进程的一部分,是比进程更小的能独立运行的基本单位,一个进程下的多个线程可以共享该进程的所有资源

2、如果IO操作密集,则可以多线程运行效率高,缺点是如果一个线程崩溃,都会造成进程的崩溃

应用:

IO密集的用多线程,在用户输入,sleep 时候,可以切换到其他线程执行,减少等待的时间

CPU密集的用多进程,因为假如IO操作少,用多线程的话,因为线程共享一个全局解释器锁,当前运行的线程会霸占GIL,其他线程没有GIL,就不能充分利用多核CPU的优势

36、python中copy和deepcopy区别

  • 1、复制不可变数据类型,不管copy还是deepcopy,都是同一个地址。当浅复制的值是不可变对象(数值,字符串,元组)时和=“赋值”的情况一样,对象的id值与浅复制原来的值相同。
import copy
a = '哈哈'
b = a
c = copy.copy(a)
d = copy.deepcopy(a)
print(a, id(a))
print(b, id(b))
print(c, id(c))
print(d, id(d))
哈哈 2790419001872
哈哈 2790419001872
哈哈 2790419001872
哈哈 2790419001872
  • 2、复制的值是可变对象(列表和字典)

    • 浅拷贝copy有两种情况:

      • 第一种情况:复制的 对象中无 复杂 子对象,原来值的改变并不会影响浅复制的值,同时浅复制的值改变也并不会影响原来的值。原来值的id值与浅复制原来的值不同。

      • 第二种情况:复制的对象中有 复杂 子对象 (例如列表中的一个子元素是一个列表), 改变原来的值 中的复杂子对象的值 ,会影响浅复制的值。

    • 深拷贝deepcopy:完全复制独立,包括内层列表和字典

L1 = [1,2,3]
L2 = [1,2,[3,4]]
L11 = copy.copy(L1)
L12 = copy.deepcopy(L1)

L21 = copy.copy(L2)
L22 = copy.deepcopy(L2)

print(L1, id(L1))
print(L11, id(L11))
print(L12, id(L12))

print('----------------')
print(L2, id(L2))
print(L21, id(L21))
print(L22, id(L22))
[1, 2, 3] 2790418822216
[1, 2, 3] 2790418790728
[1, 2, 3] 2790419008072
----------------
[1, 2, [3, 4]] 2790418824200
[1, 2, [3, 4]] 2790419042696
[1, 2, [3, 4]] 2790418975432
L1[0] = 10
print(L1, L11,L12)
[10, 2, 3] [1, 2, 3] [1, 2, 3]
L2[0] = 10
print(L2,L21,L22)
[10, 2, [3, 4]] [1, 2, [3, 4]] [1, 2, [3, 4]]
L2[2][0] = 30
print(L2,L21,L22)
[10, 2, [30, 4]] [1, 2, [30, 4]] [1, 2, [3, 4]]

37、列出几种魔法方法并简要介绍用途

  • __init__:对象初始化方法

  • __new__:创建对象时候执行的方法,单列模式会用到

  • __str__:当使用print输出对象的时候,只要自己定义了__str__(self)方法,那么就会打印从在这个方法中return的数据

  • __del__:删除对象执行的方法

38、C:\Users\ry-wu.junya\Desktop>python 1.py 22 33命令行启动程序并传参,print(sys.argv)会输出什么数据?

  • [‘1.py’, ‘22’, ‘33’]

39、请将[i for i in range(3)]改成生成器

  • 生成器是特殊的迭代器,

    • 1、列表表达式的[ ]改为()即可变成生成器

    • 2、函数在返回值得时候出现yield就变成生成器,而不是函数了;

a = [i for i in range(5)]
print(type(a))

b = (i for i in range(5))
print(type(b))

next(b)
0

40、对list排序foo = [-5,8,0,4,9,-4,-20,-2,8,2,-4],使用lambda函数从小到大排序

foo =  [-5,8,0,4,9,-4,-20,-2,8,2,-4]
a = sorted(foo, key=lambda x:x)
print(a)
[-20, -5, -4, -4, -2, 0, 2, 4, 8, 8, 9]

41 、使用lambda函数对list排序foo = [-5,8,0,4,9,-4,-20,-2,8,2,-4],输出结果为[0,2,4,8,8,9,-2,-4,-4,-5,-20],正数从小到大,负数从大到小

foo = [-5,8,0,4,9,-4,-20,-2,8,2,-4]
a = sorted(foo, key=lambda x:(x<0,abs(x)))
print(a)
[0, 2, 4, 8, 8, 9, -2, -4, -4, -5, -20]
f=lambda x:(x<0,abs(x))
f(9)
(False, 9)
f(-9)
(True, 9)

42、列表嵌套字典,根据年龄和性名排序

foo = [{"name":"zs","age":19},{"name":"ll","age":54},{"name":"wa","age":17},{"name":"df","age":23}]
res1 = sorted(foo, key=lambda x: x["age"])
print(res1)

res2 = sorted(foo, key=lambda x:x['name'])
print(res2)
[{'age': 17, 'name': 'wa'}, {'age': 19, 'name': 'zs'}, {'age': 23, 'name': 'df'}, {'age': 54, 'name': 'll'}]
[{'age': 23, 'name': 'df'}, {'age': 54, 'name': 'll'}, {'age': 17, 'name': 'wa'}, {'age': 19, 'name': 'zs'}]

43、列表嵌套元组,分别按字母和数字排序

foo = [("zs",19),("wd", 30),("wa", 10),("fr",32)]
res1 = sorted(foo, key=lambda x:x[0])
print(res1)

res2 = sorted(foo, key=lambda x:x[1])
print(res2)

[('fr', 32), ('wa', 10), ('wd', 30), ('zs', 19)]
[('wa', 10), ('zs', 19), ('wd', 30), ('fr', 32)]

44、列表嵌套列表排序

foo = [["fz",32],["zs",19],["fr",32],["wd", 30],["wa", 10], ["ws", 32]]
res1 = sorted(foo, key=lambda x:x[0])#按照字符顺序排序
print(res1)

res1 = sorted(foo, key=lambda x:x[1])#按照数字顺序排序
print(res1)

res1 = sorted(foo, key=lambda x:(x[1], x[0]))#先按照数字顺序排序,数字相同则按照字符顺序
print(res1)
[['fr', 32], ['fz', 32], ['wa', 10], ['wd', 30], ['ws', 32], ['zs', 19]]
[['wa', 10], ['zs', 19], ['wd', 30], ['fz', 32], ['fr', 32], ['ws', 32]]
[['wa', 10], ['zs', 19], ['wd', 30], ['fr', 32], ['fz', 32], ['ws', 32]]

45、列表推导式、字典推导式、生成器

import random
L1 = [i for i in range(10)]
print("列表推导式:",L1, type(L1))

L2 = (i for i in range(10))
print("生成器:",L2, type(L2))

L3 = {k:random.randint(4,9) for k in ['a','b','c','d']}
print("字典推导式:", L3, type(L3))
列表推导式: [0, 1, 2, 3, 4, 5, 6, 7, 8, 9] 
生成器:  at 0x00000289B1EE7E60> 
字典推导式: {'c': 6, 'd': 9, 'a': 6, 'b': 6} 

46、根据字符串的长度排序

s = ["ab","abcd","absdd","z","dfads","addd"]
res = sorted(s, key=lambda x: len(x))
print(res)

res = sorted(s, key=lambda x: (len(x),x))
print(res)
['z', 'ab', 'abcd', 'addd', 'absdd', 'dfads']
['z', 'ab', 'abcd', 'addd', 'absdd', 'dfads']

47、正则表达式,字符串切分

s="info:xiaoZhang 33 shandong:adfadf"
import re
res = re.split(r":| ", s)
print(res)
['info', 'xiaoZhang', '33', 'shandong', 'adfadf']

48、递归求和

def func(m):
    '''1+2+...+m'''
    if m > 0:
        res = m + func(m-1)
    else:
        res = 0
    return res

func(100)
5050

49、MyISAM 与 InnoDB 区别:

1、InnoDB 支持事务,MyISAM 不支持,这一点是非常之重要。事务是一种高级的处理方式,如在一些列增删改中只要哪个出错还可以回滚还原,而 MyISAM就不可以了;

2、MyISAM 适合查询以及插入为主的应用,InnoDB 适合频繁修改以及涉及到安全性较高的应用;

3、InnoDB 支持外键,MyISAM 不支持;

4、对于自增长的字段,InnoDB 中必须包含只有该字段的索引,但是在 MyISAM表中可以和其他字段一起建立联合索引;

5、清空整个表时,InnoDB 是一行一行的删除,效率非常慢。MyISAM 则会重建表;

50、字符串替换

s = "hello world hah ah"
res = s.replace(" ", "") 
print(res)
print(s)

L = s.split()
res2 = "".join(L)
print(L)
print(res2)
helloworldhahah
hello world hah ah
['hello', 'world', 'hah', 'ah']
helloworldhahah

51、正则匹配不是以4和7结尾的手机号

tels = ["13218036647","18513678878","10086","10010775","13252265604"]
for tel in tels:
    ret = re.match(r"1\d{9}[0-3,5-6,8-9]",tel)
    if ret:
        print("想要的结果是:",ret.group())
    else:
        print("%s 不是你想要的结果"%tel)
13218036647 不是你想要的结果
想要的结果是: 18513678878
10086 不是你想要的结果
10010775 不是你想要的结果
13252265604 不是你想要的结果

52、简述python引用计数机制

  • python垃圾回收主要以引用计数为主,标记-清除和分代清除为辅的机制,其中标记-清除和分代回收主要是为了处理循环引用的难题。
    引用计数算法

  • 当有1个变量保存了对象的引用时,此对象的引用计数就会加1

  • 当使用del删除变量指向的对象时,如果对象的引用计数不为1,比如3,那么此时只会让这个引用计数减1,即变为2,当再次调用del时,变为1,如果再调用1次del,此时会真的把对象进行删除

53、简述乐观锁和悲观锁

悲观锁, 就是很悲观,每次去拿数据的时候都认为别人会修改,所以每次在拿数据的时候都会上锁,这样别人想拿这个数据就会block直到它拿到锁。传统的关系型数据库里边就用到了很多这种锁机制,比如行锁,表锁等,读锁,写锁等,都是在做操作之前先上锁。

乐观锁,就是很乐观,每次去拿数据的时候都认为别人不会修改,所以不会上锁,但是在更新的时候会判断一下在此期间别人有没有去更新这个数据,可以使用版本号等机制,乐观锁适用于多读的应用类型,这样可以提高吞吐量

54、Linux命令重定向 > 和 >>

Linux 允许将命令执行结果 重定向到一个 文件

将本应显示在终端上的内容 输出/追加 到指定文件中

> 表示输出,会覆盖文件原有的内容

>> 表示追加,会将内容追加到已有文件的末尾

55、python传参数是传值还是传址?

Python中函数参数是引用传递(注意不是值传递)。对于不可变类型(数值型、字符串、元组),因变量不能修改,所以运算不会影响到变量自身;而对于

可变类型(列表字典)来说,函数体运算可能会更改传入的参数变量。

56、python垃圾回收机制

python垃圾回收主要以引用计数为主,标记-清除和分代清除为辅的机制,其中标记-清除和分代回收主要是为了处理循环引用的难题。

  • 引用计数算法
    当有1个变量保存了对象的引用时,此对象的引用计数就会加1;当使用del删除变量指向的对象时,如果对象的引用计数不为1,比如3,那么此时只会让这个引用计数减1,即变为2,当再次调用del时,变为1,如果再调用1次del,此时会真的把对象进行删除

57、HTTP请求中get和post区别

1、GET请求是通过URL直接请求数据,数据信息可以在URL中直接看到,比如浏览器访问;而POST请求是放在请求头中的,我们是无法直接看到的;

2、GET提交有数据大小的限制,一般是不超过1024个字节,而这种说法也不完全准确,HTTP协议并没有设定URL字节长度的上限,而是浏览器做了些处理,所以长度依据浏览器的不同有所不同;POST请求在HTTP协议中也没有做说明,一般来说是没有设置限制的,但是实际上浏览器也有默认值。总体来说,少量的数据使用GET,大量的数据使用POST。

3、GET请求因为数据参数是暴露在URL中的,所以安全性比较低,比如密码是不能暴露的,就不能使用GET请求;POST请求中,请求参数信息是放在请求头的,所以安全性较高,可以使用。在实际中,涉及到登录操作的时候,尽量使用HTTPS请求,安全性更好。


你可能感兴趣的:(Python,面试,python)