一、简答题(20题)
1.Python 中有几个名字空间,分别是什么
2.什么是异步非阻塞
3.解释型和编译型语言的区别
4.对设计模式的理解,简述你了解的设计模式?
5._init_在Python中有什么用?
6.生成器和迭代器有什么区别?
7.Python 中的 GIL
8.Python中OOPS是什么?
9.Python中的列表和元组有什么区别?
10.with 方法打开文件的作用
11.python新式类和经典类的区别
12.Python支持多重继承吗?
13.什么是正则的贪婪匹配
14.在 Python 类中,类方法和静态方法有什么区别?
15.range 和 xrange 的区别
16.Python 面向对象中的继承有什么特点
17.生成器和迭代器的区别?
18.Python中==和is的区别
19.解释//、%、* *运算符?
20.什么是 C/S 和 B/S 架构
参考答案
1.Python 总共有 4 个名字空间: • 局部名字空间 ( locals ) • 闭包名字空间 ( closures ) • 全局名字空间 ( globals ) • 内建名字空间 ( builtin )
2.同步异步指的是调用者与被调用者之间的关系 所谓同步,就是在发出一个功能调用时,在没有得到结果之前,该调用就不会返回,一旦调用返回,就得到了返回值 异步的概念和同步相对,调用在发出之后,这个调用就直接返回了,所以没有返回结果。当该异步功能完成后,被调用者可以通过状态、通知或回调来通知调用者 阻塞非阻塞是线程或进程之间的关系 阻塞调用是指调用结果返回之前,当前线程会被挂起(如遇到io操作)。调用线程只有在得到结果之后才会返回。函数只有在得到结果之后才会将阻塞的线程激活 非阻塞和阻塞的概念相对应,非阻塞调用指在不能立刻得到结果之前也会立刻返回,同时该函数不会阻塞当前线程
3.编译型语言:把做好的源程序全部编译成二进制的可运行程序。然后,可直接运行这个程序。如:C,C++ 解释型语言:把做好的源程序翻译一句,然后执行一句,直至结束!如:Python, (Java 有些特殊,java程序也需要编译,但是没有直接编译称为机器语言,而是编译称为字节码,然后用解释方式执行字节码。)
4.设计模式是为我们经常会碰到的一些编程问题构建的可重用解决方案,它是总结性和经优化的。一个设计模式并不像一个类或一个库那样能够直接作用于我们的代码,反之,设计模式更为高级,它是一种在特定情形下实现的方法模板。常见的是工厂模式和单例模式。 单例模式应用的场景一般发现在以下条件下: 资源共享的情况下,避免由于资源操作时导致的性能或损耗等,如日志文件,应用配置。控制资源的情况下,方便资源之间的互相通信。
5.“init”是Python类中的保留方法。 它被称为构造函数,每当执行代码时都会自动调用它,它主要用于初始化类的所有变量。
6.生成器和迭代器在Python中都用于创建可以进行迭代的对象,但它们之间有一些主要区别: 定义方式:迭代器需要定义一个类,并在类中实现**iter()和next()**方法。而生成器则可以直接使用一个函数,通过yield语句返回每个迭代的值。 简单性:相比之下,生成器的定义更简单。你只需要一个函数,就可以通过yield关键字生成值。而迭代器则需要更多的代码来定义类和方法。 资源使用:生成器和迭代器都是懒加载(lazy load)的,也就是说它们只有在需要返回值的时候才会生成值。但是生成器更进一步,它们在生成值后不会保存这些值。这意味着如果你需要迭代的数据集很大,或者如果你需要的值需要大量计算,那么生成器可能会比迭代器更节省资源。 使用场景:迭代器更适用于需要自定义复杂行为的情况,而生成器更适用于需要遍历大数据集或复杂数据流的情况。 总的来说,生成器是一种特殊的迭代器,它的定义更简单,也更容易使用,但同时也继承了迭代器的主要特性。
7.GIL 是 Python 的全局解释器锁,同一进程中假如有多个线程运行,一个线程在运行 Python 程序的时候会占用 Python 解释器(加了一把锁即 GIL),使该进程内的其他线程无法运行,等该线程运行完后其他线程才能运行。如果线程运行过程中遇到耗时操作,则解释器锁解开,使其他线程运行。所以在多线程中,线程的运行仍是有先后顺序的,并不是同时进行
8.面向对象编程,抽象(Abstraction)、封装(Encapsulation)、继承(Inheritance)、多态(Polymorphism)
9.list 是可变的对象,元组 tuple 是不可变的对象。也就是说列表中的元素可以进行任意修改,而元组中的元素无法修改。
10.开文件在进行读写的时候可能会出现一些异常状况,如果按照常规的 f.open 写法,我们需要 try,except,finally,做异常判断,并且文件最终不管遇到什么情况,都要执行 finally f.close() 关闭文件,with 方法帮我们实现了 finally 中 f.close
11.在python里凡是继承了object的类,都是新式类 Python3里只有新式类 Python2里面继承object的是新式类,没有写父类的是经典类 经典类目前在Python里基本没有应用 保持class与type的统一对新式类的实例执行a.class与type(a)的结果是一致的,对于旧式类来说就不一样了。 对于多重继承的属性搜索顺序不一样新式类是采用广度优先搜索,旧式类采用深度优先搜索。
12.Python可以支持多重继承。多重继承意味着,一个类可以从多个父类派生。
13.Python 中默认是贪婪匹配模式 贪婪模式:正则表达式一般趋向于最大长度匹配 非贪婪模式:在整个表达式匹配成功的前提下,尽可能少的匹配
14.类方法是 Python 类中的第一个参数是类本身的方法。我们用 cls 这个参数来表示。 类方法不仅可以由实例调用,也可以由类直接调用。 静态方法是 Python 类中没有类或实例参数的方法。 因为静态方法不包含有关特定类或实例的参数。我们可以将其定义为类外的独立函数,并将其用作类外的其他普通函数。
15.range([start,] stop[, step]),根据start与stop指定的范围以及step设定的步长,生成一个序列。而 xrange 生成一个生成器,可以很大的节约内存
16.a. 同时支持单继承与多继承,当只有一个父类时为单继承,当存在多个父类时为多继承 b. 子类会继承父类所有的属性和方法,子类也可以覆盖父类同名的变量和方法 c. 在继承中基类的构造(init())方法不会被自动调用,它需要在其派生类的构造中专门调用 d. 在调用基类的方法时,需要加上基类的类名前缀,且需要带上 self 参数变量。区别于在类中调用普通函数时并不需要带上 self 参数
17. 迭代器是一个更抽象的概念,任何对象,如果它的类有 next 方法和 iter 方法返回自己本身,它就是可迭代的。对于 string、list、dict、tuple 等这类容器对象,使用for循环遍历是很方便的,for 语句实际上会对容器对象调用 iter() 函数。iter() 会返回一个定义了 next() 方法的迭代器对象,它在容器中逐个访问容器内元素,在没有后续元素时,next()会抛出一个StopIteration异常。 生成器(Generator)是创建迭代器的简单而强大的工具。它们写起来就像是正规的函数,只是在需要返回数据的时候使用yield语句。生成器能做到迭代器能做的所有事,而且因为自动创建iter()和next()方法,生成器显得特别简洁,而且生成器也是高效的,使用生成器表达式取代列表解析可以同时节省内存。除了创建和保存程序状态的自动方法,当发生器终结时,还会自动抛出StopIteration异常。
18.is用于判断两个变量引用对象是否为同一个,==用于判断引用变量的值是否相等。
19.//(Floor Division)-这是一个除法运算符,它返回除法的整数部分。 例如:5 // 2 = 2 %(模数)-返回除法的余数。 例如:5 % 2 = 1 **(幂)-它对运算符执行指数计算。a ** b表示a的b次方。 例如:5 ** 2 = 25、5 ** 3 = 125
20.B/S 又称为浏览器/服务器模式。比如各种网站,jupyter notebook 等。优点:零安装,维护简单,共享性好。缺点:安全性较差,个性化不足 C/S 又称为客户端/服务器模式。比如微信客户端,Oracle 客户端等。优点:安全性好,数据传输较快,稳定。缺点:对 PC 机操作系统等有要求,当客户端较多时,服务器端负载较大