この記事の内容は、Python の面接でテストする必要があるコードの質問に関するものです。一定の参考価値があります。困っている友人は参照してください。お役に立てば幸いです。あなたに、助けられました。
おすすめ関連記事:「2020年Python面接質問まとめ(最新)」
# #質問 1: 次のコードの出力は何になりますか? 答えて説明してください。
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
質問 2: 次のコードの出力は何になりますか? 答えと説明を教えてください。
def p1(x,y): print("%s/%s = %s" % (x, y, x/y)) def p2(x,y): print("%s//%s = %s" % (x, y, x//y)) p1(5,2) p1(5.,2) p2(5,2) p2(5.,2.)
5/2 = 2 5.0/2.0=2.5 5/2=2 5/2=2
回答
この回答は、実際には、Python 2 を使用しているか Python 3 を使用しているかによって異なります。 Python 3 では、必要な出力は次のとおりです。5/2 = 2.5 5.0/2 = 2.5 5//2 = 2 5.0//2.0 = 2.0
5/2 = 2 5.0/2 = 2.5 5//2 = 2 5.0//2.0 = 2.0
また、「二重ダッシュ」(//) 演算子は、オペランドに関係なく、常に整数の除算を実行することにも注意してください。
質問 3:次のコードが出力されますか?
list = ['a', 'b', 'c', 'd', 'e'] print list[10:]
Answer上記のコードは [ ] を出力し、IndexError を引き起こしません。
def multipliers(): return [lambda x : i * x for i in range(4)] print [m(2) for m in multipliers()]
望ましい結果を生み出すために乗算器の定義をどのように変更しますか?
回答
上記のコードの出力は、([0, 2, 4, 6] ではなく) [6, 6, 6, 6] です。 この理由は、Python のクロージャの遅延バインディングが遅延バインディングを引き起こすためであり、これは、内部関数が呼び出されたときにクロージャ内の変数が検索されることを意味します。 () が呼び出されたとき、その中に i の値が入っている 呼び出されたときに周囲のスコープで検索される その時点で、どの戻り関数が呼び出されても for ループは完了しており、最終的な の値はi は 3 です。したがって、返される各関数乗算の値は 3 です。したがって、2 に等しい値が上記のコードに渡されると、値 6 (例: 3 x 2) が返されます。(顺便说下,正如在 The Hitchhiker’s Guide to Python 中指出的,这里有一点普遍的误解,是关于 lambda 表达式的一些东西。一个 lambda 表达式创建的函数不是特殊的,和使用一个普通的 def 创建的函数展示的表现是一样的。)
这里有两种方法解决这个问题。
最普遍的解决方案是创建一个闭包,通过使用默认参数立即绑定它的参数。例如:
def multipliers(): return [lambda x, i=i : i * x for i in range(4)]
另外一个选择是,你可以使用 functools.partial 函数:
from functools import partial from operator import mul def multipliers(): return [partial(mul, i) for i in range(4)]
问题五:以下的代码的输出将是什么? 说出你的答案并解释?
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’]。认为 list 的参数会在 extendList 每次被调用的时候会被设置成它的默认值 [ ]。
尽管如此,实际发生的事情是,新的默认列表仅仅只在函数被定义时创建一次。随后当 extendList 没有被指定的列表参数调用的时候,其使用的是同一个列表。这就是为什么当函数被定义的时候,表达式是用默认参数被计算,而不是它被调用的时候。
因此,list1 和 list3 是操作的相同的列表。而 "`list2是操作的它创建的独立的列表(通过传递它自己的空列表作为list"参数的值)。
extendList 函数的定义可以做如下修改,但,当没有新的 list 参数被指定的时候,会总是开始一个新列表,这更加可能是一直期望的行为。
def extendList(val, list=None): if list is None: list = [] list.append(val) return list
使用这个改进的实现,输出将是:
list1 = [10] list2 = [123] list3 = ['a']
相关学习推荐:python视频教程
以上がPython の面接でテストする必要があるコードの質問の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。