A股上市公司传智教育(股票代码 003032)旗下技术交流社区北京昌平校区

 找回密码
 加入黑马

QQ登录

只需一步,快速开始

© 就业高冷派 黑马粉丝团   /  2018-12-27 15:10  /  9267 人查看  /  147 人回复  /   0 人收藏 转载请遵从CC协议 禁止商业使用本文

本帖最后由 就业高冷派 于 2018-12-27 15:15 编辑

公司名称:北京庖丁科技有限公司
注册规模:20-99人
公司地址:西安市雁塔区天盛京广中心A座
公司图片

面试分享:
1、说一下Python的垃圾回收机制
引用技术
  • Python语言默认采用的垃圾收集机制是『引用计数法 Reference Counting』,该算法最早George E. Collins在1960的时候首次提出,50年后的今天,该算法依然被很多编程语言使用。
  • 『引用计数法』的原理是:每个对象维护一个ob_ref字段,用来记录该对象当前被引用的次数,每当新的引用指向该对象时,它的引用计数ob_ref加1,每当该对象的引用失效时计数ob_ref减1,一旦对象的引用计数为0,该对象立即被回收,对象占用的内存空间将被释放。
  • 它的缺点是需要额外的空间维护引用计数,这个问题是其次的,不过最主要的问题是它不能解决对象的“循环引用”,因此,也有很多语言比如Java并没有采用该算法做来垃圾的收集机制。
  • 分代回收

  • 分代回收是一种以空间换时间的操作方式,Python将内存根据对象的存活时间划分为不同的集合,每个集合称为一个代,Python将内存分为了3“代”,分别为年轻代(第0代)、中年代(第1代)、老年代(第2代),他们对应的是3个链表,它们的垃圾收集频率与对象的存活时间的增大而减小。
  • 新创建的对象都会分配在年轻代,年轻代链表的总数达到上限时,Python垃圾收集机制就会被触发,把那些可以被回收的对象回收掉,而那些不会回收的对象就会被移到中年代去,依此类推,老年代中的对象是存活时间最久的对象,甚至是存活于整个系统的生命周期内。
  • 同时,分代回收是建立在标记清除技术基础之上。分代回收同样作为Python的辅助垃圾收集技术处理那些容器对象
标记清除

对象之间通过引用(指针)连在一起,构成一个有向图,对象构成这个有向图的节点,而引用关系构成这个有向图的边。从根对象(root object)出发,沿着有向边遍历对象,可达的(reachable)对象标记为活动对象,不可达的对象就是要被清除的非活动对象。根对象就是全局变量、调用栈、寄存器。 mark-sweepg 在上图中,我们把小黑圈视为全局变量,也就是把它作为root object,从小黑圈出发,对象1可直达,那么它将被标记,对象2、3可间接到达也会被标记,而4和5不可达,那么1、2、3就是活动对象,4和5是非活动对象会被GC回收。

标记清除算法作为Python的辅助垃圾收集技术主要处理的是一些容器对象,比如list、dict、tuple,instance等,因为对于字符串、数值对象是不可能造成循环引用问题。Python使用一个双向链表将这些容器对象组织起来。不过,这种简单粗暴的标记清除算法也有明显的缺点:清除非活动的对象前它必须顺序扫描整个堆内存,哪怕只剩下小部分活动对象也要扫描所有对象。

2、Python列表去重

list(set([1,2,1,2,34])

3、Git 常用命令

git clone

git add

git commit

git push

git log

git diff

git status

git checkout -b

git branch

4、MySQL的引擎有哪些?

InnoDB 适用场景MySQL官方对InnoDB的讲解MyIsam 适用场景补充:ISAM索引方法–索引顺序存取方法Memory(也叫HEAP)堆内存嘛Mrg_Myisam:(分表的一种方式–水平分表)Blackhole(黑洞引擎)5、如何在一个函数内部修改全局变量
global
6、在文件指定内容后边追加内容?
keyword = input("请输入在什么内容后添加:")
str = input("请输入要追加的内容:")

file = open('a.txt','r')
content = file.read()
post = content.find(keyword)
if post != -1:
    content = content[:post+len(keyword)]+str+content[post+len(keyword):]
    file = open('a.txt','w')
    file.write(content)
file.close()



7、杨辉三角,输入一个数字,输出指定行第一个偶数的位置

def triangles(n):
    N = [1]
    i = 1
    while i <n:
        N.append(0)
        N = [N[i-1] + N for i in range(len(N))]
        i += 1
    return Nnum = int(input("请输入数字:"))
lists = triangles(num)
for k,v in enumerate(lists):
    if v % 2 == 0:
        print(k+1)
        break
else:
    print(-1)

147 个回复

倒序浏览
感谢分享~
回复 使用道具 举报
真好
回复 使用道具 举报
回复 使用道具 举报
66666666666666666
回复 使用道具 举报
感谢分享
回复 使用道具 举报
文章文采斐然,辞藻华美,语言朴实,文笔清新,情感丰富,人物形象饱满,条理清晰,结构层次分明,情节合理,跌宕起伏,描写生动,引人入胜,艺术感染力强,结尾画龙点睛,寓意深刻,发人深思,意味悠长。
回复 使用道具 举报
6666666666666666
回复 使用道具 举报
不错不错加油.............
回复 使用道具 举报
回复 使用道具 举报
回复 使用道具 举报
庖丁科技庖丁科技庖丁科技庖丁科技庖丁科技
回复 使用道具 举报
回复 使用道具 举报

66666666666666666666
回复 使用道具 举报
么么哒666666666666
回复 使用道具 举报
666666
回复 使用道具 举报
666666
回复 使用道具 举报
回复 使用道具 举报
回复 使用道具 举报
作者棒棒哒!!!
回复 使用道具 举报
您需要登录后才可以回帖 登录 | 加入黑马