Giter Site home page Giter Site logo

interview_python's Issues

感觉GET和POST区别的解释有点问题

给出的第一个链接,只说了结构上,两者的功能可以相互通用,所以觉得大部分解释都是错的。但没讲实际上区别在哪里。
事实上,该文章下方评论124楼讲得更好。
个人理解。理论上,get、post、put的功能确实可以互通,但是约定上用法不同,导致服务器上的方法一般写得也会不同(自己硬要写个能互通的方法也可以,但不符合一般的习惯),使得实际使用时,就是不一样的。完全就是大部分地方解释的,GET获得数据,POST提交、创建数据、PUT修改数据。

Python 函数参数传递不准确&&补充

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的函数参数传递可以理解为传指针。
具体请参考这里(英文版)(中文版)

16 单例模式__new__方式实现

class Singleton(object):
__instance = None

     def __new__(cls, *args, **kwargs):
               if not cls.__instance:
                     cls.__instance = object.__new__(cls)
               return cls.__instance

自己写的单例模式

27 题中 readlines 返回的是列表而不是迭代器

官方解释:
Read until EOF using readline() and return a **_list_** containing the lines thus read.
使用 xreadlines 返回的才是迭代器。

另外,希望能说明一点,xreadlines 已经在 2.3 版本以后废弃,改用 for line in file 替代。

对字符串格式化

字符串格式化还可以补充一个新特性f"{} {}"这是python3.6以上存在的

GIL 部分描述有误

线程全局锁(Global Interpreter Lock),即Python为了保证线程安全而采取的独立线程运行的限制,说白了就是一个核只能在同一时间运行一个线程.

主要是这一句:说白了就是一个核只能在同一时间运行一个线程.
多核操作系统下即使是并行计算一个核同时最多也只能有一个线程在运行计算。这里要表达的应该是Python的GIL锁导致Python无法进行并行计算只能并发,一个进程在进行多线程运算时,最多同时只能使用一个核来计算。如果需要使用多核计算需要用多进程而不是多线程。

个人理解,不知道是否有误,仅供参考哈!

关于协程

个人理解协程是对线程/进程同步的编程语法的一个统称,比如python中使用yield,coroutine等关键字进行线程/进程间同步,就避免了显式地使用wait,notify等关键字来进行同步。虽然线程,进程,协程都带程字,但是协程和前两者应该不属于一类

资料有一处错误

您好,最近正在学习python,在你的资料中我学到了很多,很感谢你的分享;不过我好像看到一处错误,正确答案应该是:

C

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()

A

关于字符串格式化

字符串格式化确实有两种形式,某些库推荐使用%,譬如logging库,当你用format形式的时候,pylint检查会给warning。不过个人还是蛮喜欢format的。

青蛙上台阶总数结果不对吧

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)

Python 新式类与旧式类

引用的文章在讨论新式类的MRO顺序。

在经典对象模型中,方法和属性的查找链是按照从左到右,深度优先的方式进行查找。所以当A的实例b
要使用属性a时,它的查找顺序为:A->B->D->C->A,这样做就会忽略类C的定义a,而先找到的基类D的
属性a,这是一个bug,这个问题在新式类中得到修复,新的对象模型采用的是从左到右,广度优先的方式
进行查找,所以查找顺序为A->B->C->D,可以正确的返回类C的属性a。

其中提到新式类是广度优先查找,这里明显错误。事实上Python在这里采用的是C3算法。

字符串格式化和format

字符串格式化和format

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:
  ...

合并两个有序列表问题

循环算法

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

5 Post和Get 区别的问题

我认为 GET和POST有什么区别?及为什么网上的多数答案都是错的 这篇文章并不严谨,而且有点标题党。

首先这三点确实是事实上的区别,虽然HTTP协议并没有规定:

  1. GET使用URL或Cookie传参。而POST将数据放在BODY中。

  2. GET的URL会有长度上的限制,则POST的数据则可以非常大。

  3. POST比GET安全,因为数据在地址栏上不可见。

其次:

建议将那个链接替换成更严谨准确的文章,比如:
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:
  

6.字典推导式中有错误

字典这个是一个迭代器对象,参考官方文档找到下列说明,字典只支持Key的遍历,,如果想对key,value,则可以使用items方法,原代码:d = {key: value for (key, value) in iterable}报错,所以正确的代码应该是d = {key: value for (key, value) in iterable.items()}

Recommend Projects

  • React photo React

    A declarative, efficient, and flexible JavaScript library for building user interfaces.

  • Vue.js photo Vue.js

    🖖 Vue.js is a progressive, incrementally-adoptable JavaScript framework for building UI on the web.

  • Typescript photo Typescript

    TypeScript is a superset of JavaScript that compiles to clean JavaScript output.

  • TensorFlow photo TensorFlow

    An Open Source Machine Learning Framework for Everyone

  • Django photo Django

    The Web framework for perfectionists with deadlines.

  • D3 photo D3

    Bring data to life with SVG, Canvas and HTML. 📊📈🎉

Recommend Topics

  • javascript

    JavaScript (JS) is a lightweight interpreted programming language with first-class functions.

  • web

    Some thing interesting about web. New door for the world.

  • server

    A server is a program made to process requests and deliver data to clients.

  • Machine learning

    Machine learning is a way of modeling and interpreting data that allows a piece of software to respond intelligently.

  • Game

    Some thing interesting about game, make everyone happy.

Recommend Org

  • Facebook photo Facebook

    We are working to build community through open source technology. NB: members must have two-factor auth.

  • Microsoft photo Microsoft

    Open source projects and samples from Microsoft.

  • Google photo Google

    Google ❤️ Open Source for everyone.

  • D3 photo D3

    Data-Driven Documents codes.