[点击查看原文](Python Interview Question and Answers)
1. How are arguments passed - by reference of by value?
简单来说“都不是”,实际上这种方式被称之为“call by object”或者“call by sharing ”(注:也可以称之为“call by object reference”,more info)。详细点来说,这个术语并不能精确的描述Python是如何工作的。在Python中,万物皆对象,所以的变量只是对象的引用,这些引用的值被传递给函数。所以我们不能改变引用的值但是可以可变对象的值。记住: numbers, strings 和 tuples 是不可变的, list 和 dicts 是可变的。
如果函数收到的是一个可变对象(比如字典或者列表)的引用,就能修改对象的原始值--相当于通过“传引用”来传递对象。如果函数收到的是一个不可变对象(比如数字、字符或者元组)的引用,就不能直接修改原始对象--相当于通过“传值'来传递对象。
python中任何变量都是对象,所以参数只支持引用传递方式。即通过名字绑定的机制,把实际参数的值和形式参数的名称绑定在一起,形式参数和实际参数指向内存中的同一个存储空间。
2.Do you know what list and dict comprehensions are? Can you give an example?
列表或字典推导是一种语法结构,基于已经存在的可迭代对象,用来更容易的产生列表或字典。根据第三版的“Learning Python”,列表推导通常来说比正常的循环要快,不同的版本之间可能存在差异。
# simple iteration
a = []
for x in range(10):
a.append(x*2)
# a == [0, 2, 4, 6, 8, 10, 12, 14, 16, 18]
# list comprehension
a = [x*2 for x in range(10)]
# dict comprehension
a = {x: x*2 for x in range(10)}
# a == {0: 0, 1: 2, 2: 4, 3: 6, 4: 8, 5: 10, 6: 12, 7: 14, 8: 16, 9: 18}
5.Can you sum all of the elements in the list, how about to multuply them and get the result?
# the basic way
s = 0
for x in range(10):
s += x
# the right way
s = sum(range(10))
# the basic way
s = 1
for x in range(1, 10):
s = s * x
# the other way
from operator import mul
reduce(mul, range(1, 10))
6.Do you know what is the difference between lists and tuples? Can you give me an example for their usage?
定义:
**list : **链表,有序的项目, 通过索引进行查找,使用方括号”[]”;
**tuple : **元组,元组将多样的对象集合到一起,不能修改,通过索引进行查找, 使用括号”()”;
**dict : **字典,字典是一组键(key)和值(value)的组合,通过键(key)进行查找,没有顺序, 使用大括号”{}”;
**set : **集合,无序,元素只出现一次, 自动去重,使用”set([])”
应用场景:
**list : ** 简单的数据集合,可以使用索引;
**tuple : **, 把一些数据当做一个整体去使用,不能修改;
**dict : **使用键值和值进行关联的数据;
**set : **数据只出现一次,只关心数据是否出现, 不关心其位置;
7.Do you know the difference between range and xrange?
range返回一个list,xrang返回一个(生成器)xrang对象;
range返回所有产生的元素(这是非常消耗时间和内存的),xrang则是每次迭代产生一个。