├── Python面试剖析.md ├── python-interview-2019-1.md ├── python-interview-2019-2.md └── python-interview-2019-3.md /Python面试剖析.md: -------------------------------------------------------------------------------- 1 | ## Python面试剖析 2 | 3 | ### 专业技能解读 4 | 5 | 在你简历的专业技能部分,很有可能会有6到10项左右的内容,这些内容中的每句话在面试时都可能产生一个或多个对应的问题。接下来举例说明如何根据简历来准备你的面试话术以及如何用专业的方式来回答问题。 6 | 7 | 1. 熟练的使用Python语言进行应用程序开发,有良好的编程习惯,对面向对象的设计原则以及常用设计模式有较为深入的理解,熟悉Python开发中常用的标准库和第三方库。 8 | 9 | > 问题1:你所指的良好的编程习惯是什么。 10 | > 11 | > 问题2:说一说你知道的面向对象的设计原则有哪些;你在项目中用到过哪些设计模式。 12 | > 13 | > 问题3:说几个你在平时工作中用得最多的标准库和三方库。 14 | 15 | 2. 熟练的使用Django和Flask框架进行Web应用后端开发,熟悉MVC(MTV)架构模式,有在项目中使用django-redis、django-celery、django-rest-framework、flask-sqlalchemy、flask-restful等第三方库的经验,了解过Web.py、Tornado、Twisted等框架。 16 | 17 | > 问题1:说一下你对MVC的理解以及Django的MTV跟传统的MVC有什么区别。 18 | > 19 | > 问题2:说一说Django框架中一个请求的生命周期是怎样的。 20 | > 21 | > 问题3:说一说Django、Flask、Tornado框架各自的优缺点。 22 | 23 | 3. 熟悉关系型数据库产品MySQL和Oracle,熟练的使用SQL,对MySQL的优化有一定程度的了解,熟悉非关系型数据库产品MongoDB和Redis,有在项目中使用Redis实现高速缓存和消息队列服务的经验。 24 | 25 | > 问题1:你知道哪些和MySQL优化相关知识? 26 | > 27 | > 问题2:Redis实现消息队列服务器的原理是什么?用到了哪一种数据类型? 28 | > 29 | > 问题3:在使用Redis实现高速缓存时,有没有遇到过缓存雪崩、缓存穿透等问题? 30 | 31 | 4. 熟练的使用urllib、requests、aiohttp、re、beautifulsoup、pyquery、pymysql、pymongo、redis、hashlib、json、pickle、zlib标准库或三方库进行网络数据采集,有使用Scrapy/PySpider开发爬虫的经验,了解Scrapy-Redis。 32 | 33 | > 问题1:说一下Scrapy框架的工作流程。 34 | > 35 | > 问题2:说一下在爬取数据时如何实现增量爬取和数据去重。 36 | > 37 | > 问题3:比较一下解析页面的几种方式。哪一种是你在项目中用得最多的方式? 38 | 39 | 5. 能够使用NumPy和SciPy完成科学运算,熟悉数据分析和可视化工具Pandas和Matplotlib。 40 | 41 | 6. 熟悉常用的机器学习算法和模型,包括:KNN、DecisionTree、LR、Naive Bayes、SVM、PCA、AdaBoost、K-Means等。 42 | 43 | > 问题1:K均值算法的优缺点是什么?如何对算法进行调优? 44 | > 45 | > 问题2:欧氏距离和余弦距离的特点和应用场景分别是什么? 46 | > 47 | > 问题3:决策树有哪些常用的启发函数? 48 | 49 | 7. 熟练的使用Linux操作系统,熟悉Linux常用服务的安装和配置,熟悉Shell编程,熟练的使用vim、awk、sed等工具,了解Linux系统运维常用命令。 50 | 51 | > 问题1:说一些你常用的Linux命令。 52 | > 53 | > 问题2:如何使用find命令根据文件大小、文件最后修改时间搜索文件。 54 | > 55 | > 问题3:vim中如何设置将制表键自动转换成空格,如何录制宏和播放宏。 56 | > 57 | > 问题4:说一说你了解的Linux运维相关的工具。 58 | > 59 | > 问题5:Shell脚本中如何定义函数?函数中如何获取传入的参数?如何调用函数并传入参数? 60 | 61 | 8. 熟悉Web前端开发的语言和框架,对HTML、CSS和JavaScript有较好的理解和掌握,熟悉Ajax和WebSocket相关技术,有在项目中使用jQuery、Axios、Fetch、Vue.js、Bootstrap、sockjs、stomp.js、ECharts等技术的经验。 62 | 63 | 9. 熟练的使用Git和Mercury实施项目的版本控制,对缺陷管理和持续集成有一定程度的了解,使用过AB、mysqlslap、sysbench等压力测试工具。 64 | 65 | > 问题1:说一下之前公司项目开发使用的过程模型以及是否使用了敏捷开发。 66 | > 67 | > 问题2:说一下你之前的项目中是如何实施缺陷管理(错误管理)的。 68 | > 69 | > 问题3:之前公司在使用git进行版本控制时,用的是哪一种分支管理策略? 70 | 71 | 10. 熟悉Nginx、uWSGI、Gunicorn、MySQL、Redis等服务器的配置和使用,熟Docker、Docker-Compose、Docker-Swarm等工具在项目部署中的应用。 72 | 73 | > 问题1:之前项目部署一共用了多少台服务器?有没有跳板机?有没有配置VPC? 74 | > 75 | > 问题2:如何通过Dockerfile来创建容器? 76 | > 77 | > 问题3:说一下WSGI是什么;比较一下uWSGI和Gunicorn。 78 | > 79 | > 问题4:微服务架构有什么优点?项目中是否使用过微服务架构? 80 | > 81 | > 问题5:如何通过Nginx部署反向代理?如何部署Keepalived服务并说明其作用? 82 | 83 | ### 项目经验解读 84 | 85 | 首先,简历项目经验部分一定要使用**S.T.A.R**法则书写,因为只有这样做才会迫使你梳理每一个业务和技术的细节,在面试的时候不会因为某个细节准备不足而导致整个面试的失败。 86 | 87 | | 项目名称 | XYZ(XXXX官方App) | 88 | | ------------ | ------------------------------------------------------------ | 89 | | **项目简介** | XYZ是以社交合租元素为亮点的租房平台,为有合租需求的用户提供了一个便捷的合租生活平台,目前产品覆盖了成都、武汉、杭州、北京等区域,为数十万用户提供了真实房源保障、室友聊天、小纸条、租客树洞、故事找房、管家服务、在线报修等特色功能。 | 90 | | **项目职责** | 1. 参与了项目的需求整理和评估。
2. 参与了项目核心业务的开发和版本迭代。
3. 参与了移动端数据接口的开发和文档编写。 | 91 | | **主要技术** | 1. 使用Django框架生态圈的djangorestframework为移动端提供REST风格的数据接口,提供了地图找房、附近房源、关键字搜房、房源详情、为你推荐、热门搜索推荐、小纸条(发布、删除、评论、热门话题)、转租(查看、发布、删除)、身份认证、报修服务、房源收藏等数据接口。
2. 使用CBV方式,通过djangorestframework中APIView的子类、ModelViewSet、ReadOnlyModelViewSet来定制数据接口,使用DefaultRouter注册数据接口的路由。
3. 通过继承ModelSerializer实现了房源、小纸条、转租信息、报修信息等模型的自定义序列化器。
4. 在Django项目配置中配置REST_FRAMEWORK的DEFAULT_PAGINATION_CLASS,实现了数据接口的默认分页方式,对于不需要进行分页的数据接口,将其pagination_class属性设置为None。
5. 通过django-redis对接Redis为项目提供缓存服务,通过Django框架的@cache_page和@method_decorator装饰器实现了房源查询结果以及为你推荐、热门搜索、热门话题等热点数据的缓存。
6. 通过数据接口类的backend_filters属性和filterset_class属性指定数据筛选和排序的支持类,使用django-filter三方库以及自定义的FilterSet实现了房源按户型、特色、价格等条件的筛选。
7. 通过数据接口类的authentication_classes属性实现了对小纸条、转租、收藏、关注等数据接口的登录认证功能,通过继承BaseAuthentication并重写authenticate方法对用户身份令牌进行验证,只允许登录后的用户访问这类接口。
8. 通过对接第三方短信平台(Luosimao)实现了短信验证码登录以及重要消息提醒的短信服务,通过接入第三方云存储服务(七牛云)实现了小纸条模块用户上传图片的存储、水印以及缩略图等功能,使用Celery+Redis实现了三方平台接入的异步化处理(避免因三方平台问题造成的请求阻塞)。
9. 通过requests三方库接入聚合数据的身份证查询接口,实现对用户的实名认证功能。
10. 通过requests三方库实现了对百度地图API的接入,解决了项目中地理信息正向和逆向解析的问题,封装了实现经纬度坐标纠偏的函数,实现了从地球坐标到火星坐标再到百度坐标的转换。
11. 使用了Redis内置的GEODIST和GEORADIUS等命令实现了地理信息运算功能,通过django-redis提供的get_redis_connection函数获取原生Redis客户端对象,实现了对Redis命令的调用。 | 92 | | **难点分析** | 1. 周边房源数据过多导致App渲染崩溃,通过……解决了这个问题。
2. 请求三方接口做地理信息运算效率低下,通过……解决了这个问题。 | 93 | 94 | **项目职责**部分可能产生的问题: 95 | 96 | 1. 每个迭代周期是多长?一个迭代周期一般完成多少个功能点?在职期间项目一共迭代了多少个版本? 97 | 2. 一共写了多少个接口以及对应的文档? 98 | 3. 你是否负责了项目的部署和线上运维?具体做了哪些工作? 99 | 100 | **技术要点**部分可能产生的问题: 101 | 102 | 1. 简单描述一下你负责的部分涉及到的核心业务模型有哪些?模型之间的关系是怎样的? 103 | 2. 有没有对数据接口访问进行限流?具体是如何实现的?有没有IP黑名单功能,具体是如何实现的? 104 | 3. 项目中用户令牌是如何生成的?如何让一个用户身份令牌失效? 105 | 4. 如何对接七牛云存储,是SDK集成还是API调用的方式?如何将文件上传到七牛云,用到了哪些方法? 106 | 5. 多条件组合的数据筛选是如何实现的?多个条件之间如果是或者的关系,程序中应该如何处理? 107 | 6. 项目中如何优化ORM的性能?有没有遇到过1+N查询?如何解决1+N查询问题? 108 | 7. 如何发现项目中的性能瓶颈或者性能问题?发现问题后又是如何解决的? 109 | 8. 项目中遇到的主要难点有哪些?你是如何解决这些技术难点的? -------------------------------------------------------------------------------- /python-interview-2019-1.md: -------------------------------------------------------------------------------- 1 | ### Python开发工程师笔试题1 2 | 3 | > **答题要求**:将该项目从[地址1]()或[地址2]()**fork**到自己的[GitHub]()或[Gitee](https://gitee.com)仓库并在线填写答案,完成后以发送合并请求(**Pull Request**)的方式提交自己的工作成果,时间120分钟。 4 | 5 | #### 答题人: 6 | 7 | #### 题目: 8 | 9 | 10 | 1. 下面的Python代码会输出什么。 11 | 12 | ```Python 13 | print([(x, y) for x, y in zip('abcd', (1, 2, 3, 4, 5))]) 14 | print({x: f'item{x ** 2}' for x in range(5) if x % 2}) 15 | print(len({x for x in 'hello world' if x not in 'abcdefg'})) 16 | ``` 17 | 18 | 答案: 19 | 20 | ``` 21 | 22 | ``` 23 | 24 | 2. 下面的Python代码会输出什么。 25 | 26 | ```Python 27 | from functools import reduce 28 | 29 | items = [11, 12, 13, 14] 30 | print(reduce(int.__mul__, map(lambda x: x // 2, filter(lambda x: x ** 2 > 150, items)))) 31 | ``` 32 | 33 | 答案: 34 | 35 | ``` 36 | 37 | ``` 38 | 39 | 3. 有一个通过网络获取数据的Python函数(可能会因为网络或其他原因出现异常),写一个装饰器让这个函数在出现异常时可以重新执行,但尝试重新执行的次数不得超过指定的最大次数。 40 | 41 | 答案: 42 | 43 | ```Python 44 | 45 | ``` 46 | 47 | 4. 下面的字典中保存了某些公司今日的股票代码及价格,用一句Python代码从中找出价格最高的股票对应的股票代码,用一句Python代码创建股票价格大于100的股票组成的新字典。 48 | 49 | > 说明:美股的股票代码是指英文字母代码,如:AAPL、GOOG。 50 | 51 | ```Python 52 | prices = { 53 | 'AAPL': 191.88, 54 | 'GOOG': 1186.96, 55 | 'IBM': 149.24, 56 | 'ORCL': 48.44, 57 | 'ACN': 166.89, 58 | 'FB': 208.09, 59 | 'SYMC': 21.29 60 | } 61 | ``` 62 | 63 | 答案: 64 | 65 | ```Python 66 | 67 | ``` 68 | 69 | 5. 写一个函数,传入的参数是一个列表,如果列表中的三个元素`a`、`b`、`c`相加之和为`0`,就将这个三个元素组成一个三元组,最后该函数返回一个包含了所有这样的三元组的列表。例如: 70 | 71 | > 参数:`[-1, 0, 1, 2, -1, -4]` 72 | > 73 | > 返回:`[(-1, 0, 1), (-1, 2, -1)]` 74 | 75 | 答案: 76 | 77 | ```Python 78 | 79 | ``` 80 | 81 | 6. 写一个函数,传入的参数是一个列表(列表中的元素可能也是一个列表),返回该列表最大的嵌套深度,例如: 82 | 83 | > 参数:`[1, 2, 3]` 84 | > 85 | > 返回:`1` 86 | > 87 | > 参数:`[[1], [2, [3]]]` 88 | > 89 | > 返回:`3` 90 | 91 | 答案: 92 | 93 | ```Python 94 | 95 | ``` 96 | 97 | 7. 写一个函数,实现将输入的长链接转换成短链接的功能(类似于新浪微博那样),每个长链接对应的短链接必须是不同且唯一的。例如:给出一个长链接`http://jackfrued.top/api/users/10001?a=b&c=d`,会返回对应的短链接`http://t.cn/E6MUth1`。 98 | 99 | 答案: 100 | 101 | ```Python 102 | 103 | ``` 104 | 105 | 8. 用5个线程,将1~100的整数累加到一个初始值为0的变量上,每次累加时将线程ID和本次累加后的结果打印出来。 106 | 107 | 答案: 108 | 109 | ```Python 110 | 111 | ``` 112 | 113 | 9. 请阐述Python是如何进行内存管理的。 114 | 115 | 答案: 116 | 117 | ``` 118 | 119 | ``` 120 | 121 | 10. 在MySQL数据库中有名为`tb_result`的表如下所示,请写出能查询出如下所示结果的SQL。 122 | 123 | `tb_result`表: 124 | 125 | | rq | shengfu | 126 | | ---------- | ------- | 127 | | 2017-04-09 | 胜 | 128 | | 2017-04-09 | 胜 | 129 | | 2017-04-09 | 负 | 130 | | 2017-04-09 | 负 | 131 | | 2017-04-10 | 胜 | 132 | | 2017-04-10 | 负 | 133 | | 2017-04-10 | 负 | 134 | 135 | 查询结果: 136 | 137 | | rq | 胜 | 负 | 138 | | ---------- | ---- | ---- | 139 | | 2017-04-09 | 2 | 2 | 140 | | 2017-04-10 | 1 | 2 | 141 | 142 | 答案: 143 | 144 | ```SQL 145 | 146 | ``` 147 | 148 | 11. 列举出你知道的HTTP请求头选项并说明其作用。 149 | 150 | 答案: 151 | 152 | ``` 153 | 154 | ``` 155 | 156 | 12. 阐述Web应用中的Cookie和Session到底有什么区别和联系。 157 | 158 | 答案: 159 | 160 | ``` 161 | 162 | ``` 163 | 164 | 13. 请阐述访问一个用Django或Flask开发的Web应用,从用户在浏览器中输入网址回车到浏览器收到Web页面的整个过程中,到底发生了哪些事情,越详细越好。 165 | 166 | 答案: 167 | 168 | ``` 169 | 170 | ``` 171 | 172 | 14. 请阐述HTTPS的工作原理,并说明该协议与HTTP之间的区别。 173 | 174 | 答案: 175 | 176 | ``` 177 | 178 | ``` 179 | 180 | 15. 简述你认为新浪微博是如何让订阅者在第一时间获得博主发布的消息。 181 | 182 | 答案: 183 | 184 | ``` 185 | 186 | ``` 187 | 188 | 16. 简述如何检查数据库是不是系统的性能瓶颈以及你在工作中是如何优化数据库操作性能的。 189 | 190 | 答案: 191 | 192 | ``` 193 | 194 | ``` 195 | 196 | 17. 在Linux系统中,假设Nginx的访问日志位于`/var/log/nginx/access.log`,该文件的每一行代表一条访问记录,每一行都由若干列(以制表键分隔)构成,其中第1列记录了访问者的IP地址,如下所示。请用一条命令找出最近的100000次访问中,访问频率最高的IP地址及访问次数。 197 | 198 | ``` 199 | 221.228.143.52 - - [23/May/2019:08:57:42 +0800] ""GET /about.html HTTP/1.1"" 206 719996 200 | 218.79.251.215 - - [23/May/2019:08:57:44 +0800] ""GET /index.html HTTP/1.1"" 206 2350253 201 | 220.178.150.3 - - [23/May/2019:08:57:45 +0800] ""GET /index.html HTTP/1.1"" 200 2350253 202 | 218.79.251.215 - - [23/May/2019:08:57:52 +0800] ""GET /index.html HTTP/1.1"" 200 2350253 203 | 219.140.190.130 - - [23/May/2019:08:57:59 +0800] ""GET /index.html HTTP/1.1"" 200 2350253 204 | 221.228.143.52 - - [23/May/2019:08:58:08 +0800] ""GET /about.html HTTP/1.1"" 206 719996 205 | 221.228.143.52 - - [23/May/2019:08:58:08 +0800] ""GET /news.html HTTP/1.1"" 206 713242 206 | 221.228.143.52 - - [23/May/2019:08:58:09 +0800] ""GET /products.html HTTP/1.1"" 206 1200250 207 | ``` 208 | 209 | 答案: 210 | 211 | ```Shell 212 | 213 | ``` 214 | 215 | 18. 请阐述跨站脚本攻击(XSS)、跨站身份伪造(CSRF)和SQL注射攻击的原理及防范措施。 216 | 217 | 答案: 218 | 219 | ``` 220 | 221 | ``` 222 | -------------------------------------------------------------------------------- /python-interview-2019-2.md: -------------------------------------------------------------------------------- 1 | ### Python开发工程师笔试题2 2 | 3 | > **答题要求**:将该项目从[地址1]()或[地址2]()**fork**到自己的[GitHub]()或[Gitee](https://gitee.com)仓库并在线填写答案,完成后以发送合并请求(**Pull Request**)的方式提交自己的工作成果,时间120分钟。 4 | 5 | #### 答题人: 6 | 7 | #### 题目: 8 | 9 | 1. 下面的Python代码会输出什么。 10 | 11 | ```Python 12 | print([(x, y) for x, y in zip('abcd', (1, 2, 3, 4, 5))]) 13 | print({x: f'item{x ** 2}' for x in range(5) if x % 2}) 14 | print(len({x for x in 'hello world' if x not in 'abcdefg'})) 15 | ``` 16 | 17 | 答案: 18 | 19 | ``` 20 | 21 | ``` 22 | 23 | 2. 下面的Python代码会输出什么。 24 | 25 | ```Python 26 | from functools import reduce 27 | 28 | items = [11, 12, 13, 14] 29 | print(reduce(int.__mul__, map(lambda x: x // 2, filter(lambda x: x ** 2 > 150, items)))) 30 | ``` 31 | 32 | 答案: 33 | 34 | ``` 35 | 36 | ``` 37 | 38 | 3. 有一个通过网络获取数据的Python函数(可能会因为网络或其他原因出现异常),写一个装饰器让这个函数在出现异常时可以重新执行,但尝试重新执行的次数不得超过指定的最大次数。 39 | 40 | 答案: 41 | 42 | ```Python 43 | 44 | ``` 45 | 46 | 4. 下面的字典中保存了某些公司今日的股票代码及价格,用一句Python代码从中找出价格最高的股票对应的股票代码,用一句Python代码创建股票价格大于100的股票组成的新字典。 47 | 48 | > 说明:美股的股票代码是指英文字母代码,如:AAPL、GOOG。 49 | 50 | ```Python 51 | prices = { 52 | 'AAPL': 191.88, 53 | 'GOOG': 1186.96, 54 | 'IBM': 149.24, 55 | 'ORCL': 48.44, 56 | 'ACN': 166.89, 57 | 'FB': 208.09, 58 | 'SYMC': 21.29 59 | } 60 | ``` 61 | 62 | 答案: 63 | 64 | ```Python 65 | 66 | ``` 67 | 68 | 5. 用生成式实现矩阵的转置操作。例如,用`[[1, 2], [3, 4], [5, 6]]`表示矩阵$\begin{bmatrix}1 & 2\\\\3 &4\\\\5 & 6\end{bmatrix}$,写一个生成式将其转换成`[[1, 3, 5], [2, 4, 6]]`即$\begin{bmatrix}1 & 3 & 5\\\\2 & 4 & 6\end{bmatrix}$。 69 | 70 | 答案: 71 | 72 | ```Python 73 | 74 | ``` 75 | 76 | 6. 写一个函数,传入的参数是一个列表(列表中的元素可能也是一个列表),返回该列表最大的嵌套深度,例如: 77 | 78 | > 参数:`[1, 2, 3]` 79 | > 80 | > 返回:`1` 81 | > 82 | > 参数:`[[1], [2, [3]]]` 83 | > 84 | > 返回:`3` 85 | 86 | 答案: 87 | 88 | ```Python 89 | 90 | ``` 91 | 92 | 7. 写一个函数,实现将输入的长链接转换成短链接的功能(类似于新浪微博那样),每个长链接对应的短链接必须是不同且唯一的。例如:给出一个长链接`http://jackfrued.top/api/users/10001?a=b&c=d`,会返回对应的短链接`http://t.cn/E6MUth1`。 93 | 94 | 答案: 95 | 96 | ```Python 97 | 98 | ``` 99 | 100 | 8. 用5个线程,将1~100的整数累加到一个初始值为0的变量上,每次累加时将线程ID和本次累加后的结果打印出来。 101 | 102 | 答案: 103 | 104 | ```Python 105 | 106 | ``` 107 | 108 | 9. 请阐述Python是如何进行内存管理的。 109 | 110 | 答案: 111 | 112 | ``` 113 | 114 | ``` 115 | 116 | 10. 在MySQL数据库中有名为`tb_result`的表如下所示,请写出能查询出如下所示结果的SQL。 117 | 118 | `tb_result`表: 119 | 120 | | rq | shengfu | 121 | | ---------- | ------- | 122 | | 2017-04-09 | 胜 | 123 | | 2017-04-09 | 胜 | 124 | | 2017-04-09 | 负 | 125 | | 2017-04-09 | 负 | 126 | | 2017-04-10 | 胜 | 127 | | 2017-04-10 | 负 | 128 | | 2017-04-10 | 负 | 129 | 130 | 查询结果: 131 | 132 | | rq | 胜 | 负 | 133 | | ---------- | ---- | ---- | 134 | | 2017-04-09 | 2 | 2 | 135 | | 2017-04-10 | 1 | 2 | 136 | 137 | 答案: 138 | 139 | ```SQL 140 | 141 | ``` 142 | 143 | 11. 列举出你知道的HTTP请求头选项并说明其作用。 144 | 145 | 答案: 146 | 147 | ``` 148 | 149 | ``` 150 | 151 | 12. 阐述JSON Web Token的工作原理和优点。 152 | 153 | 答案: 154 | 155 | ``` 156 | 157 | ``` 158 | 159 | 13. 请阐述访问一个用Django或Flask开发的Web应用,从用户在浏览器中输入网址回车到浏览器收到Web页面的整个过程中,到底发生了哪些事情,越详细越好。 160 | 161 | 答案: 162 | 163 | ``` 164 | 165 | ``` 166 | 167 | 14. 请阐述HTTPS的工作原理,并说明该协议与HTTP之间的区别。 168 | 169 | 答案: 170 | 171 | ``` 172 | 173 | ``` 174 | 175 | 15. 简述如何检查数据库是不是系统的性能瓶颈以及你在工作中是如何优化数据库操作性能的。 176 | 177 | 答案: 178 | 179 | ``` 180 | 181 | ``` 182 | 183 | 16. 在Linux系统中,假设Nginx的访问日志位于`/var/log/nginx/access.log`,该文件的每一行代表一条访问记录,每一行都由若干列(以制表键分隔)构成,其中第1列记录了访问者的IP地址。请用一条命令找出最近的100000次访问中,访问频率最高的IP地址及访问次数。 184 | 185 | 答案: 186 | 187 | ```Shell 188 | 189 | ``` -------------------------------------------------------------------------------- /python-interview-2019-3.md: -------------------------------------------------------------------------------- 1 | ### Python开发工程师笔试题3 2 | 3 | > **答题要求**:将该项目从[地址1]()或[地址2]()**fork**到自己的[GitHub]()或[Gitee](https://gitee.com)仓库并在线填写答案,完成后以发送合并请求(**Pull Request**)的方式提交自己的工作成果,时间120分钟。 4 | 5 | #### 答题人: 6 | 7 | #### 题目: 8 | 9 | 1. 下面的Python代码会输出什么。 10 | 11 | ```Python 12 | print([(x, y) for x, y in zip('abcd', (1, 2, 3, 4, 5))]) 13 | print({x: f'item{x ** 2}' for x in range(5) if x % 2}) 14 | print(len({x for x in 'hello world' if x not in 'abcdefg'})) 15 | ``` 16 | 17 | 答案: 18 | 19 | ``` 20 | 21 | ``` 22 | 23 | 2. 下面的Python代码会输出什么。 24 | 25 | ```Python 26 | from functools import reduce 27 | 28 | items = [11, 12, 13, 14] 29 | print(reduce(int.__add__, map(lambda x: x // 2, filter(lambda x: x ** 2 > 150, items)))) 30 | ``` 31 | 32 | 答案: 33 | 34 | ``` 35 | 36 | ``` 37 | 38 | 3. 对于第2题的代码,如果要实现相同的功能,用生成式应该怎么写? 39 | 40 | 答案: 41 | 42 | ```Python 43 | 44 | ``` 45 | 46 | 4. 用一行代码实现将字符串`k1:v1|k2:v2|k3:v3`处理成字典`{'k1': 'v1', 'k2': 'v2', 'k3': 'v3'}`。 47 | 48 | 答案: 49 | 50 | ```Python 51 | 52 | ``` 53 | 54 | 5. 写一个装饰函数的装饰器,实现如果函数的返回值是字符串类型,就将该字符串每个单词的首字母大写(不用考虑非英文字符串的情况)。 55 | 56 | 答案: 57 | 58 | ```Python 59 | 60 | ``` 61 | 62 | 6. 下面的字典中保存了某些公司股票的代码(字典中的键)及价格(字典中的值,以美元为单位),用一行代码从中找出价格最高的股票对应的股票代码,再用一行代码将股价高于100美元的股票创建成一个新的字典。 63 | 64 | > 说明:美股的股票代码是指英文字母代码,如:AAPL、GOOG。 65 | 66 | ```Python 67 | prices = { 68 | 'AAPL': 191.88, 69 | 'GOOG': 1186.96, 70 | 'IBM': 149.24, 71 | 'ORCL': 48.44, 72 | 'ACN': 166.89, 73 | 'FB': 208.09, 74 | 'SYMC': 21.29 75 | } 76 | ``` 77 | 78 | 答案: 79 | 80 | ```Python 81 | 82 | ``` 83 | 84 | 7. 写一个函数,返回删除列表中重复元素后的新列表,要求保留原有列表元素的顺序。 85 | 86 | 答案: 87 | 88 | ```Python 89 | 90 | ``` 91 | 92 | 8. 写一个函数,该函数的参数是一个保存字符串的列表,列表中某个字符串出现次数占列表元素总数的半数以上,找出并返回这个字符串。 93 | 94 | 答案: 95 | 96 | ```Python 97 | 98 | ``` 99 | 100 | 9. MySQL关系型数据库中有三张表分别表示用户、房源和租房记录,表结构如下所示。 101 | 102 | 用户表(`tb_user`): 103 | 104 | ``` 105 | +----------+-------------+------+-----+---------+----------------+ 106 | | Field | Type | Null | Key | Default | Comment | 107 | +----------+-------------+------+-----+---------+----------------+ 108 | | userid | int(11) | NO | PRI | NULL | 用户编号 | 109 | | username | varchar(31) | NO | | NULL | 用户姓名 | 110 | | usertel | char(11) | YES | | NULL | 用户手机 | 111 | +----------+-------------+------+-----+---------+----------------+ 112 | ``` 113 | 114 | 房源表(`tb_house`) 115 | 116 | ``` 117 | +---------+--------------+------+-----+---------+----------------+ 118 | | Field | Type | Null | Key | Default | Comment | 119 | +---------+--------------+------+-----+---------+----------------+ 120 | | houseid | int(11) | NO | PRI | NULL | 房源编号 | 121 | | title | varchar(255) | NO | | NULL | 房源标题 | 122 | | area | decimal(5,1) | NO | | NULL | 房源面积 | 123 | | addr | varchar(511) | NO | | NULL | 房源地址 | 124 | | rented | tinyint(1) | YES | | 0 | 是否租出 | 125 | +---------+--------------+------+-----+---------+----------------+ 126 | ``` 127 | 128 | 租房记录表(`tb_record`) 129 | 130 | ``` 131 | +---------+---------+------+-----+---------+----------------+ 132 | | Field | Type | Null | Key | Default | Comment | 133 | +---------+---------+------+-----+---------+----------------+ 134 | | recid | int(11) | NO | PRI | NULL | 记录编号 | 135 | | userid | int(11) | NO | MUL | NULL | 用户编号 | 136 | | houseid | int(11) | NO | MUL | NULL | 房源编号 | 137 | | indate | date | NO | | NULL | 租赁日期 | 138 | | outdate | date | YES | | NULL | 退租日期 | 139 | +---------+---------+------+-----+---------+----------------+ 140 | ``` 141 | 142 | - 查询租过编号为1055的房源的用户姓名。 143 | - 查询租过三套以上房子且登记了手机号码的用户姓名。 144 | - 查询2018年被租过两次以上目前仍然处于出租状态且面积超过50平米的房源编号和标题。 145 | 146 | 答案: 147 | 148 | ```SQL 149 | 150 | ``` 151 | 152 | 10. 请阐述访问一个用Django或Flask开发的Web应用,从用户在浏览器中输入网址回车到浏览器收到Web页面的整个过程中,到底发生了哪些事情,越详细越好。 153 | 154 | 答案: 155 | 156 | ``` 157 | 158 | ``` 159 | 160 | 11. 请阐述HTTPS的工作原理以及TCP是如何保证端到端可靠传输的。 161 | 162 | 答案: 163 | 164 | ``` 165 | 166 | ``` 167 | 168 | 12. 在Linux系统中,假设Nginx的访问日志位于`/var/log/nginx/access.log`,该文件的每一行代表一条访问记录,每一行都由若干列(以制表键分隔)构成,其中第1列记录了访问者的IP地址,如下所示。请用一行命令找出最近的100000次访问中,访问频率最高的IP地址及访问次数。 169 | 170 | ``` 171 | 221.228.143.52 - - [23/May/2019:08:57:42 +0800] ""GET /about.html HTTP/1.1"" 206 719996 172 | 218.79.251.215 - - [23/May/2019:08:57:44 +0800] ""GET /index.html HTTP/1.1"" 206 2350253 173 | 220.178.150.3 - - [23/May/2019:08:57:45 +0800] ""GET /index.html HTTP/1.1"" 200 2350253 174 | 218.79.251.215 - - [23/May/2019:08:57:52 +0800] ""GET /index.html HTTP/1.1"" 200 2350253 175 | 219.140.190.130 - - [23/May/2019:08:57:59 +0800] ""GET /index.html HTTP/1.1"" 200 2350253 176 | 221.228.143.52 - - [23/May/2019:08:58:08 +0800] ""GET /about.html HTTP/1.1"" 206 719996 177 | 221.228.143.52 - - [23/May/2019:08:58:08 +0800] ""GET /news.html HTTP/1.1"" 206 713242 178 | 221.228.143.52 - - [23/May/2019:08:58:09 +0800] ""GET /products.html HTTP/1.1"" 206 1200250 179 | ``` 180 | 181 | 答案: 182 | 183 | ```Shell 184 | 185 | ``` --------------------------------------------------------------------------------