- ubuntu12.04环境下使用kvm ioctl接口实现最简单的虚拟机
- Ubuntu 通过无线网络安装Ubuntu Server启动系统后连接无线网络的方法
- 在Ubuntu上搭建网桥的方法
- ubuntu 虚拟机上网方式及相关配置详解
CFSDN坚持开源创造价值,我们致力于搭建一个资源共享平台,让每一个IT人在这里找到属于你的精彩世界.
这篇CFSDN的博客文章Python 面试中 8 个必考问题由作者收集整理,如果你对这篇文章有兴趣,记得点赞哟.
1、下面这段代码的输出结果是什么?请解释.
1
2
3
4
5
6
7
8
9
10
11
|
def
extendList(val,
list
=
[]):
list
.append(val)
return
list
list1
=
extendList(
10
)
list2
=
extendList(
123
,[])
list3
=
extendList(
'a'
)
print
"list1 = %s"
%
list1
print
"list2 = %s"
%
list2
print
"list3 = %s"
%
list3
|
怎样修改extendList的定义能够产生以下预期的行为?
上面代码输出结果将是:
list1 = [10, 'a'] list2 = [123] list3 = [10, 'a'] 。
很多人都会误认为list1=[10],list3=[‘a'],因为他们以为每次extendList被调用时,列表参数的默认值都将被设置为[].但实际上的情况是,新的默认列表只在函数被定义的那一刻创建一次.
当extendList被没有指定特定参数list调用时,这组list的值随后将被使用。这是因为带有默认参数的表达式在函数被定义的时候被计算,不是在调用的时候被计算。因此list1和list3是在同一个默认列表上进行操作(计算)的。而list2是在一个分离的列表上进行操作(计算)的。(通过传递一个自有的空列表作为列表参数的数值).
extendList的定义可以作如下修改.
尽管,创建一个新的列表,没有特定的列表参数.
下面这段代码可能能够产生想要的结果.
1
2
3
4
5
|
def
extendList(val,
list
=
None
):
if
list
is
None
:
list
=
[]
list
.append(val)
return
list
|
通过上面的修改,输出结果将变成:
list1 = [10] list2 = [123] list3 = ['a'] 。
2、下面这段代码的输出结果将是什么?请解释.
1
2
3
|
def
multipliers():
return
[
lambda
x : i
*
x
for
i
in
range
(
4
)]
print
[m(
2
)
for
m
in
multipliers()]
|
你如何修改上面的multipliers的定义产生想要的结果?
上面代码输出的结果是[6, 6, 6, 6] (不是我们想的[0, 2, 4, 6]).
上述问题产生的原因是Python闭包的延迟绑定。这意味着内部函数被调用时,参数的值在闭包内进行查找。因此,当任何由multipliers()返回的函数被调用时,i的值将在附近的范围进行查找。那时,不管返回的函数是否被调用,for循环已经完成,i被赋予了最终的值3.
因此,每次返回的函数乘以传递过来的值3,因为上段代码传过来的值是2,它们最终返回的都是6(3*2)。碰巧的是,《The Hitchhiker's Guide to Python》也指出,在与lambdas函数相关也有一个被广泛被误解的知识点,不过跟这个case不一样。由lambda表达式创造的函数没有什么特殊的地方,它其实是和def创造的函数式一样的.
下面是解决这一问题的一些方法.
一种解决方法就是用Python生成器.
1
2
|
def
multipliers():
for
i
in
range
(
4
):
yield
lambda
x : i
*
x
|
另外一个解决方案就是创造一个闭包,利用默认函数立即绑定.
1
2
|
def
multipliers():
return
[
lambda
x, i
=
i : i
*
x
for
i
in
range
(
4
)]
|
还有种替代的方案是,使用偏函数:
1
2
3
4
|
from
functools
import
partial
from
operator
import
mul
def
multipliers():
return
[partial(mul, i)
for
i
in
range
(
4
)]
|
3、下面这段代码的输出结果将是什么?请解释.
1
2
3
4
5
6
7
8
9
10
11
|
class
Parent(
object
):
x
=
1
class
Child1(Parent):
pass
class
Child2(Parent):
pass
print
Parent.x, Child1.x, Child2.x
Child1.x
=
2
print
Parent.x, Child1.x, Child2.x
Parent.x
=
3
print
Parent.x, Child1.x, Child2.x
|
输出结果将是:
1 1 1 1 2 1 3 2 3 。
让很多人困惑或惊讶的是最后一行输出为什么是3 2 3 而不是 3 2 1.为什么在改变parent.x的同时也改变了child2.x的值?但与此同时没有改变Child1.x的值?
此答案的关键是,在Python中,类变量在内部是以字典的形式进行传递.
如果一个变量名没有在当前类下的字典中发现。则在更高级的类(如它的父类)中尽心搜索直到引用的变量名被找到。(如果引用变量名在自身类和更高级类中没有找到,将会引发一个属性错误。) 。
因此,在父类中设定x = 1,让变量x类(带有值1)能够在其类和其子类中被引用到。这就是为什么第一个打印语句输出结果是1 1 1 。
因此,如果它的任何一个子类被覆写了值(例如说,当我们执行语句Child1.x = 2),这个值只在子类中进行了修改。这就是为什么第二个打印语句输出结果是1 2 1 。
最终,如果这个值在父类中进行了修改,(例如说,当我们执行语句Parent.x = 3),这个改变将会影响那些还没有覆写子类的值(在这个例子中就是Child2)这就是为什么第三打印语句输出结果是3 2 3 。
4、下面这段代码在Python2下输出结果将是什么?请解释.
1
2
3
4
5
6
7
8
|
def
div1(x,y):
print
"%s/%s = %s"
%
(x, y, x
/
y)
def
div2(x,y):
print
"%s//%s = %s"
%
(x, y, x
/
/
y)
div1(
5
,
2
)
div1(
5.
,
2
)
div2(
5
,
2
)
div2(
5.
,
2.
)
|
在Python3下结果会有怎样的不同?(当然,假设上述打印语句被转换成Python3的语法) 。
在Python2中,上述代码输出将是 。
5/2 = 2 5.0/2 = 2.5 5//2 = 2 5.0//2.0 = 2.0 。
默认情况下,Python 2 自动执行整形计算如果两者都是整数。因此,5/2 结果是2,而5./2结果是2.5 。
注意,在Python2中,你可以通过增加以下引用来覆写这个行为.
from future import division 。
同时要注意的是,//操作符将总是执行整形除法,不管操作符的类型。这就是为什么即使在Python 2中5.0//2.0的结果是2.0。然而在Python3中,没有此类特性, 。
例如,在两端都是整形的情况下,它不会执行整形除法 。
因此,在Python3中,将会是如下结果:
5/2 = 2.5 5.0/2 = 2.5 5//2 = 2 5.0//2.0 = 2.0 。
注: 在 Python 3 中,/ 操作符是做浮点除法,而 // 是做整除(即商没有余数,比如 10 // 3 其结果就为 3,余数会被截除掉,而 (-7) // 3 的结果却是 -3。这个算法与其它很多编程语言不一样,需要注意,它们的整除运算会向0的方向取值。而在 Python 2 中,/ 就是整除,即和 Python 3 中的 // 操作符一样) 。
5、下面代码的输出结果将是什么?
1
2
|
list
=
[
'a'
,
'b'
,
'c'
,
'd'
,
'e'
]
print
list
[
10
:]
|
下面的代码将输出[],不会产生IndexError错误。就像所期望的那样,尝试用超出成员的个数的index来获取某个列表的成员.
例如,尝试获取list[10]和之后的成员,会导致IndexError. 。
然而,尝试获取列表的切片,开始的index超过了成员个数不会产生IndexError,而是仅仅返回一个空列表.
这成为特别让人恶心的疑难杂症,因为运行的时候没有错误产生,导致bug很难被追踪到.
6、考虑下列代码片段:
1
2
3
4
5
6
7
8
|
list
=
[ [ ] ]
*
5
list
# output?
list
[
0
].append(
10
)
list
# output?
list
[
1
].append(
20
)
list
# output?
list
.append(
30
)
list
# output?
|
2,4,6,8行将输出什么结果?试解释.
输出的结果如下:
[[], [], [], [], []] [[10], [10], [10], [10], [10]] [[10, 20], [10, 20], [10, 20], [10, 20], [10, 20]] [[10, 20], [10, 20], [10, 20], [10, 20], [10, 20], 30] 。
解释如下:
第一行的输出结果直觉上很容易理解,例如 list = [ [ ] ] * 5 就是简单的创造了5个空列表。然而,理解表达式list=[ [ ] ] * 5的关键一点是它不是创造一个包含五个独立列表的列表,而是它是一个创建了包含对同一个列表五次引用的列表。只有了解了这一点,我们才能更好的理解接下来的输出结果.
list[0].append(10) 将10附加在第一个列表上.
但由于所有5个列表是引用的同一个列表,所以这个结果将是:
[[10], [10], [10], [10], [10]] 。
同理,list[1].append(20)将20附加在第二个列表上。但同样由于5个列表是引用的同一个列表,所以输出结果现在是:
[[10, 20], [10, 20], [10, 20], [10, 20], [10, 20]] 。
作为对比, list.append(30)是将整个新的元素附加在外列表上,因此产生的结果是: [[10, 20], [10, 20], [10, 20], [10, 20], [10, 20], 30]. 。
7、Given a list of N numbers.
给定一个含有N个数字的列表.
使用单一的列表生成式来产生一个新的列表,该列表只包含满足以下条件的值:
(a)偶数值 。
(b)元素为原始列表中偶数切片.
例如,如果list[2]包含的值是偶数。那么这个值应该被包含在新的列表当中。因为这个数字同时在原始列表的偶数序列(2为偶数)上。然而,如果list[3]包含一个偶数, 。
那个数字不应该被包含在新的列表当中,因为它在原始列表的奇数序列上.
对此问题的简单解决方法如下:
1
|
[x
for
x
in
list
[::
2
]
if
x
%
2
=
=
0
]
|
例如,给定列表如下:
1
|
list
=
[
1
,
3
,
5
,
8
,
10
,
13
,
18
,
36
,
78
]
|
列表生成式[x for x in list[::2] if x%2 == 0] 的结果是, 。
[10, 18, 78] 。
这个表达式工作的步骤是,第一步取出偶数切片的数字, 。
第二步剔除其中所有奇数.
8、给定以下字典的子类,下面的代码能够运行么?为什么?
1
2
3
4
5
|
class
DefaultDict(
dict
):
def
__missing__(
self
, key):
return
[]
d
=
DefaultDict()
d[
'florp'
]
=
127
|
能够运行.
当key缺失时,执行DefaultDict类,字典的实例将自动实例化这个数列.
总结 。
以上所述是小编给大家介绍的Python 面试中 8 个必考问题,希望对大家有所帮助,如果大家有任何疑问请给我留言,小编会及时回复大家的。在此也非常感谢大家对我网站的支持! 。
原文链接:https://segmentfault.com/a/1190000006265256 。
最后此篇关于Python 面试中 8 个必考问题的文章就讲到这里了,如果你想了解更多关于Python 面试中 8 个必考问题的内容请搜索CFSDN的文章或继续浏览相关文章,希望大家以后支持我的博客! 。
关闭。这个问题是off-topic .它目前不接受答案。 想要改进这个问题? Update the question所以它是on-topic用于堆栈溢出。 关闭 12 年前。 Improve thi
我有一个动态网格,其中的数据功能需要正常工作,这样我才能逐步复制网格中的数据。假设在第 5 行中,我输入 10,则从第 6 行开始的后续行应从 11 开始读取,依此类推。 如果我转到空白的第一行并输入
我有一个关于我的按钮消失的问题 我已经把一个图像作为我的按钮 用这个函数动画 function example_animate(px) { $('#cont
我有一个具有 Facebook 连接和经典用户名/密码登录的网站。目前,如果用户单击 facebook_connect 按钮,系统即可运行。但是,我想将现有帐户链接到 facebook,因为用户可以选
我有一个正在为 iOS 开发的应用程序,该应用程序执行以下操作 加载和设置注释并启动核心定位和缩放到位置。 map 上有很多注释,从数据加载不会花很长时间,但将它们实际渲染到 map 上需要一段时间。
我被推荐使用 Heroku for Ruby on Rails 托管,到目前为止,我认为我真的会喜欢它。只是想知道是否有人可以帮助我找出问题所在。 我按照那里的说明在该网站上创建应用程序,创建并提交
我看过很多关于 SSL 错误的帖子和信息,我自己也偶然发现了一个。 我正在尝试使用 GlobalSign CA BE 证书通过 Android WebView 访问网页,但出现了不可信错误。 对于大多
我想开始使用 OpenGL 3+ 和 4,但我在使用 Glew 时遇到了问题。我试图将 glew32.lib 包含在附加依赖项中,并且我已将库和 .dll 移动到主文件夹中,因此不应该有任何路径问题。
我已经盯着这两个下载页面的源代码看了一段时间,但我似乎找不到问题。 我有两个下载页面,一个 javascript 可以工作,一个没有。 工作:http://justupload.it/v/lfd7不是
我一直在使用 jQuery,只是尝试在单击链接时替换文本字段以及隐藏/显示内容项。它似乎在 IE 中工作得很好,但我似乎无法让它在 FF 中工作。 我的 jQuery: $(function() {
我正在尝试为 NDK 编译套接字库,但出现以下两个错误: error: 'close' was not declared in this scope 和 error: 'min' is not a m
我正在使用 Selenium 浏览器自动化框架测试网站。在测试过程中,我切换到特定的框架,我们将其称为“frame_1”。后来,我在 Select 类中使用了 deselectAll() 方法。不久之
我正在尝试通过 Python 创建到 Heroku PostgreSQL 数据库的连接。我将 Windows10 与 Python 3.6.8 和 PostgreSQL 9.6 一起使用。 我从“ht
我有一个包含 2 列的数据框,我想根据两列之间的比较创建第三列。 所以逻辑是:第 1 列 val = 3,第 2 列 val = 4,因此新列值什么都没有 第 1 列 val = 3,第 2 列 va
我想知道如何调试 iphone 5 中的 css 问题。 我尝试使用 firelite 插件。但是从纵向旋转到横向时,火石占据了整个屏幕。 有没有其他方法可以调试 iphone 5 中的 css 问题
所以我有点难以理解为什么这不起作用。我正在尝试替换我正在处理的示例站点上的类别复选框。我试图让它做以下事情:未选中时以一种方式出现,悬停时以另一种方式出现(选中或未选中)选中时以第三种方式出现(而不是
Javascript CSS 问题: 我正在使用一个文本框来写入一个 div。我使用以下 javascript 获取文本框来执行此操作: function process_input(){
你好,我很难理解 P、NP 和多项式时间缩减的主题。我试过在网上搜索它并问过我的一些 friend ,但我没有得到任何好的答案。 我想问一个关于这个话题的一般性问题: 设 A,B 为 P 中的语言(或
你好,我一直在研究 https://leetcode.com/problems/2-keys-keyboard/并想到了这个动态规划问题。 您从空白页上的“A”开始,完成后得到一个数字 n,页面上应该
我正在使用 Cocoapods 和 KIF 在 Xcode 服务器上运行持续集成。我已经成功地为一个项目设置了它来报告每次提交。我现在正在使用第二个项目并收到错误: Bot Issue: warnin
我是一名优秀的程序员,十分优秀!