一、简答题(20题)
1.Python中的Map Function是什么?
2.什么是正则的贪婪匹配
3.在 Python 类中,类方法和静态方法有什么区别?
4.Python中的局部变量和全局变量是什么?
5.Python中append,insert和extend的区别?
6.生成器和迭代器有什么区别?
7.什么是可变数据类型和不可变数据类型
8.谈谈你对多进程、多线程、以及协程的理解,项目是否用?
9.什么是负索引
10.对设计模式的理解,简述你了解的设计模式?
11.区分下break,continue和pass?
12.简述 OSI 七层协议
13.什么是异步非阻塞
14.break、continue、pass是什么?
15._init_在Python中有什么用?
16.try except else finally 的意义
17.Python 如何收集垃圾(无用的对象)?
18.re 的 match 和 search 区别
19.面向对象中__new__ 和 init 区别
20.with 方法打开文件的作用
参考答案
1.map函数在对可迭代对象的每一项应用特定函数后,会返回map对象。
2.Python 中默认是贪婪匹配模式 贪婪模式:正则表达式一般趋向于最大长度匹配 非贪婪模式:在整个表达式匹配成功的前提下,尽可能少的匹配
3.类方法是 Python 类中的第一个参数是类本身的方法。我们用 cls 这个参数来表示。 类方法不仅可以由实例调用,也可以由类直接调用。 静态方法是 Python 类中没有类或实例参数的方法。 因为静态方法不包含有关特定类或实例的参数。我们可以将其定义为类外的独立函数,并将其用作类外的其他普通函数。
4.全局变量:在函数外或全局空间中声明的变量称为全局变量。这些变量可以由程序中的任何函数访问。 局部变量:在函数内声明的任何变量都称为局部变量。此变量存在于局部空间中,而不是全局空间中。
5.append:在列表末尾添加新元素。 insert:在列表的特定位置添加元素。 extend:合并两个列表。
6.生成器和迭代器在Python中都用于创建可以进行迭代的对象,但它们之间有一些主要区别: 定义方式:迭代器需要定义一个类,并在类中实现**iter()和next()**方法。而生成器则可以直接使用一个函数,通过yield语句返回每个迭代的值。 简单性:相比之下,生成器的定义更简单。你只需要一个函数,就可以通过yield关键字生成值。而迭代器则需要更多的代码来定义类和方法。 资源使用:生成器和迭代器都是懒加载(lazy load)的,也就是说它们只有在需要返回值的时候才会生成值。但是生成器更进一步,它们在生成值后不会保存这些值。这意味着如果你需要迭代的数据集很大,或者如果你需要的值需要大量计算,那么生成器可能会比迭代器更节省资源。 使用场景:迭代器更适用于需要自定义复杂行为的情况,而生成器更适用于需要遍历大数据集或复杂数据流的情况。 总的来说,生成器是一种特殊的迭代器,它的定义更简单,也更容易使用,但同时也继承了迭代器的主要特性。
7.在Python中,数据类型可以分为两种:可变数据类型和不可变数据类型。不可变数据类型:这种数据类型的值一旦定义,就不能更改。如果尝试更改其值,实际上会创建一个新的对象。不可变数据类型的例子包括整数、浮点数、字符串、元组。例如,如果你有一个字符串变量,你不能更改这个字符串中的某个字符。试图这样做的话,Python会创建一个新的字符串。可变数据类型:与不可变数据类型相反,可变数据类型的值是可以更改的。也就是说,你可以在不创建新对象的情况下更改对象的值。可变数据类型的例子包括列表、字典以及集合。例如,如果你有一个列表,你可以更改列表中的元素,增加元素,或者删除元素,而不需要创建一个新的列表
8.进程:一个运行的程序(代码)就是一个进程,没有运行的代码叫程序,进程是系统资源分配的最小单位,进程拥有自己独立的内存空间,所有进程间数据不共享,开销大。线程: cpu调度执行的最小单位,也叫执行路径,不能独立存在,依赖进程存在,一个进程至少有一个线程,叫主线程,而多个线程共享内存可以极大地提高了程序的运行效率。协程: 是一种用户态的轻量级线程,协程的调度完全由用户控制,协程拥有自己的寄存器上下文和栈。协程调度时,将寄存器上下文和栈保存到其他地方,在切回来的时候,恢复先前保存的寄存器上下文和栈,直接操中栈则基本没有内核切换的开销,可以不加锁的访问全局变量,所以上下文的切换非常快。
9.Python 中的序列是有索引的,它由正数和负数组成。正的数字使用’0’作为第一个索引,‘1’作为第二个索引,以此类推 负数的索引从’-1’开始,表示序列中的最后一个索引,’ - 2’作为倒数第二个索引,依次类推
10.设计模式是为我们经常会碰到的一些编程问题构建的可重用解决方案,它是总结性和经优化的。一个设计模式并不像一个类或一个库那样能够直接作用于我们的代码,反之,设计模式更为高级,它是一种在特定情形下实现的方法模板。常见的是工厂模式和单例模式。 单例模式应用的场景一般发现在以下条件下: 资源共享的情况下,避免由于资源操作时导致的性能或损耗等,如日志文件,应用配置。控制资源的情况下,方便资源之间的互相通信。
11.break:跳出循环,不执行下一个循环。同时break后面的代码也不会执行。 pass:pass后面的代码还是会继续执行,也就是当前的循环还在继续。 continue:continue后面的代码不会执行,而是直接进入下一个循环。
12.是网络传输协议,人为的把网络传输的不同阶段划分成不同的层次 七层划分为:应用层、表示层、会话层、传输层、网络层、数据链路层、物理层 五层划分为:应用层、传输层、网络层、数据链路层、物理层 物理层:网线,电缆等物理设备 数据链路层:Mac 地址 网络层:IP 地址 传输层:TCP,UDP 协议 应用层:FTP 协议,Email,WWW 等
13.同步异步指的是调用者与被调用者之间的关系 所谓同步,就是在发出一个功能调用时,在没有得到结果之前,该调用就不会返回,一旦调用返回,就得到了返回值 异步的概念和同步相对,调用在发出之后,这个调用就直接返回了,所以没有返回结果。当该异步功能完成后,被调用者可以通过状态、通知或回调来通知调用者 阻塞非阻塞是线程或进程之间的关系 阻塞调用是指调用结果返回之前,当前线程会被挂起(如遇到io操作)。调用线程只有在得到结果之后才会返回。函数只有在得到结果之后才会将阻塞的线程激活 非阻塞和阻塞的概念相对应,非阻塞调用指在不能立刻得到结果之前也会立刻返回,同时该函数不会阻塞当前线程
14.break:在满足条件时,它将导致程序退出循环。 continue:将返回到循环的开头,它使程序在当前循环迭代中的跳过所有剩余语句。 pass:使程序传递所有剩余语句而不执行。
15.“init”是Python类中的保留方法。 它被称为构造函数,每当执行代码时都会自动调用它,它主要用于初始化类的所有变量。
16.try…except…else 没有捕获到异常,执行 else 语句 try…except…finally 不管是否捕获到异常,都执行 finally 语句
17.Python 使用一种称为引用计数的方法来决定何时需要在内存中收集对象。 简单来说,Python 会计算每个对象的引用计数,当一个对象没有引用时,会自动收集。
18.match()函数只检测要匹配的字符是不是在 string 的开始位置匹配,search()会扫描整个 string 查找匹配
19.__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__函数
20.开文件在进行读写的时候可能会出现一些异常状况,如果按照常规的 f.open 写法,我们需要 try,except,finally,做异常判断,并且文件最终不管遇到什么情况,都要执行 finally f.close() 关闭文件,with 方法帮我们实现了 finally 中 f.close