python面试心得一

1、python的整型数字的表示范围是多少
python的整型数字表示范围没有限制
在这里插入图片描述
2、列表和元组有什么不同

相同点

  • 都是序列
  • 都可以存储任何数据类型
  • 可以通过索引访问

不同点

  • 语法差异:列表用方括号[]创建的,而元组使用圆括号()创建的
  • 是否可变:列表是可变的,而元组是不可变的,这标志着两者之间的关键差异。由于列表是可变的,我们不能将列表用作字典中的key。但可以使用元组作为字典key。
  • 在python中,字符串类型,整型类型,以及元组类型的变量是不可修改的。
    列表、集合及词典类型的变量是可以修改的。
  • 重用与拷贝
    元组无法复制。 原因是元组是不可变的。
  • 大小差异:Python将低开销的较大的块分配给元组,因为它们是不可变的。 对于列表则分配小内存块。 与列表相比,元组的内存更小。 当你拥有大量元素时,元组比列表快。列表的长度是可变的。

3、如何实现一个栈

什么是堆栈:
堆栈是一个数据结构,其存储在一个后进/先出的方式的项目。这通常被称为LIFO。这与队列形成对比,队列以先入/先出(FIFO)方式存储项目。

list您可能经常在程序中使用的内置结构可用作堆栈。相反的.push(),你可以使用.append()新的元素添加到您的堆栈的顶部,同时.pop()除去了LIFO顺序的元素

如果你的堆栈比当前拥有它的内存块大,那么Python需要做一些内存分配。这可能导致一些.append()呼叫比其他呼叫花费更长的时间。还有一个不太严重的问题。如果您使用.insert()在末尾以外的位置向堆栈添加元素,则可能需要更长时间。但是,这通常不是你要对堆栈做的事情。

使用collections.deque创建一个Python堆栈该collections模块包含deque,这对于创建Python堆栈很有用。deque发音为“deck”,代表“双端队列”。您可以使用同样的方法deque,你上面看到的list,.append()和.pop()

from collections import deque
myStack = deque()
myStack.append('a')
 myStack.append('b')
 myStack.pop()
 'b'
 myStack.pop()
 'a'

4、单引号、双引号、三引号的区别

在python中,单引号、双引号功能一样,都可以表示字符串,也都可以起到转义的功能。
其实在转义这一点上,三个引号的功能也是一样的,

唯一的差别就是三引号 ‘’’ 和 “”"可以显示多行。

  • 三引号作用一:进行多行注释
    我们都知道Python中注释是井号 #,但是如果你需要描述多行注释的时候,就需要每行都写一个 #,或者,你可以采用连续的三个双引号
  • 作用二:定义多行字符串
    为避免使用转义换行符 ,通常会用在定义SQL语句的表达式中没有变量的时候,例如:
  # SQL建表语句    
    sql_create_table = """CREATE TABLE CUSTOMER (             
    FULL_NAME  CHAR(20) NOT NULL,            
    AGE INT,            
    SEX CHAR(1),             
    BALANCE FLOAT )"""

以上述建表语句为例,如果不使用三个双引号,则需要用换行符进行定义,如下:

# SQL建表语句    
sql_create_table = "CREATE TABLE CUSTOMER (
FULL_NAME  CHAR(20) NOT NULL,
AGE INT,
SEX CHAR(1),
BALANCE FLOAT )"

5、python中交换两个数值
python交换两个值得方法非常简单,即a,b=b,a,

方法一:
a,b=3,4
a,b=b,a
print(a,b)
方法二:
a=1
b=5
c=a
a=b
b=c
print(a,b)

6、如何在一个function里面设置一个全局的变量
解决方法是在function的开始插入一个global声明:
def f() global x

如果仅使用全局变量的值,不修改他的值,则可以直接引用全局变量。不用特别声明。

在局部作用域里面,如果修改全局变量,则需要事先使用global进行声明,表示其使用的是全局变量。函数中的变量s为局部变量,另外一个s为全局变量,对局部变量的修改,不影响全局变量。

全局变量s,在函数中在局部变量s,赋值之前使用,出错,不确定是全局变量还是局部变量
解决方法是在函数的开始插入一个global声明:

def f()
global x

>>>s = "hongkong"
>>>def fn():
    print(s)
    s = "beijing"
    print(s)
>>>fn()
Traceback (most recent call last):
  File "<pyshell#19>", line 1, in <module>
    fn()
  File "<pyshell#17>", line 2, in fn
    print(s)
UnboundLocalError: local variable 's' referenced before assignment
>>>print(s)
hongkong
>>>def fn():
    global s
    print(s)
    s = "beijing"
    print(s)
>>> fn()
hongkong
beijing
>>> print(s)
beijing

7、什么是lambda函数?它有什么好处
匿名函数
lambda 函数是一个可以接收任意多个参数(包括可选参数)并且返回单个表达式值的函数。
(注意:lambda 函数不能包含命令,它们所包含的表达式不能超过一个)

它有什么好处
1、lambda函数比较轻便,即用即仍,很适合需要完成一项功能,但是此功能只在此一处使用,连名字都很随意的情况下;
2、匿名函数,一般用来给filter,map这样的函数式编程服务;
3、作为回调函数,传递给某些应用,比如消息处理

lambda [arguments]:expression

>>> a=lambdax,y:x+y

>>> a(3,11)

8、函数参数有几种形式,可变参数传递的两个参数是什么意思
(1)、必须参数(位置参数):须以正确的顺序传入函数,调用时的数量必须和声明时一样
(2)、关键字参数:不需顺序一致,python解释器能够用参数名匹配参数值
(3)、默认参数:调用函数时,如果没有传递参数时,则使用默认参数
(4)、不定长参数:需要一个函数能够处理比当初声明时更多的参数

  • 加了*的参数会以元组的形式导入,存放所有未命名的变量参数
  • 加了**的参数会以字典的形式导入
  • 如果在函数调用时没有指定参数,它就是一个空元组,可以不同函数传递未命名的变量
  • 声明函数时,参数中*可以单独出现,*后的参数必须用关键字传入

*args 可变长度参数,实参长度不定,接受所有参数到一个元组上
**kwargs可变长度参数,实参长度不定,接受所有参数到一个字典上

9、装饰器

从字面上理解,就是装饰对象的器件。可以在不修改原有代码的情况下,为被装饰的对象增加新的功能或者附加限制条件或者帮助输出。装饰器有很多种,有函数的装饰器,也有类的装饰器。装饰器在很多语言中的名字也不尽相同,它体现的是设计模式中的装饰模式,强调的是开放封闭原则。装饰器的语法是将@装饰器名,放在被装饰对象上面。

10、交换机和路由器的区别

交换机和路由器一样,都能使只能一抄台设备上网的网线扩展断口,使若干个设备同时上网。
交换机和路由器都可用来交换网络设备,只是所交换的网络层次不同。

路由器 和交换机的区别:交换机主要是实现大家通过一根网线上网,但是大家上网是分别拨号的,各自使用自己的宽带,大家各自上网没有影响,哪怕其他人在下载,对自己上网也没有影响,并且所有使用同一条交换机的电脑都是在同一个局域网内。路由器比交换机多了一个虚拟拨号功能,通过同一台路由器上网的电脑是共用一个宽带账号,大家之间上网是相互影响的,比如一台电脑在下载,那么同一个路由器上的其他电脑会很明显的感觉到网速很慢。同一台路由器上的电脑也是在一个局域网内的。

交换机和路由器的区别是:
1、路由器能拨号,交换机不能。
2、无线道路由器能使无线设备WIFI上网,交换机不能。
3、支持WDS无线桥接的无线路由器,能作为无线桥接的副路由,交换机不能。

1)工作层次不同最初的交换机是工作在OSI/RM开放体系结构的数据链路层(第二层),而路由器一开始设计工作在OSI模型的网络层。由于交换机工作在OSI的第二层(数据链路层),所以它的工作原理比较简单,而路由器工作在OSI的第三层(网络层),可以得到更多的协议信息,路由器可以做出更加智能的转发决策。

2)数据转发所依据的对象不同交换机是利用物理地址或者说MAC地址来确定转发数据的目的地址。而路由器则是利用不同网络的ID号(即IP地址)来确定数据转发的地址。IP地址是在软件中实现的,描述的是设备所在的网络,有时这些第三层的地址也称为协议地址或者网络地址。MAC地址通常是硬件自带的,由网卡生产商来分配的,而且已经固化到了网卡中去,一般来说是不可更改的。而IP地址则通常由网络管理员或系统自动分配。

(3)传统的交换机只能分割冲突域,不能分割广播域;而路由器可以分割广播域。由交换机连接的网段仍属于同一个广播域,广播数据包会在交换机连接的所有网段上传播,在某些情况会导致通信拥护和安全漏洞。连接到路由器上的网段会被分配成不同的广播域,广播数据不会穿过路由器。
虽然第三层以上交换机具有VLAN功能,也可以分割广播域,但是各子广播域之间是不能通信交流的,它们之间的交流仍然需要路由器。

(4)路由器提供了防火墙的服务,它仅仅转发特定地址的数据包,不传送不支持路由协议的数据包传送和求知目标网络数据包的传送,从而可以防止广播风暴。

11、访问搜狐过程,IP转发过程
计算机开机,系统运行,发送dhcp请求,获得网卡的ip地址,dns,网关的IP地址。
浏览器上网,向自己的dns服务器发送域名解析请求,将搜狐的网站解析成ip地址,然后就可以向自己的网关发送http数据包知了,如果没有网关的mac地址,就要道发送arp请求,得到自己网关的mac地址。

原文地址:https://www.cnblogs.com/llb123/p/13398712.html