python开发(秋招)

基础问题:

Q1:python是静态还是动态类型?是强类型还是弱类型?

首先要清楚静态类型语言和动态类型语言的判别的标准
定义:如果类型检查发生在编译阶段(compile time),那么是静态类型语言(statically typed languages)中,相反的,如果类型检查发生在运行阶段(run time),那么是动态类型语言(dynamically typed languages)
什么是类型检查
类型检查就是查看变量的类型,然后判断这个表达式是合理的,可以这么理解:编译器通常在编译阶段做类型检查(java),而解释器通常在运行阶段做类型检查(python)
静态类型(static)语言: 所有的变量类型必须被显示地声明,因为这些信息在编译阶段就被需要。
 

Q2:monkey type?

写一个例子

import time
print(time.time())
#输出为15536656.1024989,即当前的时间戳
def _time():
    return 1234
time.time=_time()
print(time.time())
#输出为1234
Q3:什么是自省?

用is和“==”去判断的区别?

用is判断是判断两个对象在内存中的id 是否相等。用”==“判断的是两个值是否相等。

Q4:什么是列表和字典推导?

a = [1,2,3]
b = ['a','d','k']
d = {}
d = {c: v for c, v in zip(a,b)}

print(d)

Python中一切皆对象,

对象引用的传递方式,

Q5:python中哪些类型是可变的哪些是不可变的?

默认参数中计算一次,

def flist(l=[1]):
    l.append(1)
    print(l)
flist()
flist()

#输出
#[1,1]
#[1,1,1]

Q6:python中函数参数问题 *args,**kwargs

Q7:如何处理异常?

为什么不是继承BaseException?因为baseException这包括了 keyboardinterrupot,键入数据会受到影响

处理自己的异常:

class MyException(Exception):
    print(123)

try:
    raise MyException('123my exception')
except Exception as e:
    print(e)

Q8:什么是Cpython的GIL

如何规避GIL影响

区分CPU和IO密集程序

cpu密集可以使用多线程+进程池

io密集可以使用多线程/协程

cpython扩展

import threading
n =[0]
def foo():
    n[0]=n[0]+1
    n[0] = n[0] + 1
threads =[]

for i in range(5000):

    t=threading.Thread(target=foo)
    threads.append(t)

for t in threads:
    t.start()

print(n)

Q8 python 生成器与协程之间的区别?

Generator

生成器就是可以生成值的函数

当一个函数里面有了yield 关键字就成了生成器

生成器可以挂起执行并保持当前执行的状态

Python 生成器(generator)详细总结+示例_python generator async for-CSDN博客

对于生成器 我们使用next 进行调用

基于生成器的协程

pytrhon3之前没有原生协程,只有基于生成器的协程

###生成器###

def core():
    hello=yield "hello"
    yield hello

c=core()
print(type(core()))
print(next(c))

print(c.send("world"))
print(c.send("none"))  #会抛出异常,表示生成器已经结束了

 协程注意的点:

启动协程,一个协程函数调用新的next的方法

什么是协程什么是装饰器?

在python2里面,生成器(包含yield的函数),协程是基于生成器的协程,yield的地方既可以调用生成值也可以在调用的地方发送值,这样就可以通过生成值和发送值去调度。

Q9:什么是单元测试unit Testing

单元测试相关的库:

nose/pytes较为常用

mock模块用来模拟替换网络请求等

coverage统计测试的覆盖率

def binary_seach(array ,target):
    if not array:
        return -1
    beg,end=0,len(array)
    while beg<end:
        mid=beg+(end-beg)//2
        if array[mid]==target:
            return mid
        elif array[mid]>target:
            end = mid
        else:
            beg=mid
    return -1

def test():
    '''
  如何设计测试用例:(等价类划分)
    正常值功能测试
    边界值(比如最大最小最左最右)
    异常值(比如,None、空值、非法值)
    '''
    #正常值 包含有无两种结果
    assert  binary_seach([0,1,2,3,4,5],1) ==1
    assert  binary_seach([0,1,2,3,4,5],6) ==-1
    assert  binary_seach([0,1,2,3,4,5],-1) ==-1
    #边界值
    assert  binary_seach([0,1,2,3,4,5],0) ==0
    assert  binary_seach([0,1,2,3,4,5],5) ==5
    #异常值
    assert  binary_seach([],1) ==-1


Python基础练习:

python的深拷贝与浅拷贝?

如果直接将一个变量赋值给另一边变量,那么这就是一个浅拷贝,因为他们是指向的同一个变量

深拷贝就是让b指向一个内容相同的另一个对象

python中如何实现深拷贝?

在Python中 通过 copy.deepcopy() 来实现深拷贝。

import copy
a = [1, 2, (3, 4)]
# 深拷贝
b = copy.deepcopy(a)

# 因为生成了新的对象所以,返回False
print(a is b)


a[-1] += (5,)
a.append(6)

print(a) # [1, 2, (3, 4, 5), 6]
print(b) # [1, 2, (3, 4)] 深拷贝后的对象,根本不受原对象的任何影响
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值