python 面试常见问题(1)

1.匿名函数

lambda 是python 定义匿名函数的语法

lambda表达式就是一个函数,可以赋值给一个变量,既然是表达式,可以参与运算。

(1)lambda轻便

(2)给map等函数式编程使用

**map()是 Python 内置的高阶函数,它接收一个函数 f 和一个 list,并通过把函数 f 依次作用在 list 的每个元素上,得到一个新的 list 并返回。

print map(lambda x:x**2, [1, 2, 3, 4, 5, 6, 7, 8, 9])

 

>>[1, 4, 9, 10, 25, 36, 49, 64, 81]

 

2.可迭代对象:可以使用for ..in...语句进行循环的对象就是可迭代对象,如列表,元组,字典

迭代器:可以使用next()方法来回调的并不断返回下一个值的对象。>>>最后一个会报错

iter(可迭代对象)>>>>迭代器

 

生成器:本质上是一个迭代器,也可以在迭代中操作,与迭代器的区别是,生成器更加简洁。

调用next(函数)的时候执行,遇到yield语句返回,再次执行时从上次返回的yield语句处继续执行

3.死锁:当线程之间共享多个资源,并且两个线程同时拥有一部分资源的同时,都在等待对方的资源,造成死锁

解决办法:银行家算法,添加超时任务

4.#    要想了解GIL,首先要知道什么是并行和并发?

    1.并发:进行交替处理多件事情。

    2.并行:多个cpu同时处理多个事,只在多核上能实现。

#    然后,我们要知道为什么会产生GIL?

    解决多线程之间数据完整性和状态同步的最简单方法自然就是加锁。 于是有了GIL这把超级大锁,当时Guido van Rossum(吉多·范罗苏姆)创建python时就只考虑到单核cpu , cpython解析只允许拥有GIL全局解析器锁才能运行程序,保证同一个时刻只允许一个线程可以使用cpu,大量的程序开发者接收了这套机制,现在代码量越来越多,已经不容易通过c代码去解决这个问题。

#    什么是GIL?

     GIL是全局解析器锁,保证同一时刻只有一个线程可以使用cpu,让我们的多线程没办法真正实现并行。(解释 : 当我们使用多线程的时候,在一个进程中只有一个GIL锁,那么这多个线程中谁拿到GIL谁就可以使用cpu(ps:多个进程有多个GIL锁))

#    什么时候会释放GIL锁?

    1 、遇到像 i/o操作这种会有时间空闲造成cpu闲置的情况会释放GIL。

    2 、会有一个专门ticks进行计数,一旦ticks数值达到100,这个时候释放GIL锁,线程之间开始竞争GIL锁(说明:ticks这个数值可以进行设置来延长或者缩减获得GIL锁的线程使用cpu的时间)。

#    怎么解决GIL?

    1、更换cpython为jpython(不建议),比较慢 

    2、使用多进程完成多线程的任务

    3、在使用多线程可以使用c语言去实现 

#    互斥锁和GIL锁的关系

    GIL锁  : 保证同一时刻只有一个线程能使用到cpu。

    互斥锁 : 多线程时,保证修改共享数据时有序的修改,不会产生数据修改混乱。

首先假设只有一个进程,这个进程中有两个线程 Thread1、Thread2,要修改共享的数据date,并且有互斥锁。执行以下步骤:

(1)多线程运行,假设Thread1获得GIL可以使用cpu,这时Thread1获得 互斥锁lock,Thread1可以改date数据(但并没有开始修改数据)

(2)Thread1线程在修改date数据前发生了 i/o操作 或者 ticks计数满100 (注意就是没有运行到修改data数据),这个时候 Thread1 让出了GIL,GIL锁可以被竞争

 

(3) Thread1 和 Thread2 开始竞争 GIL(注意:如果Thread1是因为 i/o 阻塞 让出的GIL Thread2必定拿到GiIL,如果Thread1是因为ticks计数满100让出GIL 这个时候 Thread1 和 Thread2 公平竞争)

 

(4)假设 Thread2正好获得了GIL,运行代码去修改共享数据date,由于Thread1有互斥锁lock,所以Thread2无法更改共享数据date,这时Thread2让出GIL锁 , GIL锁再次发生竞争 

 

(5)假设Thread1又抢到GIL,由于其有互斥锁Lock所以其可以继续修改共享数据data,当Thread1修改完数据释放互斥锁lock,Thread2在获得GIL与lock后才可对data进行修改

5.django 中的虚拟环境---virtualenv..........读法 virtual +env

每个应用可能需要各自拥有一套“独立”的Python运行环境。virtualenv就是用来为一个应用创建一套“隔离”的Python运行环境。

# 虚拟环境

mkvirtualenv  # 创建虚拟环境

rmvirtualenv  # 删除虚拟环境

workon  # 进入虚拟环境、查看所有虚拟环境

deactivate  # 退出虚拟环境

 

# pip

pip install  # 安装依赖包

pip uninstall  # 卸载依赖包

pip list  # 查看已安装的依赖包

pip freeze  # 冻结当前环境的依赖包

 

 

 

 

 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值