taizilongxu / interview_python Goto Github PK
View Code? Open in Web Editor NEW关于Python的面试题
关于Python的面试题
__new__() 是一个类方法,不是静态方法
给出的第一个链接,只说了结构上,两者的功能可以相互通用,所以觉得大部分解释都是错的。但没讲实际上区别在哪里。
事实上,该文章下方评论124楼讲得更好。
个人理解。理论上,get、post、put的功能确实可以互通,但是约定上用法不同,导致服务器上的方法一般写得也会不同(自己硬要写个能互通的方法也可以,但不符合一般的习惯),使得实际使用时,就是不一样的。完全就是大部分地方解释的,GET获得数据,POST提交、创建数据、PUT修改数据。
stackoverflow的参考链接没有问题,只是PO主给出的解释容易给人产生误导。
a = []
def test(b):
b = b + [1]
test(a)
print a # a = []
这里a
的值并没有改变,原因是因为Python中的变量只是作为一个“标签”,传递参数时,执行b=a
(并没用进行引用复制),即让函数内的“标签”b
也指向[]
,而后在函数中b
又指向[1]
,函数结束后b
也随即消失,函数体与a
并没有关系。
而在以下函数中:
a = []
def test(b):
b.append(1)
test(a)
print a # a = [1]
参数传递后,直接对b
所指向的对象本身进行操作,而因为a
也指向这个对象,所以导致a
的值也发生改变。
因为str
等类型并不可变,所以也就不支持类似append
这种直接改变对象本身的方法,自然也就无法在函数中改变其值。
所以,并不是因为对象可变不可变导致的差异,而是Python的函数参数传递的并不是传统C++层面上的引用。在CPython中变量的实现是PyObject*
,所以Python的函数参数传递可以理解为传指针。
具体请参考这里(英文版),(中文版)
可以看看下面的例子:
class Person:
name=[]p1=Person()
p2=Person()
p1.name.append(1)
print p1.name # [1]
print p2.name # [1]
print Person.name # [1]
参考:http://stackoverflow.com/questions/6470428/catch-multiple-exceptions-in-one-line-except-block
参考链接和这个问题无关。
class Singleton(object):
__instance = None
def __new__(cls, *args, **kwargs):
if not cls.__instance:
cls.__instance = object.__new__(cls)
return cls.__instance
自己写的单例模式
从链接进入由其他账号登录之后显示跳转到新版本的Gitbook网址上,转过去之后新手表示搜不到你说的中文版内容
官方解释:
Read until EOF using readline() and return a **_list_** containing the lines thus read.
使用 xreadlines 返回的才是迭代器。
另外,希望能说明一点,xreadlines 已经在 2.3 版本以后废弃,改用 for line in file 替代。
不知道问题1的回答可不可以延伸到变量的作用域上?
if root.left is None:
应该是if root.left is not None:
字符串格式化还可以补充一个新特性f"{} {}"这是python3.6以上存在的
线程全局锁(Global Interpreter Lock),即Python为了保证线程安全而采取的独立线程运行的限制,说白了就是一个核只能在同一时间运行一个线程.
主要是这一句:说白了就是一个核只能在同一时间运行一个线程.
多核操作系统下即使是并行计算一个核同时最多也只能有一个线程在运行计算。这里要表达的应该是Python的GIL锁导致Python无法进行并行计算只能并发,一个进程在进行多线程运算时,最多同时只能使用一个核来计算。如果需要使用多核计算需要用多进程而不是多线程。
个人理解,不知道是否有误,仅供参考哈!
这个在2和3里都是list
In [2]: lll = open('cnmb_worker.conf').readlines()
In [3]: type(lll)
Out[3]: list
In [4]: len(lll)
Out[4]: 31
In [5]: len(lll)
Out[5]: 31
个人理解协程是对线程/进程同步的编程语法的一个统称,比如python中使用yield,coroutine等关键字进行线程/进程间同步,就避免了显式地使用wait,notify等关键字来进行同步。虽然线程,进程,协程都带程字,但是协程和前两者应该不属于一类
Sent with GitHawk
您好,最近正在学习python,在你的资料中我学到了很多,很感谢你的分享;不过我好像看到一处错误,正确答案应该是:
class A():
def foo1(self):
print "A"
class B(A):
def foo2(self):
pass
class C(A):
def foo1(self):
print "C"
class D(B, C):
pass
d = D()
d.foo1()
6 虚拟内存技术
虚拟存储器是值具有,这里面的只
solved. thx!
字符串格式化确实有两种形式,某些库推荐使用%,譬如logging库,当你用format形式的时候,pylint检查会给warning。不过个人还是蛮喜欢format的。
遍历完长链表直接就返回了肯定不对啊
反射的使用更广泛,更符合大多数人的习惯吧
304 not midifyide
用字典并保持顺序
l1 = ['b','c','d','b','c','a','a']
l2 = list(set(l1)) //应改成 l2={}.fromkeys(l1).keys()
l2.sort(key=l1.index)
print l2
fib = lambda n: n if n <=2 else fib(n - 1) + fib(n - 2) + 2
我觉得应该是这样的。。。至少上2阶有2种方式
变态台阶问题应该是
fib = lambda n: 1 if n < 2 else 2 * fib(n - 1)
应该加上对 fun
函数的调用。
如题
引用的文章在讨论新式类的MRO顺序。
在经典对象模型中,方法和属性的查找链是按照从左到右,深度优先的方式进行查找。所以当A的实例b
要使用属性a时,它的查找顺序为:A->B->D->C->A,这样做就会忽略类C的定义a,而先找到的基类D的
属性a,这是一个bug,这个问题在新式类中得到修复,新的对象模型采用的是从左到右,广度优先的方式
进行查找,所以查找顺序为A->B->C->D,可以正确的返回类C的属性a。
其中提到新式类是广度优先查找,这里明显错误。事实上Python在这里采用的是C3算法。
应该叙述为两个同为升序或同为降序的有序列表,如不这样描述,以下例子就会出错:
a = [30, 40, 70, 90]
b = [20, 90]
直接就在readme里写 这样好吗
单向的链表为什么走到最后,到尾节点还能够返回呢?
l1 = [1, 2, 3, 4, 5, 1, 2]
l2 = []
[l2.append(i) for i in l1 if not i in l2]
[None, None, None, None, None]
format在许多方面看起来更便利.你可以重用参数,但是你用%就不行
你确定???
>>> data = {'name': 'Bob', 'age': 20}
>>> '%(name)s is %(age)d years old, and %(name)s is a boy.' % data
'Bob is 20 years old, and Bob is a boy.'
def singleton(cls):
instances = {}
def getinstance(*args, **kw):
if cls not in instances:
instances[cls] = cls(*args, **kw)
return instances[cls]
return getinstance
@singleton
class MyClass:
def __init__(self, *args, **kwargs):
print(args, kwargs)
a = MyClass(1, 2, 3)
b = MyClass(3, 4, 5)
print(id(a), id(b))
# (1, 2, 3) {}
# 4555464832 4555464832
原文是这样子的
def singleton(cls, *args, **kw):
instances = {}
def getinstance():
if cls not in instances:
instances[cls] = cls(*args, **kw)
return instances[cls]
return getinstance
@singleton
class MyClass:
...
https://github.com/taizilongxu/interview_python/issues
参照这个问答
python的重载应该可以通过的classmethod实现的
个人感觉知乎上的这个讨论颇有助益
https://www.zhihu.com/question/31640769?rf=37401322
因为手边不便,所以提在issues里了,见谅。
循环算法
def loop_merge_sort(l1, l2):
tmp = []
while len(l1) > 0 and len(l2) > 0:
if l1[0] < l2[0]:
tmp.append(l1[0])
del l1[0]
else:
tmp.append(l2[0])
del l2[0]
tmp.extend(l1)
tmp.extend(l2)
return tmp
这个方法并不能合并两个有序列表
单例模式第一种实现方法有bug,如下,A是一个单例类,B继承了A,当A实例化之后,再实例化B时,返回的是A的实例。
class A(Singleton):
pass
class B(A):
pass
a = A()
b = B()
print isinstance(b, B)
False
print isinstance(b, A)
True
修改如下:
class Singleton(object):
_instance = {}
def new(cls, _args, *_kwargs):
if cls in cls._instance:
return cls._instance[cls]
else:
obj = super(Singleton, cls).new(cls, _args, *_kwargs)
cls._instance[cls] = obj
return obj
我认为 GET和POST有什么区别?及为什么网上的多数答案都是错的 这篇文章并不严谨,而且有点标题党。
首先这三点确实是事实上的区别,虽然HTTP协议并没有规定:
GET使用URL或Cookie传参。而POST将数据放在BODY中。
GET的URL会有长度上的限制,则POST的数据则可以非常大。
POST比GET安全,因为数据在地址栏上不可见。
其次:
"GET和POST与数据如何传递没有关系" 是不对的,HTTP协议有相关的规定。
参考: http://stackoverflow.com/questions/978061/http-get-with-request-body
"安全不安全和GET、POST没有关系"
这里的"安全"也可以理解为"幂等",事实上需要避免通过GET请求执行会改变状态的操作。
参考: http://www.yining.org/2010/05/04/http-get-vs-post-and-thoughts/
建议将那个链接替换成更严谨准确的文章,比如:
http://stackoverflow.com/questions/978061/http-get-with-request-body 。
3 Redis原理
“自动操作:对不同数据类型的操作都是自动的,很安全。”
请问这句话是什么意思?!!
肯定是英文的atomic被翻译成自动(automic)了吧,这里肯定不是技术人员翻译的,不然不会犯这种低级错误,误人子弟。
一叶知秋,其他地方应该还有很多这种类似的,建议大家去找更用心的答案,参考一下问题是可以的。
557行 装饰器版本单例模式写错啦
def singleton(cls):
instances = {}
def getinstance(*args, **kw):
if cls not in instances:
instances[cls] = cls(*args, **kw)
return instances[cls]
return getinstance
@singleton
class MyClass:
__init__
不是什么都不返回,它默认返回一个None,默认不用显式声明。
字典这个是一个迭代器对象,参考官方文档找到下列说明,字典只支持Key的遍历,,如果想对key,value,则可以使用items方法,原代码:d = {key: value for (key, value) in iterable}报错,所以正确的代码应该是d = {key: value for (key, value) in iterable.items()}
A declarative, efficient, and flexible JavaScript library for building user interfaces.
🖖 Vue.js is a progressive, incrementally-adoptable JavaScript framework for building UI on the web.
TypeScript is a superset of JavaScript that compiles to clean JavaScript output.
An Open Source Machine Learning Framework for Everyone
The Web framework for perfectionists with deadlines.
A PHP framework for web artisans
Bring data to life with SVG, Canvas and HTML. 📊📈🎉
JavaScript (JS) is a lightweight interpreted programming language with first-class functions.
Some thing interesting about web. New door for the world.
A server is a program made to process requests and deliver data to clients.
Machine learning is a way of modeling and interpreting data that allows a piece of software to respond intelligently.
Some thing interesting about visualization, use data art
Some thing interesting about game, make everyone happy.
We are working to build community through open source technology. NB: members must have two-factor auth.
Open source projects and samples from Microsoft.
Google ❤️ Open Source for everyone.
Alibaba Open Source for everyone
Data-Driven Documents codes.
China tencent open source team.