本科应届生Python web面试/笔试的总结(一)

一、Python语言特性

1.什么是迭代器?和可迭代对象Iterable的区别是什么?

可以用for循环的对象都是Iterable类型;可以用next()函数的对象都是Iterator类型,
实现一个类的__iter__()和__next__()方法,该类就是迭代器。

2 什么是生成器?如何创建生成器?

生成器是迭代器的一种,使用yield返回值函数,每次调用yield会暂停,可以使用next()函数
和send()函数恢复生成器,send的参数让yield返回该值;

创建方法:1.列表生成式外面套小括号
		 2.   def func(n):
		 	 		for i in range(n):
		 	 			yield i

3 . 什么是装饰器?请手写一个装饰器

装饰器可以在不修改函数的前提下,给函数加功能。实际调用时,将被装饰的函数作为参数传给装饰
函数。 def decorator(func):
				print("我是装饰器")
			 	return func
		 @decorator
		 def f1():
		 		print('我是被装饰函数')
		 f1()

4 . 函数和方法的区别

写在class外面的叫函数,写在里面的叫方法

5 .什么叫闭包函数

外函数中定义了一个内函数,内函数里运用了外函数的临时变量,并且外函数的返回值是内函数的引
用。这样就构成了一个闭包
def outer( a ):
 	 b = 10
  	 def inner():
      	 print(a+b)
     return inner

6 .赋值、copy、deepcopy的区别

可变对象的赋值是传值,不可变对象是传引用  
deepcopy是完全独立出来,copy是贴标签
copy要分两种情况进行讨论:

1)复制不可变对象(数值,字符串,元组)和“等于赋值”的情况一样
2)复制可变对象时,只能复制简单子对象,比如list中有list,原来的变量改变 复杂 子对象,会影响。

7.@property

@property是一个装饰器(decorator),作用是可以像访问变量一样访问方法。

8.属性访问控制

比如:__getattr__ 找不到属性的时候调用,__setattr__设置属性时调用,

9.dict (每个对象均具备该属性)

作用:字典类型,存放本对象的属性,key(键)即为属性名,value(值)即为属性的值,形式为
{attr_key : attr_value}
对象属性的访问顺序:
① __getattribute__(), 无条件调用
② 数据描述符:由 ① 触发调用 (若人为的重载了该 __getattribute__() 方法,可能会调职无法调用描述符)
③ 实例对象的字典(若与描述符对象同名,会被覆盖哦)
④ 类的字典
⑤ 非数据描述符
⑥ 父类的字典    
⑦ __getattr__() 方法

9.描述符

描述符是一种class,定义了__get__,__set__或__delete__方法的对象就是描述符对象。property来说的缺点就是它
们不能重复使用

• _get_(self, instance, owner) —获取属性时调用,返回设置的属性值,通常是_set_中的
value,或者附加的其他组合值。 
• _set_(self, instance, value) — 设置属性时调用,返回None. 
• _delete_(self, instance) — 删除属性时调用,返回None 
其中,instance是这个描述符属性所在的类的实体,而owner是描述符所在的类。
https://www.cnblogs.com/astropeak/p/9032271.html
  1. @static

11 . python的垃圾回收机制

引用计数:将资源的被引用次数保存起来,当被引用次数变为零时就将其释放
分代收集:存在的时间越久越不是垃圾,按优先级分为三代
标记清除:将资源标记为垃圾,然后清除

12 . python的内存管理机制:

引入计数、垃圾回收、内存池机制
内存池机制:
Python中有分为大内存和小内存:(256K为界限分大小内存)
1、大内存使用malloc进行分配
2、小内存使用内存池进行分配
内存池的概念就是预先在内存中申请一定数量的,大小相等的内存块留作备用,当有新的内存需求		
时,就先从内存池中分配内存给这个需求,不够了之后再申请新的内存。

13 .Python多线程和多进程

Python通过两个标准库thread和threading提供对线程的支持。

线程和进程的区别在于:
进程是操作系统资源分配的基本单位,线程是cpu调度的基本单位
进程中,同一个变量,各自有一份拷贝存在于每个进程中,互不影响
,多线程中,所有变量都由所有线程共享。



4个线程确确实实打到了这4个cpu上,同一时间只有一个线程在一个CPU上执行,这就是为了避免数据操作出错。这也是CPython的一个缺陷
GIL全局解释器锁,线程只能交替执行

14 .如何提高 Python 的运行效率,请说出不少于 2 种提高运行效率的方法?

使用生成器
关键代码使用外部功能包:Cython、Pylnlne、PyPy、Pyrex
针对循环的优化——尽量避免在循环中访问变量的属性;

15 .分布式进程

multiprocessing模块不但支持多进程,其中managers子模块还支持把多进程分布到多台机器上。
可以写一个服务进程作为调度者,将任务分布到其他多个进程中,依靠网络通信进行管理。

16 .序列化

内存中的变量 变成 可存储或可传输 的对象。卸载dumps()和装载load()  区别:装载以后才能传输
Python语言特定的序列化模块是pickle,更通用、更符合Web标准的是json模块。

17 .简单描述同步和异步

同步就是调用之后,进程阻塞,直道得到结果。
异步就是调用之后,不立刻得到结果,继续往下走

18 .介绍协程

执行过程中,在子程序内部可中断,然后转而执行别的子程序,在适当的时候再返回来接着执行。
相比与线程,没有线程切换的开销,控制共享资源不加锁,只需要判断状态,没有变量冲突

19 .创建进程的几种方法

fork()函数
multiprocessing模块中的Process类
继承Process类,重新run()方法
进程池Pool

20.*arg和**kwarg的作用

允许传入多个参数,
*arg会把 单个参数 转化为 元组
**kwarg会把 k=v类型的参数 转化为 字典

21.Python单例模式的四种方法

使用__new()__判断当前类有没有实例
使用__new()__创建实例时把所有实例的__dict__指向同一个字典
使用装饰器,判断cls是否在__instance这个字典中
先在另一个py文件中创建类和一个实例,再import这个实例

22.函数的参数传递是按值传递还是按引用传递

不可变    按值传递
可变       按引用传递,可以改变变量值

数值类型(int和float)、字符串str、元组tuple都是不可变类型

23.python解释器

CPython 在命令行运行python,使用的就是CPython
Ipython是基于CPython交互式解释器,便于自己测试一些小问题,比如//和/    有时候记不清
PyPy对Python代码进行动态编译,提高执行速度
Jython是运行在Java平台上的Python解释器,可以直接把Python代码编译成Java字节码执行

24.sys模块和os模块的区别

sys负责程序和与python解释器的交互
os负责程序与操作系统的交互

二、Python面向对象
1.什么是面向对象编程

是一种提高 复用性 的软件开发方法,封装、继承、多态

2 . 私有和公有

	单/双下划线都表示私有属性,_表示protect,约定不要访问。双下划线是private,可以通过
	实例._student__name来访问__name。
	另外__xxx__表示是内置变量或方法,区别于自定义的
	另外xx_是为了避免和关键字冲突

3 .类属性/方法和实例属性/方法:

直接在class中定义的属性就是类属性,通过self绑定的是实例属性

4 .__new__和__init__的区别(这个问题也是老生常谈了,很烦)

__new__()是新式类的方法先__init__()可以调用其他类的构造方法或者直接返回别的对象来作为本
类 的实例

5 .新式类和经典类(不一定会问,毕竟现在都是学python3了)

1.Python 3.x中没有经典类,默认都是新式类,自动继承object
2.继承顺序的区别
3.经典类中所有的类都是classobj类型,而类的实例都是instance类型,不方便判断

6.动态语言(弱类型语言)和静态语言

是指程序在运行时可以改变其结构

7 .对象和None比较时为什么使用is而不是使用双等号

因为None在Python里是个单例对象,一个变量如果是None,它一定和None指向同一个内存地址。
== None背后调用的是__eq__,可以重写一个类的__eq__让其返回True,这样只要使用==就返回
True

8 .super()的作用

super 是用来解决多重继承问题的,直接用类名调用父类方法在使用单继承的时候没问题,但是如
果使用多继承,会涉及到查找顺序(MRO)、重复调用(钻石继承)等种种问题。

9.特性、静态方法、类方法

@property  可以像访问变量一样访问方法,比如:stu.name 
@staticmethod       #静态方法 类或实例均可调用
@classmethod       只能访问类属性

二、排序算法

稳定性算法: 基数排序 , 插入排序 , 冒泡排序, 归并排序

1.冒泡排序

从左往右(或者反向)遍历,比较相邻两个数,交换位置或者不,第一轮结束,最右边的数就是最小
或最大的,依次类推。

2 .快速排序(找基准,分治递归)

分为递归部分和排序部分,通常取第一个记录键值为基准,设为mid,从mid向左右两边,往右边找一个
小于6的数,再往左边找一个大于6的数,交换位置,如果有一边先到了尽头则插入,通过Partition
函数实现,之后递归调用。

3.选择排序(选择最值)

首先在未排序序列中找到最小(大)元素,存放到排序序列的起始位置,然后,再从剩余未排序元素
中继续寻找最小(大)元素,然后放到已排序序列的末尾,以此类推。

4 插入排序

第一个数据视为已排序,对于未排序数据,在已排序序列中从后向前扫描,找到相应位置并插入。

5.堆排序(实际上是在数组里操作,没有堆,只是模拟堆)

建立无序堆,一个函数专门用于调整为大顶堆,第一个和最后一个交换,删除最后一个,再调整。
https://blog.csdn.net/qq_34840129/article/details/80638225

6 .归并排序

递归细分,再递归合并(递归的问题要注意顺序)
https://www.cnblogs.com/webber1992/p/6142527.html

三、Nosql(目前只学过redis)
1.redis的使用场景

String数据结构是简单的key-value类型,value其实不仅可以是String,也可以是数字。 
常规key-value缓存应用; 
常规计数:微博数,粉丝数等。

Hash是一个string类型的field和value的映射表,hash适合用于存储对象。 比如我们可以用
Hash数据结构来存储用户信息,商品信息等等。
Key仍然是用户ID, value是一个Map,这个Map的key是成员的属性名,value是属性值,这样对数
据的修改和存取都可以直接通过其内部Map的Key(Redis里称内部Map的key为field

2.redis的优点

读写性能优异
支持数据持久化, AOF 和 RDB 两种方式
支持主从复制,可以读写分离。
数据类型丰富

3.持久化

RDB:功能核心函数rdbSave(生成RDB文件)和rdbLoad(从文件加载内存)两个函数

四、网络知识(这一块内容太多,我觉得不会问得很细)
1.谈谈对http协议的理解

无状态、无连接、支持多种类型,基于tcp/ip协议,位于OSI的应用层

2 .https

HTTPS协议是由SSL+HTTP协议构建的,可进行加密传输

3 .请简单说一下你了解的端口及对应的服务

6379 redis
3306 Mysql 
443 HTTPS
80 HTTP
21 FTP(文件传输协议)
22 SSH
25 SMTP(简单邮件传输协议)
53 DNS域名服务器

4 .TCP UDP的区别

TCP面向连接
TCP提供可靠的服务(数据传输),UDP无法保证
TCP面向字节流
TCP数据传输慢
TCP头部开销大

5.IP地址的分类

类型             起始
A  				0.0.0.0
B				128.0.0.0
C				192.0.0.0
D				224.0.0.0
E				240.0.0.0

6.TCP的三次握手与四次挥手

ACK...这些是报文里面的标志位
https://blog.csdn.net/qq_38950316/article/details/81087809
(连接时)三次握手:Client发送SYN请求连接,Server发送SYN和ACK,Cleint回复ACK(个人理解
因为发了SYN就必须回复ACK)
(释放时)四次挥手:Cliet发送FIN请求希望断开,Sever回复ACK,让它等待自己传完数据,完事后
发FIN和ACK,Client回ACK

7.浏览器中输入www.baidu.com后执行的全部过程

在这里插入图片描述
8.什么是socket?

socket是在应用层和传输层之间的一个抽象层,它把TCP/IP层复杂的操作抽象为几个简单的接口供
应用层调用以实现进程在网络中通信

五、Django
1.谈谈你对Django的认识

开发效率高,使用ORM不用写sql语句,自带用户模块和管理后台,自带sqlite数据库

2 .什么是wsgi,uwsgi,uWSGI?

#WSGI:
web服务器网关接口,是一套协议。用于接收用户请求并将请求进行初次封装,然后将请求交给web
框架
实现wsgi协议的模块:
1.wsgiref,本质上就是编写一个socket服务端,用于接收用户请求(django)
2.werkzeug,本质上就是编写一个socket服务端,用于接收用户请求(flask)
#uwsgi:
与WSGI一样是一种通信协议,它是uWSGI服务器的独占协议,用于定义传输信息的类型
#uWSGI:
是一个web服务器,实现了WSGI协议,uWSGI协议,http协议

3 .django路由系统中name的作用?

用于反向解析路由,相当于给url取个别名,只要这个名字不变,即使对应的url改变通过该名字也能
找到该条url

4.简述Django下的(内建的)缓存机制

开发调试缓存(为开发调试使用,实际上不使用任何操作);
内存缓存(将缓存内容缓存到内存中);
文件缓存(将缓存内容写到文件 );
数据库缓存(将缓存内容存到数据库);
memcache缓存(包含两种模块,python-memcached或pylibmc.)
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值