后端基础面试汇总-python

resultful风格:前后端分离,后端需要一种设计模式来规范约束。

每一个URL代表一种资源;客户端和服务器之间,传递这种资源的某种表现层;客户端用户四个HTTP动词,对服务器资源进行操作,实现“表现层状态转化”。

Web开发中的存在安全漏洞:csrf利用cookie进行跨域伪造攻击,SQL注入。

csrf是跨站请求伪造,攻击者伪造用户信息,像访问一个用户自己曾经认证的网站发送出去。譬如用户访问网站A留下了cookie,又访问网站B B网站携带攻击性代码访问。

防御CSRF攻击:主要有三个策略:验证Http Refer字段、有请求地址中添加token并验证、在HTTP头中自定义属性并验证;

验证HTTP Referer字段:譬如Refer字段,用户每次登陆都要先登陆一个域名,再通过才触发下一步事件。

在请求地址中添加token并验证:携带随机token,无法伪造。服务端加一个拦截器来验证这个token。

在HTTP头中自定义属性并验证:和http请求携带token的方法类似,但这种是放在请求头中。

Http如何保持安全传输:

重要数据加密:比如用户名和密码,我们需要加密。

非重要数据要签名:签名的目的是防止篡改。

登陆态怎么做:http是无状态,请求带上token,判断token是否过期;

装饰器:给函数一个装饰,用于扩充函数功能。譬如日志打印之类的功能,依赖于functools。

from functools import wraps


def decorator_name(f):
    @wraps(f)
    def decorated(*args, **kwargs):
        if not can_run:
            return "Function will not run"
        return f(*args, **kwargs)

    return decorated


@decorator_name
def func():
    return ("Function is running")


can_run = True
print(func())
# Output: Function is running

can_run = False
print(func())

__new__、__call__特殊方法:

__new__:对象的初始化,是一个实例方法,第一个参数是self。

__call__:对象可call,注意不是类,是对象。模拟函数的行为,如果一个对象x提供了该方法,就可以像函数一样使用它。

*args, **kwargs是什么:

*args保存多余变量,保存方式为元组。

**kwargs保存带有变量名的多余变量,保存方式为字典。

Python内存管理:

Python使用了内存池来内存管理,其内存管理以金字塔的形式对内存功能进行划分,-1,-2层主要用于对操作系统进行操作,0层中是C的malloc,free等等内存分配和释放函数。1、2层是一个内存池,当对象小于265K时将直接由这片内存池进行分配内存,否则将调用第0层中的C函数来分配内存,当小于265K的对象被销毁时,其内存也不会被销毁,只是返回给了内存池以便二次利用。2层是对Python对象进行操作。

Python多进程:

Python中多线程由于有GIL的影响,导致在任意时间内只有一个线程在运行,所以Python的多线程在处理计算密集型任务上反而不如单线程,只有在处理IO密集型任务上多线程才能发挥实力,在等待IO过程中Python C源码会释放GIL,最终导致线程在等待IO过程中会暂停去执行其他的线程。python中GIL主要是由于历史原因导致Cpython虚拟机中的GIL难以移除,同时GIL的存在保证了多线程之间数据的完整性以及状态同步。

类方法、静态方法、实例方法:

实例方法:第一个参数是“self”,通过它可以使用实例的属性和方法,也可以使用类的属性和方法。调用:只能由实例对象调用。

类方法:使用装饰器@classmethod。第一个参数是“cls”,通过它可以使用类的属性和方法,但不能传实例的属性和方法。调用:类对象或实例对象都可以调用。

静态方法:使用装饰器@staticmethod。参数随意,没有“self”和“cls”参数,方法体中不能使用类或者实例的任何属性和方法。调用:类对象或实例对象都可以调用。

python上下文管理器是什么:

Python中上下文管理器使用with来调用主要用于数据库连接,文件操作,网络操作。

其作用是:如果在进行一些打开资源操作时出现异常,上下文管理器将自动的执行一些资源清理操作。在进入上下文管理器时,Python会优先调用对象的__enter__方法,该方法返回一个对象用于进行一些操作,如果在进行一些操作时发生了异常Python则__exit__该对象接受三个参数第一个参数异常类,第二个参数异常提示字符串,第三个参数traceback对象。

functools的wraps是做什么的:

wraps是一个装饰器功能是:由于被装饰的函数传入到装饰器中时已经不是原函数了,而是一个新的函数,并且丢失一些原函数的属性,为了不影响函数的使用,可以使用wraps来抵消这种副作用。

请说一说ORM实现原理:

ORM使用了Python的属性描述符协议实现,通过另外一个类来描述变量的属性类型,再给这个属性进行赋值时会调用__set__方法,访问属性则会调用__get__方法删除则调用__delete__方法。

迭代器和生成器的区别:

迭代器是这样的对象:实现了无参数的next方法,返回下一个元素,如果没有元素了,那么抛出StopIteration异常;并且实现iter方法,返回迭代器本身。

可迭代对象包含迭代器。

如果一个对象拥有__iter__方法,其是可迭代对象;如果一个对象拥有next方法,其是迭代器。

定义可迭代对象,必须实现__iter__方法;定义迭代器,必须实现__iter__和next方法。

生成器是一种使用普通函数语法定义的迭代器,包含yield语句的函数都称为生成器,每次yield生成一个值后,函数都将冻结,及再次停止执行;被重新唤醒后,函数将从停止的地方执行。

Python中列表和元组的异同:

相同:列表和元组都是容器并且是可迭代对象,二者可以包含任意类型的对象。

不同:列表是可变的,元组是不可变。

Python列表:

使用了分离技术实现的动态顺序表;索引查询的时间复杂度是O(1)。

Python字典的实现:

Python的字典使用了哈希表来储存key、value,当添加一个数据时会把key通过哈希函数转换成一个数字,然后将数字对存放value的数组长度取余并将取余结果当做数组下标,将value存放在该取余结果为下标,将value存放在该取余结果为下标的数组中。数据查询时将key转换为对应的数组下标,并定位到数组的位置获取value。

pickling和unpickling:

Pickle模块读入任何Python对象,将它们转换成字符串,然后使用dump函数将其存储到一个文件中——这个过程叫做pickling,反之从存储的字符串文件中提取Python对象的过程,叫做unpickling。

工具帮助debug或做静态分析:

PyChecker是一个静态分析工具,不仅能报告源代码错误,并且会报告错误类型和复杂度。

Pylint是检验模块是否达到代码标准的另一个工具。

dis用来查看Python对象的字节码。

Python的作用域:

在Python中,一个对象的作用域总是由代码被赋值的地方所决定的。当遇到一个变量时Python会按照:本地作用域->当前作用域被嵌入的本地作用域->全局/模块作用域->内置作用域顺序搜索。

Python的参数传递还是引用传递:

可变对象使用引用传递,不可变对象使用值传递。

写一个函数,输入一个字符串,返回倒叙排列的结果:

def reverse(text):
    return text[::-1]

python中is和==区别:

is比较的是对象在内存的地址,==比较的是对象中的值。

Python的闭包:

内层函数引用了其外部作用域的变量,然后返回内层函数的情况,称为闭包,创建一个闭包必须满足以下几点:

1、必须有一个内嵌函数

2、内嵌函数必须引用外部函数中的变量,外层空间中被引用的变量叫做内层函数的环境变量

3、外部函数的返回值必须是内嵌函数

4、环境变量和内层非全局函数一起构成了闭包

Python的自省:

自我检查行为。dir(), type(), hasattr(), isinstance();通过这些函数,我们能够在程序运行时得知对象的类型,判断对象是否存在某个属性,访问对象的属性。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值