python面试题总结

列出不少于5个python标准库

re、datetime、copy、math、random、itertools、functools、csv、os.path

请简述域名和IP的关系

ip地址是一个32位的二进制数,通常被分割为4个“8位二进制数”(也就是4个字节)。是一种在Internet上的给主机编址的方式,也称为网际协议地址。IP地址是IP协议提供的一种统一的地址格式,它为互联网上的每一个网络和每一台主机分配一个逻辑地址,以此来屏蔽物理地址的差异。

域名是由一串用点分隔的名字组成的Internet上某一台计算机或计算机组的名称,用于在数据传输时标识计算机的电子方位。域名是一个IP地址上的“面具” ,一个域名的目的是便于记忆和沟通的一组服务器的地址(网站,电子邮件,FTP等)。

IP和域名是多对多的关系,一个IP可以对应多个域名,一个域名也可以对应多个IP(比如:www.baidu.com这个域名对应了很多个IP地址,不同地区访问的是不同的IP地址)

*args的用法

python中规定参数前带 * 的,称为可变位置参数,只是我们通常称这个可变位置参数为*args而已,叫其他的一样一样滴。

*args:是一个列表,传入的参数会被放进列表里。

def test_args(f,*args):
    for x in args:
        print(x)
test_args(1,2,3,4,5)

**kwargs的用法

同理,python中规定参数前 带 ** 的,称为可变关键字参数,通常**kwargs

**kwargs:是一个字典,传入的参数以键值对的形式存放到字典里。

def test_kwargs(f,**kwargs):
    print(kwargs.items())
    for k,v in kwargs.items():
        print(k,v)

test_kwargs(1,a=2,b=3,c=4)

DateTimeField中auto_now与auto_now_add的区别

auto_now:每当对象被保存时将字段设为当前日期,常用于保存最后修改时间。
auto_now_add:每当对象被创建时,设为当前日期,常用于保存创建日期(注意,它是不可修改的)。
设置上面两个参数就相当于给field添加了editable=False和blank=True属性。
如果想具有修改属性,请用default参数。

字典推导式

对于字典来说,跟列表和元祖一样,也可以根据推导式快速生成一个字典,表现形式与列表推导式类似,只不过将"[]"改成"{}"

{键表达式:值表达式 for 循环}

 例如:

import random
randomdict = {i : random.randint(10, 100) for i in range(1, 5)}
print(randomdict)

# {1: 46, 2: 67, 3: 17, 4: 62}

字典合并

dict1 = {'name':'allen','age':24}
dict2 = {'city':'chengdu','job':'python developer'}

dictMerge = dict1.copy()
dictMerge.update(dict2)
print(dict1)

# {'city': 'chengdu', 'job': 'python developer', 'age': 24, 'name': 'allen'}

MTV与MVC的区别

MTV(Model-Templates-View 模型-模板-视图)

MVC(Model-View-Controller 模型-视图-控制器)

也就是说MTV是将MVC中的V拆分成V、T,而C由框架去实现。MTV的目的就是数据如何呈现,MVC的目的就是呈现哪一个数据。

如何求素数

# 素数又称质数,0,1不是质数

# 除了1和它自身以外,不能被其他自然数整除的数

def prime(n):
    if n<= 1:
        return False
    for i in range(2,n):
        if n % i ==0:
            return False
    return True

for i in range(2,100):
    if prime(i):
        print(i,end=" ") # 2 3 5 7 11 13 17 19 23 29 31 37 41 43 47 53 59 61 67 71 73 79 83 89 97 

高阶函数

# map()函数:接受一个函数f和一个list,并把这个函数f作用在这个list上面
def f(x):
    return x*x
print(list(map(f,[1,2,3,4,5]))) #注意python3中不能直接打印出map函数,输出一个map对象,必须加一个list()进行输出
#输出[1, 4, 9, 16, 25]

# reduce()函数:f必须接受两个参数,reduce实际上是对list的每个元素调用f
# 在 Python3 中,reduce() 函数已经被从全局名字空间里移除了,它现在被放置在 fucntools 模块里,
# 如果想要使用它,则需要通过引入 functools 模块来调用 reduce() 函数:
from functools import reduce
def f(x,y):
    return x * y # 如果这里的*换成+,则是一个累加
print(reduce(f,[1,2,3,4])) 
#输出24

# filter()函数:过滤一些元素
def is_odd(x):
    return x % 2 == 1
print(list(filter(is_odd,[1,2,3,4,5,6,7,8,9,10])))#注意python3中不能直接打印出filter函数,这里会输出一个对象,必须加一个list()进行输出
#输出[1, 3, 5, 7, 9]

# sorted()函数:iterable 可迭代对象进行排序
# sort:只能对list进行排序,如果将列表换成元祖就无法使用了
a = [2,1,3,9,8,4,5,7,6]
print(sorted(a)) #默认是升序,如果需要降序在列表参数后面加上reverse=True
a.sort()
print(a) #[1, 2, 3, 4, 5, 6, 7, 8, 9]

Python中__new__与__init__方法的区别

       __new__:

       触发时机:在实例化时触发      

       参数:至少一个cls接受当前类

       返回值:必须返回一个对象实例      

       作用:实例化对象

       注意:实例化对象是object类底层实现,其他类继承了object的__new__才能够实现实例化对象

       __init__:

       触发时机:初始化对象时触发(不是实例化触发,但是和实例化在一个操作中)   

       参数:至少一个self接受对象

       返回值:无   

       作用:初始化对象成员

       注意:使用该方法初始化的成员都是直接写入对象当中,类中无法具有

什么是匿名函数?

 Lambda函数,不用担心函数名冲突,不过python对匿名函数支持有限,只有一些简单的情况下可以使用

# 声明一个简单的lambda表达式
mylamb = lambda x,y:x+y
# 调用函数
result = mylamb(8,9)
print(result)

简要概述一下python中生成器和迭代器

(1)迭代器:

迭代器协议:对象需要提供next()方法,它要么返回迭代中的下一项,要么就引起一个StopIteration异常,以终止迭代。

可迭代对象:实现了迭代器协议对象。list、tuple、dict都是Iterable(可迭代对象),但不是Iterator(迭代器对象)。但可以使用内建函数iter(),把这些都变成Iterable(可迭代器对象)。

for item in Iterable 循环的本质就是先通过iter()函数获取可迭代对象Iterable的迭代器,然后对获取到的迭代器不断调用next()方法来获取下一个值并将其赋值给item,遇到StopIteration的异常后循环结束。

(2)生成器:

将列表生成式中[]改变为()数据结构会改变,从列表变为生成器;

列表受内存限制,所以没有必要创建完整的列表(节省大量内存空间),在python中我们可以采用生成器:边循环边计算的机制;

生成器是只能遍历一次的。生成器是一类特殊的迭代器。还能使用 def 定义函数,但是,使用yield而不是return语句返回结果。yield语句一次返回一个结果,在每个结果中间,挂起函数的状态,以便下次从它离开的地方继续执行。

Python的垃圾回收机制(garbage collection)

(1)当gc模块的计数器达到阈值,垃圾自动回收

(2)当调用gc.collect(),垃圾收到回收

(3)程序退出的时候,python解释器来回收垃圾

函数装饰器的作用

装饰器本质上是一个Python函数,它可以让其他函数在不需要做任何代码变动的前提下增加额外功能,装饰器的返回值也是一个函数对象。

它经常用于有切面需求的场景,比如:插入日志、性能测试、事务处理、缓存、权限校验等场景。有了装饰器,我们就可以抽离出大量与函数功能本身无关的雷同代码并继续重用。概括的讲,装饰器的作用就是为已经存在的对象添加额外的功能。

进程、线程的区别

(1)定义的不同

进程是系统进行资源分配和调度的一个独立单位。

线程是进程的一个实体,是CPU调度和分派的基本单位,它是比进程更小的能独立运行的基本单位。线程自己基本上不拥有系统资源,只拥有一点在运行中必不可少的资源(如程序计数器,一组寄存器和栈),但是它可与同属一个进程的其他的线程共享进程所拥有的全部资源。

(2)区别

一个程序至少有一个进程,一个进程至少有一个线程。

线程的划分尺度小于进程(资源比进程少),使得多线程程序的并发性高。

进程在执行过程中拥有独立的内存单元,而多个线程共享内存,从而极大地提高了程序的运行效率。

线线程不能够独立执行,必须依存在进程中。

(3)优缺点

线程和进程在使用上各有优缺点:

线程执行开销小,但不利于资源的管理和保护;而进程正相反。

函数的闭包

闭包就是函数式编程的重要语法结构,提高了代码可重复实用性。使用特定或特殊的方式,将局部变量(内部函数)引入到全局环境中使用,这就是闭包操作。

Python里的拷贝

copy.copy():浅拷贝,只拷贝父对象(顶级对象),不拷贝父对象的子对象(嵌套对象)。例如:L=[1,2,3,[4,5,6]]中1,2,3,[4,5,6]就是顶级对象,而[4,5,6]中的4,5,6就是嵌套对象。当我们对L顶级对象进行更改时copy.copy()不会更改,如果对L的嵌套对象进行更改copy.copy()是会更改的,因为他们共用嵌套对象.

copy.deepcopy():深拷贝,拷贝父对象(顶级对象)和子对象(嵌套对象)。当我们对L顶级对象以及嵌套对象进行更改时,不会影响copy.deepcopy().

Python中单下划线和双下划线分别是什么?

__name__:一种约定,Python内部的名字,用来与用户自定义的名字区分开,防止冲突

_name:一种约定,用来指定变量私有

__name:解释器用_classname__name来代替这个名字用以区别和其他类相同的命名

说明os,sys模块不同,并列举常用的模块方法

os模板提供了一种方便的使用操作系统函数的方法

sys模板可供访问由解释器使用或维护的变量和与解释器交互的函数

os模块负责程序与操作系统的交互,提供了访问操作系统底层的接口。sys模块负责程序与Python解释器的交互,提供了一系列的函数和变量用户操作Python运行时的环境。

 

Python中pass语句的作用是什么?

pass语句不会执行任何操作,一般作为占位符或者创建占位程序

apache和nginx的区别

(1)nginx 相对 apache 的优点:

轻量级,同样起web 服务,比apache 占用更少的内存及资源

抗并发,nginx 处理请求是异步非阻塞的,支持更多的并发连接,而apache 则是阻塞型的,在高并发下nginx 能保持低资源低消耗高性能

配置简洁

高度模块化的设计,编写模块相对简单

社区活跃

(2)apache 相对nginx 的优点:

rewrite ,比nginx 的rewrite 强大;

模块超多,基本想到的都可以找到;

少bug ,nginx 的bug 相对较多;

超稳定。

什么是事务?

事务(Transaction)是并发控制的基本单位。所谓事务,它是一个操作序列,这些操作要么都执行,要么都不执行,它是一个不可分割的工作单位。例如,银行转帐工作:

从一个帐号扣款并使另一个帐号增款,这两个操作要么都执行,要么都不执行。所以,应该把他们看成一个事务。事务是数据库维护数据一致性的单位,在每个事务结束时,都能保持数据一致性。

事务四大特性:

原子性:事务中的全部操作在数据库中是不可分割的,要么全部完成,要么均不执行;

一致性:几个并行执行的事务,其执行结果必须与按某一顺序串行执行的结果相一致;

隔离性:事务的执行不受其他事务的干扰,事务执行的中间结果对其他事务必须是透明的;

持久性:对于任意已提交事务,系统必须保证该事务对数据库的改变不被丢失,即使数据库出现故障。

字典中的key可以支持哪些数据类型

        一个对象能不能作为字典的key,就取决于其有没有__hash__方法。所以所有python自带类型中,除了list、dict、set和内部至少带有上述三种类型之一的tuple之外,其余的对象都能当key。比如数值/字符串/完全不可变的元祖/函数(内建或自定义)/类(内建或自定义)/方法/包等等你能拿出手的,不过有的实际意义不高。还有数值型要注意,因为两个不同的相等数字可以有相同的哈希值,比如1和1.0。

http协议有哪些方法

根据HTTP标准,HTTP请求可以使用多种请求方法。

HTTP1.0定义了三种请求方法: GET, POST 和 HEAD方法。

HTTP1.1新增了五种请求方法:OPTIONS, PUT, DELETE, TRACE 和 CONNECT 方法。

序号方法描述
1GET请求指定的页面信息,并返回实体主体。
2HEAD类似于get请求,只不过返回的响应中没有具体的内容,用于获取报头
3POST向指定资源提交数据进行处理请求(例如提交表单或者上传文件)。数据被包含在请求体中。POST请求可能会导致新的资源的建立和/或已有资源的修改。
4PUT从客户端向服务器传送的数据取代指定的文档的内容。
5DELETE请求服务器删除指定的页面。
6CONNECTHTTP/1.1协议中预留给能够将连接改为管道方式的代理服务器。
7OPTIONS允许客户端查看服务器的性能。
8TRACE回显服务器收到的请求,主要用于测试或诊断。

tcp/ip协议

tcp的头部

640?wx_fmt=png

 三次握手和四次挥手的状态图如下

640?wx_fmt=png

 三次握手

  • 客户端发送一个SYN段,并指明客户端的初始序列号,即ISN(c).

  • 服务端发送自己的SYN段作为应答,同样指明自己的ISN(s)。为了确认客户端的SYN,将ISN(c)+1作为ACK数值。这样,每发送一个SYN,序列号就会加1. 如果有丢失的情况,则会重传。

  • 为了确认服务器端的SYN,客户端将ISN(s)+1作为返回的ACK数值。

四次挥手

640?wx_fmt=png

  • 客户端发送一个FIN段,并包含一个希望接收者看到的自己当前的序列号K. 同时还包含一个ACK表示确认对方最近一次发过来的数据。 

  • 服务端将K值加1作为ACK序号值,表明收到了上一个包。这时上层的应用程序会被告知另一端发起了关闭操作,通常这将引起应用程序发起自己的关闭操作。

  • 服务端发起自己的FIN段,ACK=K+1, Seq=L

  • 客户端确认。ACK=L+1

为什么建立连接是三次握手,而关闭连接却是四次挥手呢?

       这是因为服务端在LISTEN状态下,收到建立连接请求的SYN报文后,把ACK和SYN放在一个报文里发送给客户端。而关闭连接时,当收到对方的FIN报文时,仅仅表示对方不再发送数据了但是还能接收数据,己方是否现在关闭发送数据通道,需要上层应用来决定,因此,己方ACK和FIN一般都会分开发送。

MySQL如何得到排序前十的数据

       select * from tab order by id desc limit 0, 10;

  这里keyword limit startid,rownum是这样的:表示从startid + 1行开始,一共查询rownum条记录。

  如,例子就是从第一行开始,一共查询10行。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值