[點擊查看原文](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)。詳細點來說迎罗,這個術(shù)語并不能精確的描述Python是如何工作的所森。在Python中,萬物皆對象,所以的變量只是對象的引用隘梨,這些引用的值被傳遞給函數(shù)。所以我們不能改變引用的值但是可以可變對象的值舷嗡。記字崃浴: numbers, strings 和 tuples 是不可變的, list 和 dicts 是可變的。
如果函數(shù)收到的是一個可變對象(比如字典或者列表)的引用进萄,就能修改對象的原始值--相當于通過“傳引用”來傳遞對象捻脖。如果函數(shù)收到的是一個不可變對象(比如數(shù)字、字符或者元組)的引用中鼠,就不能直接修改原始對象--相當于通過“傳值'來傳遞對象可婶。
python中任何變量都是對象,所以參數(shù)只支持引用傳遞方式援雇。即通過名字綁定的機制矛渴,把實際參數(shù)的值和形式參數(shù)的名稱綁定在一起,形式參數(shù)和實際參數(shù)指向內(nèi)存中的同一個存儲空間惫搏。
2.Do you know what list and dict comprehensions are? Can you give an example?
列表或字典推導(dǎo)是一種語法結(jié)構(gòu)具温,基于已經(jīng)存在的可迭代對象,用來更容易的產(chǎn)生列表或字典筐赔。根據(jù)第三版的“Learning Python”铣猩,列表推導(dǎo)通常來說比正常的循環(huán)要快,不同的版本之間可能存在差異茴丰。
# 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 : **集合,無序,元素只出現(xiàn)一次, 自動去重,使用”set([])”
應(yīng)用場景:
**list : ** 簡單的數(shù)據(jù)集合,可以使用索引;
**tuple : **, 把一些數(shù)據(jù)當做一個整體去使用,不能修改;
**dict : **使用鍵值和值進行關(guān)聯(lián)的數(shù)據(jù);
**set : **數(shù)據(jù)只出現(xiàn)一次,只關(guān)心數(shù)據(jù)是否出現(xiàn), 不關(guān)心其位置;
7.Do you know the difference between range and xrange?
range返回一個list达皿,xrang返回一個(生成器)xrang對象;
range返回所有產(chǎn)生的元素(這是非常消耗時間和內(nèi)存的)贿肩,xrang則是每次迭代產(chǎn)生一個峦椰。