Python面试常用二十题总结

1.请至少用一种方法下面字符串的反转?

1).A[::-1]

2).交换前后字母的位置

t = list(A)

l = len(t)

for i, j inzip(range(l - 1, 0, -1), range(l // 2)):

        t[i], t[j] = t[j], t[i]

return"".join(t)

3). 递归的方式, 每次输出一个字符

defstring_reverse3(string): 

    if len(string) <= 1: 

        return string 

    return string_reverse3(string[1:]) +string[0]

2.请手写一个lambda函数

Sum = Lambda a,b:a+b

3.请手写一个函数,用来取出1—100(均包含)中9的倍数或者有数字9的所有整数

For I inxrange(1,101):

       If i%9 == 0 or “9” in str(I):

             Print i

4.  Python里面如何实现tuple和list的转换

直接用tuplelist函数

5.  Python里面match()和search()的区别?

re模块中match(pattern,string[,flags]),检查string的开头是否与pattern匹配。

re模块中research(pattern,string[,flags]),string搜索pattern的第一个匹配值。

6.请用至少一种方法删除下面list里面的重复元素

1).A=list(set(A))

2).A =[1,2,3,4,5,1,5]

List = []

for i in A:

    if I not in List:

           List.append(i)

print List

 

7.请简述python中单例模式的特点,并手写一个单例模式?

单例模式的要点有三个;一是某个类只能有一个实例;二是它必须自行创建这个实例;三是它必须自行向整个系统提供这个实例。

classSingleton(object):

__instance=None

def__init__(self):

       pass

def__new__(cls,*args,**kwd):

       if Singleton.__instance is None:

             Singleton.__instance=object.__new__(cls,*args,**kwd)

       return Singleton.__instance

8.请简述值传递和引用传递的区别?

值传递仅仅传递的是值

引用传递,传递的是内存地址,修改后会改变内存地址对应储存的值。

9.请手写一个匹配ip的正则表达式?

^(?:(?:1[0-9][0-9]\.)|(?:2[0-4][0-9]\.)|(?:25[0-5]\.)|(?:[1-9][0-9]\.)|(?:[0-9]\.)){3}(?:(?:1[0-9][0-9])|(?:2[0-4][0-9])|(?:25[0-5])|(?:[1-9][0-9])|(?:[0-9]))$

^([01]?\d\d?|2[0-4]\d|25[0-5])\.([01]?\d\d?|2[0-4]\d|25[0-5])\.([01]?\d\d?|2[0-4]\d|25[0-5])\.([01]?\d\d?|2[0-4]\d|25[0-5])$'

10.mysql数据库的优化?

1. 优化索引、SQL 语句、分析慢查询;

2. 设计表的时候严格根据数据库的设计范式来设计数据库;

3. 使用缓存,把经常访问到的数据而且不需要经常变化的数据放在缓存中,能节约磁盘IO

4. 优化硬件;采用SSD,使用磁盘队列技术(RAID0,RAID1,RDID5)等;

5. 采用MySQL 内部自带的表分区技术,把数据分层不同的文件,能够提高磁盘的读取效率;

6. 垂直分表;把一些不经常读的数据放在一张表里,节约磁盘I/O

7. 主从分离读写;采用主从复制把数据库的读操作和写入操作分离开来;

8. 分库分表分机器(数据量特别大),主要的的原理就是数据路由;

9. 选择合适的表引擎,参数上的优化;

10. 进行架构级别的缓存,静态化和分布式;

11. 不采用全文索引;

12. 采用更快的存储方式,例如NoSQL存储经常访问的数

 

11.进程间通信(IPC)有那些方式?

1.    管道(Pipe):管道可用于具有亲缘关系进程间的通信,允许一个进程和另一个与它有共同祖先的进程之间进行通信。

2.    命名管道(named pipe):命名管道克服了管道没有名字的限制,因此,除具有管道所具有的功能外,它还允许无亲缘关系进程间的通信。命名管道在文件系统中有对应的文件名。命名管道通过命令mkfifo或系统调用mkfifo来创建。

3.    信号(Signal):信号是比较复杂的通信方式,用于通知接受进程有某种事件发生,除了用于进程间通信外,进程还可以发送信号给进程本身;linux除了支持Unix早期信号语义函数sigal外,还支持语义符合Posix.1标准的信号函数sigaction(实际上,该函数是基于BSD的,BSD为了实现可靠信号机制,又能够统一对外接口,用sigaction函数重新实现了signal函数)。

4.    消息(Message)队列:消息队列是消息的链接表,包括Posix消息队列system V消息队列。有足够权限的进程可以向队列中添加消息,被赋予读权限的进程则可以读走队列中的消息。消息队列克服了信号承载信息量少,管道只能承载无格式字节流以及缓冲区大小受限等缺

5.    共享内存:使得多个进程可以访问同一块内存空间,是最快的可用IPC形式。是针对其他通信机制运行效率较低而设计的。往往与其它通信机制,如信号量结合使用,来达到进程间的同步及互斥。

6.    内存映射(mapped memory):内存映射允许任何多个进程间通信,每一个使用该机制的进程通过把一个共享的文件映射到自己的进程地址空间来实现它。

7.    信号量(semaphore):主要作为进程间以及同一进程不同线程之间的同步手段。

8.    套接口(Socket):更为一般的进程间通信机制,可用于不同机器之间的进程间通信。起初是由Unix系统的BSD分支开发出来的,但现在一般可以移植到其它类Unix系统上:LinuxSystem V的变种都支持套接字

 

12.简述这两个参数是什么意思:*args,**kwargs?我们为什么要使用它们?

*args 当我们不知道要有多少个参数传给函数,或者我们想把一个列表或者tuple存起来以后传给函数。

**kwargs当我们不知道有多少个关键字参数要传给函数,或者我们想把字典存起来以后传给函数

13.谈谈你对python多线程的理解?

Python多线程下,每个线程的执行方式:

1、获取GIL

2、执行代码直到sleep或者是python虚拟机将其挂起。

3、释放GIL

1CPU密集型代码(各种循环处理、计数等等),在这种情况下,由于计算工作多,ticks计数很快就会达到阈值,然后触发GIL的释放与再竞争(多个线程来回切换当然是需要消耗资源的),所以python下的多线程对CPU密集型代码并不友好。       

2IO密集型代码(文件处理、网络爬虫等),多线程能够有效提升效率(单线程下有IO操作会进行IO等待,造成不必要的时间浪费,而开启多线程能在线程A等待时,自动切换到线程B,可以不浪费CPU的资源,从而能提升程序执行效率)。所以python的多线程对IO密集型代码比较友好。

而在python3.x中,GIL不使用ticks计数,改为使用计时器(执行时间达到阈值后,当前线程释放GIL),这样对CPU密集型程序更加友好,但依然没有解决GIL导致的同一时间只能执行一个线程的问题,所以效率依然不尽如人意。                                 

多核多线程比单核多线程更差,原因是单核下多线程,每次释放GIL,唤醒的那个线程都能获取到GIL锁,所以能够无缝执行,但多核下,CPU0释放GIL后,其他CPU上的线程都会进行竞争,但GIL可能会马上又被CPU0拿到,导致其他几个CPU上被唤醒后的线程会醒着等待到切换时间后又进入待调度状态,这样会造成线程颠簸(thrashing),导致效率更低。

14.redis中的事务和mysql中的事务有什么区别?

1、Redis中的事务(transaction)是一组命令的集合。事务同命令一样都是Redis最小的执行单位,一个事务中的命令要么都执行,要么都不执行。Redis事务的实现需要用到 MULTI  EXEC 两个命令,事务开始的时候先向Redis服务器发送 MULTI 命令,然后依次发送需要在本次事务中处理的命令,最后再发送 EXEC 命令表示事务命令结束。

2、mysql的事务特性,要求这组操作,要不全都成功,要不全都失败,这样就避免了某个操作成功某个操作失败。利于数据的安全

15.请简述什么是三次握手和四次挥手?为什么要这样?

建立连接的过程是利用客户服务器模式,假设主机A为客户端,主机B为服务器端。

1TCP的三次握手过程:主机AB发送连接请求;主机B对收到的主机A的报文段进行确认;主机A再次对主机B的确认进行确认。

2)采用三次握手是为了防止失效的连接请求报文段突然又传送到主机B,因而产生错误。失效的连接请求报文段是指:主机A发出的连接请求没有收到主机B的确认,于是经过一段时间后,主机A又重新向主机B发送连接请求,且建立成功,顺序完成数据传输。考虑这样一种特殊情况,主机A第一次发送的连接请求并没有丢失,而是因为网络节点导致延迟达到主机B,主机B以为是主机A又发起的新连接,于是主机B同意连接,并向主机A发回确认,但是此时主机A根本不会理会,主机B就一直在等待主机A发送数据,导致主机B的资源浪费。

3)采用两次握手不行,原因就是上面说的失效的连接请求的特殊情况,因此采用三次握手刚刚好,两次可能出现失效,四次甚至更多次则没必要,反而复杂了。

四次挥手:

先由客户端向服务器端发送一个FIN,请求关闭数据传输。

当服务器接收到客户端的FIN时,向客户端发送一个ACK,其中ack的值等于FIN+SEQ

然后服务器向客户端发送一个FIN,告诉客户端应用程序关闭。

当客户端收到服务器端的FIN是,回复一个ACK给服务器端。其中ack的值等于FIN+SEQ

为什么要4次挥手?

确保数据能够完成传输

16.python是如何进行内存管理的?

一、垃圾回收:python不像C++Java等语言一样,他们可以不用事先声明变量类型而直接对变量进行赋值。对Python语言来讲,对象的类型和内存都是在运行时确定的。这也是为什么我们称Python语言为动态类型的原因(这里我们把动态类型可以简单的归结为对变量内存地址的分配是在运行时自动判断变量类型并对变量进行赋值)。

二、引用计数:Python采用了类似Windows内核对象一样的方式来对内存进行管理。每一个对象,都维护这一个对指向该对对象的引用的计数。当变量被绑定在一个对象上的时候,该变量的引用计数就是1(还有另外一些情况也会导致变量引用计数的增加),系统会自动维护这些标签,并定时扫描,当某标签的引用计数变为0的时候,该对就会被回收。

三、内存池机制Python的内存机制以金字塔行,-1-2层主要有操作系统进行操作,

  第0层是C中的mallocfree等内存分配和释放函数进行操作;

  第1层和第2层是内存池,有Python的接口函数PyMem_Malloc函数实现,当对象小于256K时有该层直接分配内存;

  第3层是最上层,也就是我们对Python对象的直接操作;

C 中如果频繁的调用 malloc free ,是会产生性能问题的.再加上频繁的分配与释放小块的内存会产生内存碎片. Python 在这里主要干的工作有:

  如果请求分配的内存在1~256字节之间就使用自己的内存管理系统,否则直接使用 malloc.

  这里还是会调用 malloc 分配内存,但每次会分配一块大小为256k的大块内存.

  经由内存池登记的内存到最后还是会回收到内存池,并不会调用 C free 释放掉.以便下次使用.对于简单的Python对象,例如数值、字符串,元组(tuple不允许被更改)采用的是复制的方式(深拷贝?),也就是说当将另一个变量B赋值给变量A时,虽然AB的内存空间仍然相同,但当A的值发生变化时,会重新给A分配空间,AB的地址变得不再相同

17.谈谈你对线程安全的理解?

线程安全是在多线程的环境下,能够保证多个线程同时执行时程序依旧运行正确, 而且要保证对于共享的数据可以由多个线程存取,但是同一时刻只能有一个线程进行存取。多线程环境下解决资源竞争问题的办法是加锁来保证存取操作的唯一性。

18.事务的特性?

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

2、一致性(Consistency):几个并行执行的事务,其执行结果必须与按某一顺序串行执行的结果相一致。

3、隔离性(Isolation):事务的执行不受其他事务的干扰,事务执行的中间结果对其他事务必须是透明的。

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

18.什么是阻塞,什么是非阻塞?

阻塞调用是指调用结果返回之前,当前线程会被挂起。函数只有在得到结果之后才会返回。有人也许会把阻塞调用和同步调用等同起来,实际上他是不同的。对于同步调用来说,很多时候当前线程还是激活的,只是从逻辑上当前函数没有返回而已。例如,我们在CSocket中调用Receive函数,如果缓冲区中没有数据,这个函数就会一直等待,直到有数据才返回。而此时,当前线程还会继续处理各种各样的消息。如果主窗口和调用函数在同一个线程中,除非你在特殊的界面操作函数中调用,其实主界面还是应该可以刷新。socket接收数据的另外一个函数recv则是一个阻塞调用的例子。当socket工作在阻塞模式的时候,如果没有数据的情况下调用该函数,则当前线程就会被挂起,直到有数据为止。

非阻塞和阻塞的概念相对应,指在不能立刻得到结果之前,该函数不会阻塞当前线程,而会立刻返回。

对象的阻塞模式和阻塞函数调用。对象是否处于阻塞模式和函数是不是阻塞调用有很强的相关性,但是并不是一一对应的。阻塞对象上可以有非阻塞的调用方式,我们可以通过一定的API去轮询状态,在适当的时候调用阻塞函数,就可以避免阻塞。而对于非阻塞对象,调用特殊的函数也可以进入阻塞调用。函数select就是这样的一个例子。

19.父子进程间有哪些异同,是否共享数据?(共享哪些数据?)

子进程会复制父进程所有可写的资源,包括:

堆、栈、数据段、未初始化数据段、打开的文件描述符、信号安装过的 handler、共享库、ipc(共享内存、消息队列、信号量)。注意未决信号不会继承过来, 新进程会重置它的未决信号链;

子进程和父进程共享:

所有只读的资源都不用复制, 父子进程共享, 包括正文段和字符串常量

子进程不会从父进程继承:

进程 id、各种锁(内存锁、文件锁)、定时器、未决信号

20.Mysql的常用引擎及选择?

常用:InnoDB MyISAM

一、 InnoDB 支持事务,MyISAM 不支持,这一点是非常之重要。事务是一种高级的处理方式,如在一些列增删改中只要哪个出错还可以回滚还原,而 MyISAM就不可以了;

二、MyISAM 适合查询以及插入为主的应用,InnoDB适合频繁修改以及涉及到安全性较高的应用;

三、InnoDB 支持外键,MyISAM 不支持;

四、MyISAM 是默认引擎,InnoDB需要指定;

五、InnoDB 不支持 FULLTEXT 类型的索引;

六、InnoDB 中不保存表的行数,如select count(*) from table 时,InnoDB;需要扫描一遍整个表来计算有多少行,但是 MyISAM 只要简单的读出保存好的行数即可。注意的是,当 count(*)语句包含 where 条件时 MyISAM 也需要扫描整个表;

七、对于自增长的字段,InnoDB中必须包含只有该字段的索引,但是在MyISAM表中可以和其他字段一起建立联合索引;

八、清空整个表时,InnoDB是一行一行的删除,效率非常慢。MyISAM则会重

建表;

九、InnoDB 支持行锁(某些情况下还是锁整表,如update table set a=1 where user like '%lee%'

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/473735.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

SparkStreaming基础

目录 SparkStreaming基础 1 流式计算 1.1 常见的离线和流式计算框架 2 SparkStreaming简介 2.1 核心概念DStream 2.2 工作原理 2.3 Storm&#xff0c;SparkStreaming和Flink的对比 2.4 如何选择流式处理框架 3 SparkStreaming实时案例 3.1 StreamingContext和Receiver…

【Kaggle微课程】Natural Language Processing - 1. Intro to NLP

文章目录1. 使用 spacy 库进行 NLP2. Tokenizing3. 文本处理4. 模式匹配练习&#xff1a;食谱满意度调查1 在评论中找到菜单项2 对所有的评论匹配3 最不受欢迎的菜4 菜谱出现的次数learn from https://www.kaggle.com/learn/natural-language-processing 1. 使用 spacy 库进行…

谈一谈HTTP中Get与Post的区别与主要应用场景

Http定义了与服务器交互的不同方法&#xff0c;最基本的方法有4种&#xff0c;分别是GET&#xff0c;POST&#xff0c;PUT&#xff0c;DELETE。URL全称是资源描述符&#xff0c;我们可以这样认为&#xff1a;一个URL地址&#xff0c;它用于描述一个网络上的资源&#xff0c;而H…

Python基础(一)--初识Python

目录 Python基础&#xff08;一&#xff09;--初识Python 1 Python基本概念 1.1 什么是Python 1.2 Python的语言特征 1.3 Python的应用领域 2 Python开发环境 2.1 Windows操作系统 2.2 Linux / Mac操作系统 2.3 Python虚拟环境 2.4 Python开发工具 3 环境变量 4 变量…

【Kaggle微课程】Natural Language Processing - 2.Text Classification

文章目录1. bag of words2. 建立词袋模型3. 训练文本分类模型4. 预测练习&#xff1a;1. 评估方法2. 数据预处理、建模3. 训练4. 预测5. 评估模型6. 改进learn from https://www.kaggle.com/learn/natural-language-processing NLP中的一个常见任务是文本分类。这是传统机器学…

淡定啊,学习啊

最近一直在背单词&#xff0c;已经忽略本质工作&#xff0c;写代码。这个要改啊&#xff0c;本职的代码还是要写的&#xff0c;不然怎么吃饭啊。发现这个还是昨天晚上看了会js&#xff0c;发现一个很好的特性&#xff0c;一阵狂喜&#xff0c;后来仔细一想是&#xff0c;最近荒…

Django框架—富文本编辑器

借助富文本编辑器&#xff0c;网站的编辑人员能够像使用offfice一样编写出漂亮的、所见即所得的页面此处以tinymce为例&#xff0c;其它富文本编辑器的使用也是类似的在虚拟环境中安装包 pip install django-tinymce2.6.0安装完成后&#xff0c;可以使用在Admin管理中&#xf…

Python基础(二)--数据类型,运算符与流程控制

目录 Python基础&#xff08;二&#xff09;--数据类型&#xff0c;运算符与流程控制 1 数据类型 1.1 Python中的数据类型 1.2 整数类型&#xff08;int&#xff09; 1.3 布尔类型 1.4 浮点类型 1.5 复数类型 1.6 类型转换 2 运算符 2.1 算术运算符 2.2 布尔运算符 …

求二维数组的转置矩阵

1 /*2 求二维数组的转置矩阵3 输入4 两个整数n和m 5 n行m列的二维数组 6 输出7 输出该二维数组的转置矩阵 8 数据范围9 0<n<20; 0<m<20; 10 */ 11 #include<stdio.h> 12 int main() 13 { 14 int a[20][20]; 15 int b[20][20]; 16 …

【Kaggle微课程】Natural Language Processing - 3. Word Vectors

文章目录1. 词嵌入 Word Embeddings2. 分类模型3. 文档相似度练习&#xff1a;1. 使用文档向量训练模型2. 文本相似度learn from https://www.kaggle.com/learn/natural-language-processing 1. 词嵌入 Word Embeddings 参考博文&#xff1a;05.序列模型 W2.自然语言处理与词…

Django搜索工具——全文检索

全文检索不同于特定字段的模糊查询&#xff0c;使用全文检索的效率更高&#xff0c;并且能够对于中文进行分词处理haystack&#xff1a;全文检索的框架&#xff0c;支持whoosh、solr、Xapian、Elasticsearc四种全文检索引擎&#xff0c;点击查看官方网站whoosh&#xff1a;纯Py…

LeetCode 787. K 站中转内最便宜的航班(Dijkstra最短路径 + 优先队列)

文章目录1. 题目2. 解题1. 题目 有 n 个城市通过 m 个航班连接。每个航班都从城市 u 开始&#xff0c;以价格 w 抵达 v。 现在给定所有的城市和航班&#xff0c;以及出发城市 src 和目的地 dst&#xff0c;你的任务是找到从 src 到 dst 最多经过 k 站中转的最便宜的价格。 如…

Windows Phone 资源管理与换肤思考

Windows Phone 资源管理与换肤思考 原文 Windows Phone 资源管理与换肤思考 新入手一台Windows 8的笔记本&#xff0c;安装了VS2013后&#xff0c;终于又可以开发WP了。公司暂时不愿意开发WP&#xff0c;那么咱就自行研究吧&#xff01; 在没有WP开发环境的时候&#xff0c;曾经…

Django完成异步工具——celery

情景&#xff1a;用户发起request&#xff0c;并等待response返回。在本些views中&#xff0c;可能需要执行一段耗时的程序&#xff0c;那么用户就会等待很长时间&#xff0c;造成不好的用户体验&#xff0c;比如发送邮件、手机验证码等使用celery后&#xff0c;情况就不一样了…

Python基础(三)--序列

Python基础&#xff08;三&#xff09;--序列 1 序列相关的概念 1.1 什么是序列 序列是一种可迭代对象&#xff0c;可以存储多个数据&#xff0c;并提供数据的访问。 序列中的数据称为元素&#xff0c;Python内置的序列类型有&#xff1a;列表&#xff08;list&#xff09;…

DOM2和DOM3

只写一些DOM2和DOM3中我目前能用到的点&#xff0c;更多细节会以后补上 一.DOM变化 1.DOM2级为不同的DOM类型引入了一些与XML命名空间有关的方法&#xff08;对HTML文档没有实际意义&#xff09;。 2.定义了以编程方式创建Document实例的方法 3.支持创建DocumentType对象 二.样…

项目上线最后工作——布署环境

当项目开发完成后&#xff0c;需要将项目代码放到服务器上&#xff0c;这个服务器拥有固定的IP&#xff0c;再通过域名绑定&#xff0c;就可以供其它人浏览&#xff0c;对于python web开发&#xff0c;可以使用wsgi、apache服务器&#xff0c;此处以wsgi为例进行布署服务器首先…

spacy 报错 gold.pyx in spacy.gold.GoldParse.__init__() 解决方案

在使用 spacy 进行 NLP 时出现以下错误&#xff1a; --------------------------------------------------------------------------- TypeError Traceback (most recent call last) <ipython-input-164-8ef00790b0bb> in <module&g…

Python基础(四)--字典与集合

Python基础&#xff08;四&#xff09;--字典与集合 1 字典 1.1 什么是字典 字典提供的是一种映射存储的方式。字典分为两个部分&#xff0c;一个是键&#xff08;key&#xff09;&#xff0c;一个是key所关联的值&#xff08;value&#xff09;。&#xff0c;一个键关联&am…

[Kaggle] Spam/Ham Email Classification 垃圾邮件分类(spacy)

文章目录1. 导入包2. 数据预览2. 特征组合3. 建模4. 训练5. 预测练习地址&#xff1a;https://www.kaggle.com/c/ds100fa19 相关博文&#xff1a; [Kaggle] Spam/Ham Email Classification 垃圾邮件分类&#xff08;RNN/GRU/LSTM&#xff09; [Kaggle] Spam/Ham Email Classifi…