Movatterモバイル変換


[0]ホーム

URL:


Skip to content

Navigation Menu

Sign in
Appearance settings

Search code, repositories, users, issues, pull requests...

Provide feedback

We read every piece of feedback, and take your input very seriously.

Saved searches

Use saved searches to filter your results more quickly

Sign up
Appearance settings

Commit56d6e12

Browse files
committed
first cm
0 parents  commit56d6e12

File tree

1 file changed

+182
-0
lines changed

1 file changed

+182
-0
lines changed

‎Readme.md

Lines changed: 182 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,182 @@
1+
#Python面试题集
2+
3+
目前面了4家python的公司,基本都是很基础的东西,对比发现和stackoverflow上高票数的问题有很多重复,整理一下希望对别人有帮助.
4+
5+
其中有可能是自己想到的一些知识点,也有一些是网上收集的.
6+
7+
##概念类
8+
9+
###1 Python的函数参数传递
10+
11+
看两个例子:
12+
13+
```python
14+
a=1
15+
deffun(a):
16+
a=2
17+
print a# 1
18+
```
19+
20+
```python
21+
a= []
22+
deffun(a):
23+
a.append(1)
24+
print a# [1]
25+
```
26+
27+
所有的变量都可以理解是内存中一个对象的“引用”,或者,也可以看似c中void*的感觉。
28+
29+
这里记住的是类型是属于对象的,而不是变量。而对象有两种,“可更改”(mutable)与“不可更改”(immutable)对象。在python中,strings, tuples, 和numbers是不可更改的对象,而list,dict等则是可以修改的对象。(这就是这个问题的重点)
30+
31+
当一个引用传递给函数的时候,函数自动复制一份引用,这个函数里的引用和外边的引用没有半毛关系了.所以第一个例子里函数把引用指向了一个不可变对象,当函数返回的时候,外面的引用没半毛感觉.而第二个例子就不一样了,函数内的引用指向的是可变对象,对它的操作就和定位了指针地址一样,在内存里进行修改.
32+
33+
如果还不明白的话,这里有更好的解释:http://stackoverflow.com/questions/986006/how-do-i-pass-a-variable-by-reference
34+
35+
###2 Python中的元类(metaclass)
36+
37+
这个非常的不常用,但是像ORM这种复杂的结构还是会需要的,详情请看:http://stackoverflow.com/questions/100003/what-is-a-metaclass-in-python
38+
39+
###3@staticmethod@classmethod
40+
41+
Python其实有3个方法,即静态方法(staticmethod),类方法(classmethod)和实例方法,如下:
42+
43+
```python
44+
deffoo(x):
45+
print"executing foo(%s)"%(x)
46+
47+
classA(object):
48+
deffoo(self,x):
49+
print"executing foo(%s,%s)"%(self,x)
50+
51+
@classmethod
52+
defclass_foo(cls,x):
53+
print"executing class_foo(%s,%s)"%(cls,x)
54+
55+
@staticmethod
56+
defstatic_foo(x):
57+
print"executing static_foo(%s)"%x
58+
59+
a=A()
60+
61+
```
62+
63+
这里先理解下函数参数里面的self和cls.这个self和cls是对类或者实例的绑定,对于一般的函数来说我们可以这么调用`foo(x)`,这个函数就是最常用的,它的工作跟任何东西(类,实例)无关.对于实例方法,我们知道在类里每次定义方法的时候都需要绑定这个实例,就是`foo(self, x)`,为什么要这么做呢?因为实例方法的调用离不开实例,我们需要把实例自己传给函数,调用的时候是这样的`a.foo(x)`(其实是`foo(a, x)`).类方法一样,只不过它传递的是类而不是实例,`A.class_foo(x)`.注意这里的self和cls可以替换别的参数,但是python的约定是这俩,还是不要改的好.
64+
65+
对于静态方法其实和普通的方法一样,不需要对谁进行绑定,唯一的区别是调用的时候需要使用`a.static_foo(x)`或者`A.static_foo(x)`来调用.
66+
67+
|\\|实例方法|类方法|静态方法|
68+
|:--|:--|:--|:--|
69+
|a = A()|a.foo(x)|a.class_foo(x)|a.static_foo(x)|
70+
|A|不可用|A.class_foo(x)|A.static_foo(x)|
71+
72+
更多关于这个问题:http://stackoverflow.com/questions/136097/what-is-the-difference-between-staticmethod-and-classmethod-in-python
73+
74+
###4 类变量和实例变量
75+
76+
```python
77+
classPerson:
78+
name="aaa"
79+
80+
p1=Person()
81+
p2=Person()
82+
p1.name="bbb"
83+
print p1.name# bbb
84+
print p2.name# aaa
85+
print Person.name# aaa
86+
```
87+
88+
类变量就是供类使用的变量,实例变量就是供实例使用的.
89+
90+
这里`p1.name="bbb"`是实例调用了类变量,这其实和上面第一个问题一样,就是函数传参的问题,`p1.name`一开始是指向的类变量`name="aaa"`,但是在实例的作用域里把类变量的引用改变了,就变成了一个实例变量,self.name不再引用Person的类变量name了.
91+
92+
可以看看下面的例子:
93+
94+
```python
95+
classPerson:
96+
name=[]
97+
98+
p1=Person()
99+
p2=Person()
100+
p1.name.append(1)
101+
print p1.name# [1]
102+
print p2.name# [1]
103+
print Person.name# [1]
104+
```
105+
106+
参考:http://stackoverflow.com/questions/6470428/catch-multiple-exceptions-in-one-line-except-block
107+
108+
###5 Python自省
109+
110+
这个也是python彪悍的特性.
111+
112+
自省就是面向对象的语言所写的程序在运行时,所能知道对象的类型.简单一句就是运行时能够获得对象的类型.比如type(),dir(),getattr(),hasattr(),isinstance().
113+
114+
###6 字典推导式
115+
116+
可能你见过列表推导时,却没有见过字典推导式,在2.7中才加入的:
117+
118+
```python
119+
d= {key: valuefor (key, value)in iterable}
120+
```
121+
122+
###7 Python中单下划线和双下划线
123+
124+
```python
125+
>>>classMyClass():
126+
...def__init__(self):
127+
...self.__superprivate="Hello"
128+
...self._semiprivate=", world!"
129+
...
130+
>>> mc= MyClass()
131+
>>>print mc.__superprivate
132+
Traceback (most recent call last):
133+
File"<stdin>", line1,in<module>
134+
AttributeError: myClass instance has no attribute'__superprivate'
135+
>>>print mc._semiprivate
136+
, world!
137+
>>>print mc.__dict__
138+
{'_MyClass__superprivate':'Hello','_semiprivate':', world!'}
139+
```
140+
141+
`__foo__`:一种约定,Python内部的名字,用来区别其他用户自定义的命名,以防冲突.
142+
143+
`_foo`:一种约定,用来指定变量私有.程序员用来指定私有变量的一种方式.
144+
145+
`__foo`:这个有真正的意义:解析器用`_classname__foo`来代替这个名字,以区别和其他类相同的命名.
146+
147+
详情见:http://stackoverflow.com/questions/1301346/the-meaning-of-a-single-and-a-double-underscore-before-an-object-name-in-python
148+
149+
或者:http://www.zhihu.com/question/19754941
150+
151+
###8 字符串格式化:%和.format
152+
153+
.format在许多方面看起来更便利.你可以重用参数,但是你用%就不行.最烦人的是%它无法同时传递一个变量和元组.你可能会想下面的代码不会有什么问题:
154+
155+
```
156+
"hi there %s" % name
157+
```
158+
159+
但是,如果name恰好是(1,2,3),它将会抛出一个TypeError异常.为了保证它总是正确的,你必须这样做:
160+
161+
```
162+
"hi there %s" % (name,) # 提供一个单元素的数组而不是一个参数
163+
```
164+
165+
但是有点丑..format就没有这些问题.你给的第二个问题也是这样,.format好看多了.
166+
167+
你为什么不用它?
168+
169+
* 不知道它(在读这个之前)
170+
* 为了和Python2.5兼容
171+
172+
http://stackoverflow.com/questions/5082452/python-string-formatting-vs-format
173+
174+
###9 迭代器和生成器
175+
176+
这个是stackoverflow里python排名第一的问题,值得一看:http://stackoverflow.com/questions/231767/what-does-the-yield-keyword-do-in-python
177+
178+
这是中文版:http://taizilongxu.gitbooks.io/stackoverflow-about-python/content/1/README.html
179+
180+
###10`*args` and`**kwargs`
181+
182+
http://stackoverflow.com/questions/3394835/args-and-kwargs

0 commit comments

Comments
 (0)

[8]ページ先頭

©2009-2025 Movatter.jp