https://gist.github.com/prim/3e7f814187c715541ef2

https://www.gitbook.com/book/l1nwatch/interview_exercise/details

豆瓣面试官 http://www.dongwm.com/archives/liao-liao-pythonmian-shi-zhe-jian-shi-er/

写代码:

int要考虑负数,0

17、@property有什么作用?如何实现成员变量的只读属性?

  @property装饰器就是负责把一个方法变成属性调用,通常用在属性的get方法和set方法,通过设置@property可以实现实例成员变量的直接访问,又保留了参数的检查。另外通过设置get方法而不定义set方法可以实现成员变量的只读属性。

16、简述__new__和__init__的区别

  创建一个新实例时调用__new__,初始化一个实例时用__init__,这是它们最本质的区别。

  new方法会返回所构造的对象,init则不会.

  new函数必须以cls作为第一个参数,而init则以self作为其第一个参数.

15、装饰器有什么作用

  装饰器本质上是一个Python函数,它可以让其他函数在不需要做任何代码变动的前提下增加额外功能,装饰器的返回值也是一个函数对象。它经常用于有切面需求的场景,比如:插入日志、性能测试、事务处理、缓存、权限校验等场景。

易重用

14、匿名函数,匿名函数有什么局限性

  匿名函数,也就是lambda函数,通常用在函数体比较简单的函数上。匿名函数顾名思义就是函数没有名字,因此不用担心函数名冲突。不过Python对匿名函数的支持有限,只有一些简单的情况下可以使用匿名函数。

13、Redis是一个使用ANSI C编写的开源、支持网络、基于内存、可选持久性的键值对存储数据库

12.1、从浏览器地址栏输入网址,到网页彻底打开,中间都发生了什么?

  三大部分:一块是客户端,一块是网络传输层,一块是服务端。

  客户端部分:URL由http协议+域名+文件路径+端口,从输入网址开始,这个网址在客户端就会有一个解析,浏览器如果有钩子做出反应。在host列      表中寻找ip。

  网络传输部分:1、询问本地域名服务器,域名查询请求会发到服务商的dns服务器,服务商的dns服务器会检查缓存,如果不存在你要访问的这个域名或者缓存状态已经过期,会访问根域名服务器,2、询问根域名服务器,会有二级根域名服务器,三级根域名服务器,根域名服务器也会先检查缓存,如果无法直接返回结果,会检查这个域名是哪个dns服务器负责解析的,然后将请求转发过去,获得这个域名所对应的ip,然后返回给本地服务商的dns,本地服务商的dns就更新缓存,然后把ip返回给客户端。

  服务器端:然后到了指定ip,服务器会在80端口有一个守护进程接受这个请求,细说的话这里还有三次握手的协议,那么下面就是webserver是怎么工作的,静态页面的处理比较简单,动态脚本还需要一个解释器系统工作,执行一段代码后将返回结果输出。这里可能又涉及有服务端缓存的,数据库,负载均衡和轮询等等。

  数据返回你的电脑时,都存在一个在子网被劫持被篡改的风险,ARP欺骗,ARP协议是什么,为什么你要访问的内容会被劫持会被篡改。

12,HTTP 通信过程

  七步

  1 建立 TCP 连接 三次握手

  2 浏览器 向服务器发送请求命令 请求行:

    例如:GET/sample/hello.jsp HTTP/1.1

  3 浏览器发送 请求头 信息 以空白行表示结束

  

  4 服务器应答 状态行:  HTTP/1.1 200 OK

  5 服务器 发送 响应头 信息  以空白行表示结束

  

  6 服务器向浏览器发送数据

  7 服务器关闭 TCP 连接

11, 用多线程的方式发起一个 http 请求

http://www.jianshu.com/p/1cca792b0b15

线程基类:

import threading
class base_thread(thread.Thread):def __init__(self, func):threading.Thread.__init__(self)self.func = func# print(type(self.func))def run(self):self.func

http请求:

# -*- coding: utf-8 -*-
#!/bin/env python
# Python2.7import requests
import json
class ConfigHttp:def __init__(self, host, port, headers):self.host = hostself.port = portself.headers = headers# 封装HTTP GET请求方法def get(self, url, params):# params = urllib.parse.urlencode(params)url = "http://" + self.host + ":" + self.port + urltry:r = requests.get(url, params=params, headers = self.headers)r.encoding = 'UTF-8'return r.textexcept  Exception:print('no json data returned')return {}# 封装HTTP POST请求方法,支持上传图片def post(self, url, data, files=None):data = eval(data)url = 'http://' + self.host + ':' + str(self.port)+urlr =requests.post(url, files=files, data=data)print(data)json_response = r.textreturn json_response

10, 打印一个给定路径下的所有文件路径

使用os.walk

os.walk(top, topdown=True, οnerrοr=None, followlinks=False)

可以得到一个三元tupple(dirpath, dirnames, filenames),

第一个为起始路径,第二个为起始路径下的文件夹,第三个是起始路径下的文件。

dirpath 是一个string,代表目录的路径,

dirnames 是一个list,包含了dirpath下所有子目录的名字。

filenames 是一个list,包含了非目录文件的名字。

这些名字不包含路径信息,如果需要得到全路径,需要使用os.path.join(dirpath, name).

import os
pp = '/Users/yly/Desktop/wh8xfyYvLPtW'
print os.listdir(pp), '\n'def Test1(rootDir):for root,dirs,files in os.walk(rootDir):for filespath in files:       # 打印文件路径print os.path.join(root,filespath)for dirpath in dirs:       # 打印目录名称print os.path.join(root,dirpath)

# 使用递归
def Test2(rootDir):   for lists in os.listdir(rootDir):       path = os.path.join(rootDir, lists)print pathif os.path.isdir(path):Test2(path)
print 'Test1, 先打印第一层,再第二层'
Test1(pp)
print 'Test2:'
Test2(pp)

['.DS_Store', '11', '123'] Test1:
/Users/yly/Desktop/wh8xfyYvLPtW/.DS_Store
/Users/yly/Desktop/wh8xfyYvLPtW/11
/Users/yly/Desktop/wh8xfyYvLPtW/12
/Users/yly/Desktop/wh8xfyYvLPtW/12/.DS_Store
/Users/yly/Desktop/wh8xfyYvLPtW/12/21
Test2:
/Users/yly/Desktop/wh8xfyYvLPtW/.DS_Store
/Users/yly/Desktop/wh8xfyYvLPtW/12
/Users/yly/Desktop/wh8xfyYvLPtW/12/.DS_Store
/Users/yly/Desktop/wh8xfyYvLPtW/12/21
/Users/yly/Desktop/wh8xfyYvLPtW/3
[Finished in 0.0s]

9,yield

  带有 yield 的函数不再是一个普通函数,而是一个生成器generator,可用于迭代,有next()方法

  yield 就是 return 返回一个值,下一次返回这个值的下一个值

  send(msg) 与 next() 的区别:send可以传递参数给 yield表达式

def g():print '1'x = yield'hello'print '2', 'x =', x y = 5 + (yield x)print '3', 'y = ', yf = g() #首先生成一个迭代器f
print f.next(), '\n' print f.send(5), '\n' print f.send(2)

1
hello #f.next()会使生成器函数执行到yield,生成一个值然后挂起。2 x = 5 #f.send(msg)会在生成器函数内部返回值,执行到第二个yield,生成值后挂起
5 Traceback (most recent call last):File "/Users/yly/Desktop/1 2.py", line 17, in <module>print f.send(2)
StopIteration  #后面没有 yield 了,抛出异常
3 y =  7

8,数据库索引,原理,怎么用

http://tech.meituan.com/mysql-index.html

例如 字典

原理:控制磁盘IO次数的数量级 => 使用 b+树

B+树特点:插入与修改有叫稳定的对数时间复杂度

阮一峰:http://www.ruanyifeng.com/blog/2014/07/database_implementation.html

How do you build a database?https://www.reddit.com/r/Database/comments/27u6dy/how_do_you_build_a_database/ciggal8/

二叉树:最多两个子树、左小于父父小于左、在n个节点中查找,一般需要log(n)次比较

B+树:一个节点可以多个值(指针)、数据满后再增加层、父节点a个值则有按a+1个子节点

数据库事务(transaction)是指批量进行一系列数据库操作,只要有一步不成功,整个操作都不成功。所以需要有一个"操作日志",以便失败时对操作进行回滚。

特点:IO次数取决于b+数的高度h、索引的最左匹配特性

慢查询优化:建立索引:最左前缀匹配、选择区分度高的列作为索引、索引不参与计算、尽量扩展索引

7,Python 多线程 多进程

一个线程就是执行一个子程序

协程: 本质:allowing multiple entry points for suspending and resuming execution at certain locations.  允许多个入口对程序进行挂起、继续执行等操作

最大的优势就是协程极高的执行效率。因为子程序切换不是线程切换,而是由程序自身控制,因此,没有线程切换的开销,和多线程比,线程数量越多,协程的性能优势就越明显。

第二大优势就是不需要多线程的锁机制,因为只有一个线程,也不存在同时写变量冲突,在协程中控制共享资源不加锁,只需要判断状态就好了,所以执行效率比多线程高很多。

线程:I\O阻塞后,进程被挂起,不用切换页表、刷新TLB,只刷新寄存器

6,class method self

5,生成器

4,协程

廖雪峰:

import time def consumer():r = ''while True:n = yield rif not n:returnprint ('[CONSUMER] Consuming %s...' & n)time.sleep(1)r = '200 OK'def produce(c):c.next()n = 0while n <5:n = n + 1print('[PRODUCER] Producing %s...' % n)r = c.send(n)print('[PRODUCER] Consumer return: %s' % r)c.close()if  __name__ == '__main__':c = consumer()produce(c)

[PRODUCER] Producing 1...
[CONSUMER] Consuming 1...
[PRODUCER] Consumer return: 200 OK
[PRODUCER] Producing 2...
[CONSUMER] Consuming 2...
[PRODUCER] Consumer return: 200 OK
[PRODUCER] Producing 3...
[CONSUMER] Consuming 3...
[PRODUCER] Consumer return: 200 OK
[PRODUCER] Producing 4...
[CONSUMER] Consuming 4...
[PRODUCER] Consumer return: 200 OK
[PRODUCER] Producing 5...
[CONSUMER] Consuming 5...
[PRODUCER] Consumer return: 200 OK

注意到consumer函数是一个generator(生成器),把一个consumer传入produce后:

  1. 首先调用c.next()启动生成器;

  2. 然后,一旦生产了东西,通过c.send(n)切换到consumer执行;

  3. consumer通过yield拿到消息,处理,又通过yield把结果传回;

  4. produce拿到consumer处理的结果,继续生产下一条消息;

  5. produce决定不生产了,通过c.close()关闭consumer,整个过程结束。

整个流程无锁,由一个线程执行,produce和consumer协作完成任务,所以称为“协程”,而非线程的抢占式多任务。

最后套用Donald Knuth的一句话总结协程的特点:

“子程序就是协程的一种特例。”

进程、线程、协程、同步、异步、回调

新建进程时,我们需要分配新的进程描述符,并且分配新的地址空间(和父地址空间的映射保持一致,但是两者同时进入COW状态)。这些过程需要一定的开销。

线程并不产生新的地址空间和资源描述符表,而是复用父进程的。

协程是一种编程组件,可以在不陷入内核的情况进行同一进程中上下文切换

协程与生成器区别:生成器是数据的生产者,协程是数据的消费者

GIL: Global Interpreter Lock 全局排它锁

"协程就是你可以暂停执行的函数"

维基:“协程 是为非抢占式多任务产生子程序的计算机程序组件,协程允许不同入口点在不同位置暂停或开始执行程序”。

3, utf8 unicode gbk

各种字符编码

UTF-8就是unicode的实现方式.

Unicode只是字符集,而UTF-X才是编码.

UTF-8 is a character encoding capable of encoding all possible characters, or code points, in Unicode. The encoding is variable-length and uses 8-bit code units.

简单来说,unicode,gbku,是字符集,而utf-8,uft-16之i就是这个值的编码方式.如"汉"的unicode值与gbk就是不一样的,假设unicode为a040,gbk为b030,而uft-8码,就是把那个值表现的形式.utf-8码完全只针对unicode来组织的,如果GBK要转utf-8必须先转unicode码,再转utf-8就OK了.

2,参数传递

*args and **kwargs

  *args代表位置参数,它会接收任意多个参数并把这些参数作为元组传递给函数。

  **kwargs代表的关键字参数,字典,允许你使用没有事先定义的参数名,另外,位置参数一定要放在关键字参数的前面。

1,RESTful架构:

  (1)每一个URI代表一种资源;

  (2)客户端和服务器之间,传递这种资源的某种表现层;

  (3)客户端通过四个HTTP动词,对服务器端资源进行操作,实现"表现层状态转化"。

enumerate(nums)

def enumerate(collection):

    'Generates an indexed series:  (0,coll[0]), (1,coll[1]) ...'      
     i = 0 
     it = iter(collection) 
     while 1: 
     yield (i, it.next()) 
     i += 1

转载于:https://www.cnblogs.com/IDRI/p/7050782.html

Python 面试总结相关推荐

  1. python面试题目

    python面试题目 原文地址:https://www.usblog.cc/blog/post/justzhl/b5cc9a05c7d2 问题一:以下的代码的输出将是什么? 说出你的答案并解释. ? ...

  2. python程序员职业考试_最新10大Python面试常问的问题,60%的人都不会

    Python是个非常受欢迎的编程语言,随着近些年机器学习.云计算等技术的发展,Python的职位需求越来越高.下面我收集了10个Python面试官经常问的问题,供大家参考学习. 类继承 有如下的一段代 ...

  3. Python培训常识:Python面试中常被问到的几种设计模式要知道

    学习Python技术大家都是为了日后能够找到适合自己的工作岗位,那么除了要学习好Python技术外,对于面试环节的问题也要有所了解,本期小编为大家介绍的Python培训教程就算关于Python面试中常 ...

  4. Python面试之 is 和 == 的区别

    Python面试之 is 和 == 的区别 强哥 ​ 亿贝软件工程(上海)有限公司 全栈工程师 ​关注他 契卡 . 在读笛卡尔的孟德 等 1,210 人赞同了该文章 面试实习生的时候,当问到 is 和 ...

  5. 2018年前35名Python面试问题和答案

    要使用Python作为更新的工作,您必须熟悉基础知识.在这里,我整理了一些基本的Python面试问题和答案以及一些高级Python问题和答案,以帮助您完成面试.有Python开发人员面试问题,Pyth ...

  6. python人工智能方向面试准备_高薪直通车丨人工智能+Python面试经验分享(西安**思数据)...

    原标题:高薪直通车丨人工智能+Python面试经验分享(西安**思数据) 高薪直通车 python面试经验分享(西安**思数据 ) 高薪直通车是西安校区独家打造,用于分享西安市场企业面试需求,直击面试 ...

  7. python os 检查同名_2020Python 爬虫面试题,高薪就业Python面试必看

    先来一份完整的Python爬虫工程师关于Python面试的考点: 搞定这套 Python 爬虫面试题,Python面试 so easy 一. Python 基本功 1.简述Python 的特点和优点 ...

  8. 2!=5 or 0在python中是否正确-不吹不擂,你想要的Python面试都在这里了【315+道题】...

    原标题:不吹不擂,你想要的Python面试都在这里了[315+道题] 有缘人如果看到这些题,不妨留言一下答案,来证明下你到底有多水,哈哈哈哈哈哈哈哈哈哈哈 第一部分 Python基础篇(80题) 1. ...

  9. python面试-2018年最常见的Python面试题答案(上篇)

    Python新手在谋求一份Python编程工作前,必须熟知Python的基础知识.编程网站DataFlair的技术团队分享了一份2018年最常见Python面试题合集,既有基本的Python面试题,也 ...

  10. python面试-Python面试常问的10个问题

    很多人想找Python工作,面试往往在基础知识点采坑了 Python是个非常受欢迎的编程语言,随着近些年机器学习.云计算等技术的发展,Python的职位需求越来越高.下面我收集了10个Python面试 ...

最新文章

  1. angular2 表单
  2. GD项目回顾之JWT
  3. 【星球知识卡片】深度学习换脸算法都有哪些?如何长期进行学习
  4. c语言使用求余方式的转化为二进制程序,C语言第三讲 程序结构 (下).ppt
  5. 抽屉式(菜单)导航实例模板,设计师喜欢哪款?
  6. ichartjs android,在android上动态实现ichartjs的3D柱形图
  7. ejabberd源码学习——方法注册模式
  8. 5-Scala对象(Class)和类(Object)
  9. div css将文字居中显示图片,css文字居中、图片居中、div居中解决方案
  10. 高可用MySQL:构建健壮的数据中心
  11. 伺服舵机基础知识汇总
  12. 移动支付服务商加盟/微信支付宝扫码支付代理加盟
  13. 三维开发及三维地形和地理信息系统的集成探索
  14. 记第一次挖洞交洞历程
  15. 巨头的工业互联网:在“黑灯工厂”探寻制造业之光
  16. idea 自动同步文件本地内容设置
  17. Guessing Camels
  18. turtle画樱花树林
  19. 3.蚁群算法求解格栅地图路径规划matlab代码
  20. 卸载和安装番茄小助手

热门文章

  1. Android 工程报错解决 Unable to resolve target 'android-17'
  2. esp分区引导修复失败_Windows10修复UEFI引导的具体方法
  3. 分享Kali Linux 2017.1镜像
  4. markdown 图片居中_Markdown常用语法汇总
  5. mongodb 导出指定数据库文件大小_大数据技术之将mongodb 数据指定字段导出,然后指定字段导入mysql 实例 及相关问题解决...
  6. 华为鸿蒙是多少纳米的,厉害!华为又一颗自研7纳米手机芯片曝光,鸿蒙系统或8月初发布...
  7. 运动是如何改造我们的大脑?
  8. 非线程安全类ArrayList出现异常:java.util.ConcurrentModificationException
  9. 学习java的一些笔记(8)
  10. 一篇文章梳理完 AR 背后的八大关键性技术