一、简答题(20题)
1.try except else finally 的意义
2.什么是异步非阻塞
3.Python 中的 GIL
4.Python中append和extend的区别?
5.break、continue、pass是什么?
6.解释Python的内置数据结构?
7.什么是pickling和unpickling?
8.面向对象中__new__ 和 init 区别
9.解释型和编译型语言的区别
10.什么是可变数据类型和不可变数据类型
11.为什么Python执行速度慢,我们如何改进它?
12.什么是负索引
13.char 和 varchar 的区别
14.Python的可变和不可变数据类型?
15.Python中的局部变量和全局变量是什么?
16.TCP 和 UDP 的区别
17.解释//、%、* *运算符?
18.Python数组和列表有什么区别?
19.可变类型与不可变类型
20.Python有哪些应用?
参考答案
1.try…except…else 没有捕获到异常,执行 else 语句 try…except…finally 不管是否捕获到异常,都执行 finally 语句
2.同步异步指的是调用者与被调用者之间的关系 所谓同步,就是在发出一个功能调用时,在没有得到结果之前,该调用就不会返回,一旦调用返回,就得到了返回值 异步的概念和同步相对,调用在发出之后,这个调用就直接返回了,所以没有返回结果。当该异步功能完成后,被调用者可以通过状态、通知或回调来通知调用者 阻塞非阻塞是线程或进程之间的关系 阻塞调用是指调用结果返回之前,当前线程会被挂起(如遇到io操作)。调用线程只有在得到结果之后才会返回。函数只有在得到结果之后才会将阻塞的线程激活 非阻塞和阻塞的概念相对应,非阻塞调用指在不能立刻得到结果之前也会立刻返回,同时该函数不会阻塞当前线程
3.GIL 是 Python 的全局解释器锁,同一进程中假如有多个线程运行,一个线程在运行 Python 程序的时候会占用 Python 解释器(加了一把锁即 GIL),使该进程内的其他线程无法运行,等该线程运行完后其他线程才能运行。如果线程运行过程中遇到耗时操作,则解释器锁解开,使其他线程运行。所以在多线程中,线程的运行仍是有先后顺序的,并不是同时进行
4.append() 向列表尾部追加一个新元素,列表只占一个索引位,在原有列表上增加 extend() 向列表尾部追加一个列表,将列表中的每个元素都追加进来,在原有列表上增加
5.break:在满足条件时,它将导致程序退出循环。 continue:将返回到循环的开头,它使程序在当前循环迭代中的跳过所有剩余语句。 pass:使程序传递所有剩余语句而不执行。
6.Python中主要有四种类型的数据结构。 列表:列表是从整数到字符串甚至另一个列表的异构数据项的集合。列表是可变的。列表完成了其他语言中大多数集合数据结构的工作。列表在[ ]方括号中定义。 例如:a = [1,2,3,4] 集合:集合是唯一元素的无序集合。集合运算如联合|,交集&和差异,可以应用于集合。{}用于表示一个集合。 例如:a = {1,2,3,4} 元组:Python元组的工作方式与Python列表完全相同,只是它们是不可变的。()用于定义元组。 例如:a =(1,2,3,4) 字典:字典是键值对的集合。它类似于其他语言中的hash map。在字典里,键是唯一且不可变的对象。 例如:a = {‘number’:[1,2,3,4]}
7.pickling是将Python对象(甚至是Python代码),转换为字符串的过程。 unpickling是将字符串,转换为原来对象的逆过程。
8.__new__是在实例创建之前被调用的,因为它的任务就是创建实例然后返回该实例对象,是个静态方法。__init__是当实例对象创建完成后被调用的,然后设置对象属性的一些初始值,通常用在初始化一个类实例的时候,是一个实例方法 1、__new__至少要有一个参数 cls,代表当前类,此参数在实例化时由 Python 解释器自动识别。2、__new__必须要有返回值,返回实例化出来的实例,这点在自己实现__new__时要特别注意,可以 return 父类(通过 super(当前类名, cls))__new__出来的实例,或者直接是 object 的__new__出来的实例。3、__init__有一个参数 self,就是这个__new__返回的实例,__init__在__new__的基础上可以完成一些其它初始化的动作,__init__不需要返回值。4、如果__new__创建的是当前类的实例,会自动调用__init__函数,通过 return 语句里面调用的__new__函数的第一个参数是 cls 来保证是当前类实例,如果是其他类的类名,;那么实际创建返回的就是其他类的实例,其实就不会调用当前类的__init__函数,也不会调用其他类的__init__函数
9.编译型语言:把做好的源程序全部编译成二进制的可运行程序。然后,可直接运行这个程序。如:C,C++ 解释型语言:把做好的源程序翻译一句,然后执行一句,直至结束!如:Python, (Java 有些特殊,java程序也需要编译,但是没有直接编译称为机器语言,而是编译称为字节码,然后用解释方式执行字节码。)
10.在Python中,数据类型可以分为两种:可变数据类型和不可变数据类型。不可变数据类型:这种数据类型的值一旦定义,就不能更改。如果尝试更改其值,实际上会创建一个新的对象。不可变数据类型的例子包括整数、浮点数、字符串、元组。例如,如果你有一个字符串变量,你不能更改这个字符串中的某个字符。试图这样做的话,Python会创建一个新的字符串。可变数据类型:与不可变数据类型相反,可变数据类型的值是可以更改的。也就是说,你可以在不创建新对象的情况下更改对象的值。可变数据类型的例子包括列表、字典以及集合。例如,如果你有一个列表,你可以更改列表中的元素,增加元素,或者删除元素,而不需要创建一个新的列表
11.Python代码执行缓慢的原因,是因为它是一种解释型语言。它的代码在运行时进行解释,而不是编译为本地语言。 为了提高Python代码的速度,我们可以使用CPython、Numba,或者我们也可以对代码进行一些修改。 1. 减少内存占用。 2. 使用内置函数和库。 3. 将计算移到循环外。 4. 保持小的代码库。 5. 避免不必要的循环
12.Python 中的序列是有索引的,它由正数和负数组成。正的数字使用’0’作为第一个索引,‘1’作为第二个索引,以此类推 负数的索引从’-1’开始,表示序列中的最后一个索引,’ - 2’作为倒数第二个索引,依次类推
13.char:存储定长数据很方便,CHAR 字段上的索引效率级高,必须在括号里定义长度,可以有默认值,比如定义 char(10) varchar:存储变长数据,但存储效率没有 CHAR 高,必须在括号里定义长度,可以有默认值
14.不可变数据类型:即数据被创建之后,数据的值将不再发生改变,有数值、字符、元祖类型; 可变数据类型:数据别创建之后,数据的值可以发生变化,有列表、字典、集合类型。
15.全局变量:在函数外或全局空间中声明的变量称为全局变量。这些变量可以由程序中的任何函数访问。 局部变量:在函数内声明的任何变量都称为局部变量。此变量存在于局部空间中,而不是全局空间中。
16.TCP 和 UDP 都是 OSI 模型中运输层的协议。TCP 提供可靠的通信传输,而 UDP 则常被用于广播和细节控制交给应用的通信传输。UDP 不提供复杂的控制机制,利用 IP 提供面向无连接的通信服务。TCP 充分实现了数据传输时各种控制功能,可以进行丢包的重发控制,还可以对次序乱掉的分包进行顺序控制 TCP 应用:FTP 传输,点对点短信等 UDP 应用:媒体流等
17.//(Floor Division)-这是一个除法运算符,它返回除法的整数部分。 例如:5 // 2 = 2 %(模数)-返回除法的余数。 例如:5 % 2 = 1 **(幂)-它对运算符执行指数计算。a ** b表示a的b次方。 例如:5 ** 2 = 25、5 ** 3 = 125
18.Python中的数组和列表具有相同的存储数据方式。但是,数组只能包含单个数据类型元素,而列表可以包含任何数据类型元素。
19.可变数据类型:list、dict、set 不可变数据类型:int/float、str、tuple
20.1. Web开发 2. 桌面GUI开发 3. 人工智能和机器学习 4. 软件开发 5. 业务应用程序开发 6. 基于控制台的应用程序 7. 软件测试 8. Web自动化 9. 基于音频或视频的应用程序 10. 图像处理应用程序