Python进阶专题

【推荐专区】
Python面试50题
Python综合性面试大全

1、Python中hash数据类型
答:可变类型数据不可哈希,如列表、字典
同值不同址,不同值同址
不可变类型数据可哈希,数值、字母、字符串、数字、元组不可变
同值同址,不同值不同址
2、深拷贝和浅拷贝
答:浅拷贝指的是仅仅拷贝的事变量内存区的地址,修改新变量的内容等于修改原来变量的内容;深拷贝相等于C语言中的变量赋值,重新申请一块内存区,且为该内存区填入相同的内容,修改新变量内容并不会影响原来变量的内容

#python中对象,赋值后是同一地址,
#如果是可变对象,对其中一个修改会影响到另一个,
#如果要生成完全新的对象,应使用deepcopy
import copy
data1=copy.deepcopy(data)

3、猴子补丁推荐博文
答:属性在运行时被动态替换,主要是运行中新增模块和替换模块
4、函数调用参数的传递方式是值传递还是引用传递推荐博文
答:是值传递和引用传递的结合,主要看的是传入参数是否可变数据类型,不可变数据类型为值传递,函数内部不改变外部值的内容,可变数据类型相当于引用传递,函数内部针对数据的改变,会直接影响传入参数的改变
5、GIL锁和Python的伪并行
每个时刻只有一条线程在执行,即使在多核架构中也是如此——毕竟,解释器只有一个。如此一来,单进程的 Python 程序便无法利用到多核的优势了

  1. 我们把整个进程空间看做一个车间,把线程看成是多条不相交的流水线,把线程控制流中的字节码看作是流水线上待处理的物品。Python 解释器是工人,整个车间仅此一名。操作系统是一只上帝之手,会随时把工人从一条流水线调到另一条——这种“随时”是不由分说的,即不管处理完当前物品与否
  2. 若没有 GIL。假设工人正在流水线 A 处理 A1 物品,根据 A1 的需要将房间温度(一个全局对象)调到了 20 度。这时上帝之手发动了,工人被调到流水线 B 处理 B1 物品,根据 B1 的需要又将房间温度调到了 50 度。这时上帝之手又发动了,工人又调回 A 继续处理 A1。但此时 A1 暴露在了 50 度的环境中,安全问题就此产生了
  3. GIL 相当于一条锁链,一旦工人开始处理某条流水线上的物品,GIL 便会将工人和该流水线锁在一起。而被锁住的工人只会处理该流水线上的物品。就算突然被调到另一条流水线,他也不会干活,而是干等至重新调回原来的流水线。这样每个物品在被处理的过程中便总是能保证全局环境不会突变

6、工程中的__init__.py文件的作用
init.py文件最常用的作用是标识一个文件夹是一个 python包
init.py文件的另一个作用是定义模糊导入时要导入的内容
使用类似 from package import * 的导入语句的时候就是在使用模糊导入了,这时包的编写者就可以在__init__.py文件中定义 all 来限制模糊导入的内容
7、Python变量的作用域(global)
函数内定义的变量为局部作用域,若要在函数内定义全局作用域,需要加上global修饰符
变量名解析:LEGB原则
当在函数中使用未认证的变量名时,Python搜索4个作用域:

  1. 本地作用域(L)(函数内部声明但没有使用global的变量)
  2. 上一层结构中def或者lambda的本地作用域(E)
  3. 全局作用域(G)(函数中使用global声明的变量或在模块层声明的变量)
  4. 内置作用域(B)(即python的内置类和函数等)
    在第一处能够找到这个变量名的地方停下来

8、类的继承和重载
继承后子类有父类的所有属性和方法,用self来取用
重写父类中的方法,只需要和父类中方法名和形参数量相同即可
9、两种函数赋值给变量的形式(有些区别)

  1. a=f ----a=f型属于将变量指向函数
  2. a=f()----a=f()型属于将f()的返回值赋值给a的过程

10、python的输入输出模式

  1. input()
  2. sys.stdin(.readline() / .readlines())
  3. 迭代每一个,.split(’ ')
  4. 数据类型转换int
import sys
from functools import reduce
while True:
	input()
sys.stdin.readline()
for line in sys.stdin:
	re = list(map(int, line.split()))

11、内建标志符——下划线
变量名_xxx被看作是“私有的”,在模块或类外不可以使用。当变量是私有的时候,用_xxx 来表示变量是很好的习惯。因为变量名__xxx__对Python 来说有特殊含义,对于普通的变量应当避免这种命名风格
"单下划线" 开始的成员变量叫做保护变量,意思是只有类对象和自类对象自己能访问到这些变量。
【示例】以单下划线开头(_foo)的代表不能直接访问的类属性,需通过类提供的接口进行访问,不能用“from xxx import *”而导入。

"双下划线" 开始的是私有成员,意思是只有类对象自己能访问,连子类对象也不能访问到这个数据。
【示例】以双下划线开头的(__foo)代表类的私有成员;以双下划线开头和结尾的(foo)代表python里特殊方法专用的标识,如 init()代表类的构造函数。

12、如何自建一个异常类
参考文献

13、常见的数据类型转换
int()  - 将任何数据类型转换为整数类型
float()  - 将任何数据类型转换为float类型
tuple() - 此函数用于转换为元组。
set() - 此函数在转换为set后返回类型。
list() - 此函数用于将任何数据类型转换为列表类型。
dict() - 此函数用于将顺序元组(键,值)转换为字典。
str() - 用于将整数转换为字符串。
ord()  - 将字符转换为整数

hex() - 将整数转换为十六进制
oct()  - 将整数转换为八进制
int() -可以默认转换为十进制整数,可以在参数上选择进制的类型

14、lambda匿名函数
参考文献

lambda x: x+1(与下面函数类似)
def f(x):
	return x+1
>>> foo = [2, 18, 9, 22, 17, 24, 8, 12, 27]
>>> print filter(lambda x: x % 3 == 0, foo)
[18, 9, 24, 12, 27]
>>>
>>> print map(lambda x: x * 2 + 10, foo)
[14, 46, 28, 54, 44, 58, 26, 34, 64]
>>>
>>> print reduce(lambda x, y: x + y, foo)
>print[x for x in foo if x % 3 == 0]for.. in.. if.. 方式)

15、python中编码问题
参考文献1
参考文献2
字符编码:选用的字符集不同,每一个编码方式都有对应的字符集
文件编码:文件编码存储在硬盘中的方式,存到硬盘上时是以何种编码存的,再从硬盘上读出来时,就必须以何种编码读
(对应有在内存中显示的编码方式)
python3中字符编码为Unicode(内存编码方式)、文件编码为UTF8
不同编码方式的内容如何转换:

把数据从硬盘上读到内存,转成unicode来显示即可,由于所有的系统、编程语言都默认支持unicode
所有我们的gbk编码软件放在美国电脑上,加载到内存里面,变成了unicode,中文就可正常展示
类似用如下的转码的过程:
    源有编码 -> unicode编码 -> 目的编码

16、垃圾回收机制
参考文献

17、内存管理机制
参考文献

18、python定义多维数组
参考文献

myList = [([0] * 3) for i in range(4)]

myList = [[0]*3]*4

19、列表赋值的情况

a = [2,1]
In [92]: b = a
In [93]: c = a[:]
In [94]: id(a)
Out[94]: 1911478129032
In [95]: id(b)
Out[95]: 1911478129032
In [96]: id(c)
Out[96]: 1911479852104

20、简单递归的使用方案
常用递归实例

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值