2010-11-08 37 views
5

我繼承了一些Python代碼,看起來像這樣:的Python:多個可能值函數的參數

name = 'London' 
code = '0.1' 
notes = 'Capital of England' 
ev = model.City(key=key, code=code, name=name or code, notes=notes) 

在學習的精神,我想知道這是怎麼回事與name or code說法。這是說'使用name如果它不爲空,否則使用code'?

什麼是提供這樣的多個可能的參數的技術術語,所以我可以在Python文檔中讀到它?

謝謝!

+0

我的壞 - 編輯,對不起。必須停止使用僞代碼! – AP257 2010-11-08 14:39:38

回答

13

差不多。它說使用名稱,如果它不計算爲假Things that evaluate to false包括,但不限於:

  • False
  • 空序列((), [], ""
  • 空映射({}
  • None

編輯加鏈接提供編者SilentGhost在他的評論中回答。

+2

這真的很酷。我認爲我喜歡Python。 – AP257 2010-11-08 14:40:46

+1

也'沒有'(4多走) – 2010-11-08 14:41:33

+1

[完整列表可在文檔](http://docs.python.org/library/stdtypes.html#truth-value-testing) – SilentGhost 2010-11-08 15:41:26

7

在Python中,or運算符返回第一個操作數,除非它的計算結果爲false,在這種情況下,它返回第二個操作數。實際上,這將使用name,如果未指定name,則默認回退爲code

+3

澄清,或'返回其操作數的實際值,而不僅僅是' True'或'False'非常重要,既適用於普通教育又適用於原始問題 – 2010-11-08 14:46:39

1

火了一個Python控制檯:

>>> name = None 
>>> code = 0.1 
>>> name or code 
0.10000000000000001 

萬一名計算爲false表達式會的代碼。否則將使用名稱。

+0

我已經糾正了這個問題。 – kgiannakakis 2010-11-08 14:42:02

0

你說它大致正確,但'空'並不完全是什麼決定。基本上任何將評估爲假(0,假,空字符串'')將導致顯示第二個字符串,而不是第一個。在這個意義上的 'X或Y' 是一種等價於:

如果X:X
其他:Y

一些控制檯遊戲:

X = ''
Y = '咆哮'
x或y
-'roar」
X = 'ARF'
x或y
-'arf '
X =假
x或y
-'roar'

0

在學習的精神,我想 知道發生了什麼事情的名字或 代碼參數。這是說'使用 名稱,如果它不爲空,否則使用 代碼'?

基本上是零,但在python可能意味着一個物多(空字符串,沒有..)

像你的情況:

>>> name = 'London' 
>>> code = 0.1 
>>> name or code 
'London' 
>>> name = '' 
>>> code = 0.1 
>>> name or code 
0.1000.... 

,但很奇怪的是thew函數參數有時可以是整數,也可以是其他時間。

希望這可以幫助:=)

+1

爲了避免混淆,我會說這不是默認參數值的例子,它只是評估布爾表達式。默認參數值是您在方法*定義中提供默認值時的值,例如'def some_method(param1,some_flag = False):#some_flag默認爲False,如果在通話時忽略。另外,正如其他人所說的那樣,空字符串,空列表等評估爲虛假而不是空值。 – mikej 2010-11-08 14:55:54

+0

@mikej:我從他的問題中瞭解__多個可能的參數,例如(this)__,他正在談論__default參數values__,也許我誤解了那個:),因爲它依賴於__ this__這個函數或or? – mouad 2010-11-08 15:32:39

+0

我認爲@AP257(OP)認爲'name或code'是一種特殊的參數傳遞語法,當它真的是表達式的評估並且可以在表達式可以使用的任何地方使用。 – mikej 2010-11-08 15:38:09

1

正確,成語取計算結果爲真(一般不無)的第一個值。小心使用,因爲有效值(如零)可能會被無意中遺棄。一個更安全的做法是這樣的:

if name is not None: 
    # use name 

name if name is not None else code