1 Py2和Py3的区别
Py2整数做除法是地板除,py3整数做除法是可以有小树的
默认编码不同,前者是ascii,后者为utf-8
个别的方法不同,前者是print ***,后者为print(***)
项目规范不同,前者包下必须有__init__.py,后者可有可无
在Py2中 字典.keys()、.values()、.items()直接获取到的是列表,而Py3中返回的是高仿列表,这个高仿的列表可以被循环显示
py2分整型和长整形,py3不分
py2字典无序;py3.6+ 字典有序。
对象继承的不同,前者分为经典类(不继承Object)和新式类(继承Object),后者默认都是新式类
经典类(从左到右,深度优先,大小钻石,不留顶端),新式类(从左到右,深度优先,大小钻石,保留顶端 -- C3算法)
2 简述深浅拷贝
赋值:将变量和值在内存中形成映射指向关系
浅拷贝:只拷贝第一层级里的所有元素,单独开辟空间成型独立的一份副本copy.copy()
深拷贝:所有层级的元素都单独拷贝一份,开辟全新的空间copy.deepcopy()
原不可变数据只是暂时的指向原数据(值更改后内存地址会发生变化),可变的数据独立开辟新空间
深浅拷贝是针对于可变类型,不可变类型无任何意义,内存地址不会改变
浅拷贝
不可变类型:不会拷贝
可变类型:只拷贝第一层(值拷贝,源对象数据发生改变时,浅拷贝对象的值一起发生改变)
深拷贝
不可变类型:不会拷贝(特殊:元组类型,当元组中有可变类型时,会拷贝元组)
可变类型:拷贝可变类型的所有层,并且拷贝元组中可变类型的所有层(内存地址的拷贝,源对象数据发生改变时,深拷贝对象的值不会发生改变)
3 基础数据类型
# 有哪些,哪些可变哪些不可变
可变:dict, list, set
不可变:str, int, tuple, froenset, bool, float,
4 Is和==的区别
Is是比较的内存地址
==是比较的值
5 机器语言、汇编语言和高级语言的特点
1.难学,难懂,难理解,无通用性,运行速度最快,开发效率最低,计算机能直接执行
2.执行效率高,占用存储空间小
3.容易,开发效率最高,有一定的通用性,计算机不能直接识别和执行
6 Python常见解释器
Cpython, Jpython, PyPy, ironPython
7 list常见内置方法
append, insert, extend, pop, count, sorted, reverse, copy
8 元组是否能作为字典的key
当元组中不存在不可哈希类型时,可以作为字典的Key,反之不行。
9 各种编码
ascii编码、unicode字符集、utf-8编码、gbk编码本质上都是字符与二进制的关系。
- ascii,只有256种对照关系,只包含英文、符号等。
- unicode,万国码,包含了全球所有文字和二进制之间的一个对应关系。(ucs2或ucs4)
- utf-8,对unicode字符集的码位进行压缩处理,间接也维护了字符和二进制的对照表。
- gbk,包含中国、日本韩国等亚洲国家的文字和二进制的对照表。
10 什么情况下,下面的解释不正确
y != x - (x - y)
集合:非空集合并且不包含父子关系
11 写一个简单随机4位验证码
import random
import string
import itertools
def main():
code = ''
code_list = list(itertools.chain(string.digits, string.ascii_letters))
print(code_list)
for i in range(4):
choice = random.choice(code_list)
code += choice
print(code)
if __name__ == '__main__':
main()
...
12 迭代器的好处
迭代器统一了对容器的访问方式
可以直接用for循环进行遍历
占用内存小
13 Python的执行过程
"""
Python在执行时可能会产生一个字节码文件,当我们执行一个脚本时,脚本引入的模块会产生pyc文件
解释型语言和编译型语言
计算机是不能够识别高级语言的,所以当我们运行一个高级语言程序时,就需要一个“翻译机”来从事把高级语言转变成计算机能够读懂的机器语言的过程。
这个过程分为两类,第一种是编译,第二种是解释
编译型语言在程序执行之前,先会通过编译器对程序执行一个编译的过程,把程序变成机器语言。运行时就不用翻译,而是直接运行就可以了,最典型的是C语言
解释型语言就是没有这个编译的过程,而是在程序运行的时候,通过解释器对程序逐行做出解释,然后直接运行,例如ruby
还有第三种,是Java这种,先编译后解释。
我们的Python也是属于那种先编译后解释的语言,
当Python程序运行时,编译结果则是保存在位于内存中的PyCodeObject中,
当Python程序运行结束时,Python解释器则将PyCodeObject写回到pyc文件中。
当Python程序第二次运行时,首先程序会在硬盘上寻找对应的pyc文件,如果找到,则直接载入,否则就重复上面的过程
Python执行的过程:
所以可以认定,Python它面向对象更彻底了,比JAVA中的一切皆对象更彻底,JAVA中有class,也就是类的概念,object是class的一个实例。
但是Python中函数和类也是对象
"""
"""
过程说明
1、Python程序首次运行时,编译的结果保存在内存中的PycodeObject中。
Python程序运行结束时,Python解释器将PycodeObject写回硬盘的pyc文件。
2、Python程序第二次运行时,首先程序会在硬盘中找到pyc文件,如果找到,直接装载,否则重复上述过程。
因此,应该这样定位PyCodeObject和pyc文件。pyc文件实际上是PyCodeObject的持久保存方式。
也就是说,保存pyc文件是为了避免在下次再次使用该剧本时重复编译,节省时间。因此,只执行一次脚本,就没有必要保存其编译结果pyc文件浪费空间。
"""
14 如何区分类中的函数和方法
"""类直接调用函数是函数,类实例化后调用函数是方法"""
from types import MethodType, FunctionType
class Foo(object):
def fetch(self):
pass
print(isinstance(Foo.fetch, MethodType))
print(isinstance(Foo.fetch, FunctionType)) # True
obj = Foo()
print(isinstance(obj.fetch, MethodType)) # True
print(isinstance(obj.fetch, FunctionType))