面面面也不知道offer在哪的面试问题

常见的图像边缘检测算子

1.一阶导数的边缘算子

通过模板作为核与图像的每个像素点做卷积和运算,然后选取合适的阈值来提取图像的边缘。常见的有Roberts算子Sobel算子Prewitt算子

2.二阶导数的边缘算子

依据于二阶导数过零点,常见的有Laplacian 算子,此类算子对噪声敏感。

3.canny算子

python

1.python垃圾回收机制

垃圾回收机制:

1.引用计数(会有一个函数,里面有个int变量 会给声明的对象进行计数,每次引用会加一,当删除了会归零,此时int归零了执行该函数的内存清除操作)。

2.标记清除(按照引用关系构建一个有向图,eg:b =a() ,b到a之间会有个单向箭头,然后从root开始查找,找不到就清除该对象的内存),提出的目的是为了解决引用计数中的那个循环引用的问题 ,例如:lista = [1,2,3],listb = [3,2,1]

3.分代回收:是基于标记清除上的优化,因为每时每刻都进行标记清除会很占用资源,因此可以对开辟的内存进行代数的标记。先设定阈值,700,新创建的内存对象为0代,比如当0代达到700,即内存对象数超过阈值数就开始扫描,此时1代,2代可能没有到阈值,就先开始扫描0代的,扫描到对象引用计数减一,为零的就销毁。第0代的存活了就传入第一代,以此类推。这样也就是存活越久,代数越高越不是垃圾,越可能是全局变量。

2.is 和 == 的区别 :

is比较地址值和数值,== 比较数值

3.python 管理多线程:通过 threading 创建线程

1.实例化threaing类,将任务作为参数传进去,

2.继承threading类,重写run函数

通过互斥锁来防止脏数据(两个进程同时对一个全局变量进行操作可能达不到想要效果,就会发生脏数据的情况)

4. 深拷贝,浅拷贝

首先python 中的赋值不是拷贝,类似C中的引用,赋值赋的是对象的地址值

两个拷贝都要调用copy库

浅拷贝 cpoy.cpoy():只能拷贝父对象,对父对象的子对象不能拷贝,只是引用内存地址,比如列表中的元素和里面的子列表
深拷贝 cpoy.deepcpoy():递归的拷贝父对象和所有子对象,创建一个新的对象,并且递归的复制它所包含的对象(修改其中一个,另外一个不会改变)
针对可变类型,浅拷贝会对父对象开辟一个新的地址进行保存,但是对父对象里面的子对象只是地址的引用,而深拷贝对于可变类型都会开辟新的地址进行保存
针对不可变类型,浅拷贝和深拷贝都不会开辟新的地址,只是建议引用关系
eg:

import copy
list1 = [(1,2),3,4,[1,23,3]]
a = copy.copy(list1)
b = copy.deepcopy(list1)

print(id(a),id(b),id(list1))
print(id(list1[0]),id(a[0]))###不可变对象浅拷贝
print(id(list1[0]),id(b[0]))## 不可变深拷贝
print(id(list1[3]),id(a[3]))###可变对象浅拷贝
print(id(list1[3]),id(b[3]))# 不可变深拷贝

结果:
在这里插入图片描述

5.迭代器和生成器

迭代器是一个可以记录遍历位置的对象,从第一个元素开始访问,直到元素访问结束

迭代器支持两个方法
iterator.iter()返回迭代器本身
iterator.next()要么返回迭代的下一项们,要么触发Stoplteration
eg:

list1 = [1,2,4354,5]
iter1 = iter(list1)###生成个迭代器
print(iter1)
print(next(iter1))###next就是调用一个元素,每次next都是有记忆的
print(next(iter1))
print(next(iter1))

结果:
在这里插入图片描述

生成器是一种特殊的迭代器,只要一个函数里有yield函数的时候就是一个生成器.
生成器是一种特殊的迭代器,它可以通过yield语句来定义。生成器在迭代过程中逐个生成数据,而不是一次性生成所有数据。这种逐个生成数据的方式可以减少内存的使用,特别是当数据集合非常大时。
eg:

###构建迭代器
def my_range(n):
    i = 0
    while i < n:
        yield i
        i += 1

for i in my_range(5):
    print(i)

结果
在这里插入图片描述
类似于range函数

6.装饰器

哈哈哈哈,down的(嘿嘿)
python装饰器(decorator)用来拓展原来函数功能的一种函数,目的是在不改变原函数名(或类名)的情况下,给函数增加新的功能。装饰器的特殊之处在于它的返回值也是一个函数,这个函数是内嵌“原“”函数的函数。其应满足一下条件:

    1)不能修改被装饰的函数的源代码

    2)不能修改被装饰的函数的调用方式

   3) 满足1)、2)的情况下给程序增添功能

作者:Py量量风
链接:https://www.jianshu.com/p/1224b8d3989b
来源:简书
著作权归作者所有。商业转载请联系作者获得授权,非商业转载请注明出处。

eg:(我在down)

def decorator(func):
  print("执行装饰器")

  # 内部函数
  def inner():
    # 3. 在内部函数里面对已有函数添加额外功能
    print("登录验证通过")
    # 执行需要装饰的函数
    func()

  # 外部函数返回内部函数
  return inner


# 1. 不修改已有函数的源代码
# 装饰器语法糖写法:@装饰器名称
# 装饰器语法糖写法在装饰需要装饰的函数写法更简单:@decorator 对comment = decorator(comment)进行了封装
# 装饰器的执行时间是加载模块时立即执行
@decorator
def comment():
  print("发表评论")


if __name__ == '__main__':
  # # 调用装饰器对已有函数进行装饰: comment = inner,此时comment是内部函数的实例
  # comment = decorator(comment)
  # 2. 不修改已有函数的调用方式
  # comment():相当于调用内部函数inner()
  comment()

结果:
在这里插入图片描述

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值