我宣告了一個水果串列,如:
def fruits = ["apple", "orange", "pineapple"]
def fruits = ["apple", "orange", "pineapple"]/code>
而我使用這個串列的方法是
for (fruit in fruits){
if(fruit=="orange"/span>){
println("A delicious ${fruit}")
}
if(fruit=="pineapple"/span>){
println("Another delicious ${fruit}")
}
if(fruit=="apple"){
println("更美味的${fruit}"})
}
}
這就可以了。但我只是想知道是否有更好的方法來實作相同的結果。
謝謝你的幫助。
uj5u.com熱心網友回復:
通常來說,對于這樣的問題,你會有兩種方法去解決。我在這里用Python作為例子來解釋語法上的區別以及它可能為你產生的結果。
for i in range(len(fruit))。
或者你所使用的那個
for fruit in fruits:
分析位元組碼[Analying the bytecode]
[備用解決方案] 12 0 SETUP_LOOP 40(至43)。
3 LOAD_GLOBAL 0 (范圍)。
6 LOAD_GLOBAL 1 (len)
9 LOAD_FAST 0 ( fruits)
12 CALL_FUNCTION 1(水果
15 CALL_FUNCTION 1
18 GET_ITER
>> 19 FOR_ITER 20 (至42)。
22 STORE_FAST 1 (i)
13 25 LOAD_GLOBAL 2 (print)
28 LOAD_FAST 0 (水果)
31 LOAD_FAST 1 (i)
34 BINARY_SUBSCR
35 Call_FUNCTION 1
38 POP_TOP
39 JUMP_ABSOLUTE19
>> 42 POP_BLOCK
>> 43 LOAD_CONST 0 (無)。
46 RETURN_VALUE
[你的解決方案]
17 0 SETUP_LOOP 24(至27)
3 LOAD_FAST 0 (水果)
6 GET_ITER
>> 7 FOR_ITER 16 (至26)。
10 STORE_FAST 1 (水果)
18 13 LOAD_GLOBAL 0 (列印)
16 LOAD_FAST 1 (水果)
19 CALL_FUNCTION 1 (水果
22 POP_TOP
23 JUMP_ABSOLUTE7
>> 26 POP_BLOCK
>> 27 LOAD_CONST 0 (無)。
30 RETURN_VALUE
這就很清楚地表明,當涉及到回圈本身時,你的解決方案要優化得多。然而,你的代碼塊的問題在于你到處使用 if 陳述句,這意味著每條陳述句都將被評估和檢查,即使回圈已經找到了你正在尋找的值。
更好的方法是使用if-else代替,以進一步使其更加優化。然而,與其使用嵌套的if陳述句,不如用switch陳述句完全取代它們,只要案例的數量足夠多,就可以更快、更干凈。
uj5u.com熱心網友回復:
認為每一個if陳述句都會增加程式的復雜度,最好盡可能地避免它們,同時也要避免開關陳述句,因為開關陳述句更糟糕。
你的代碼很高效,但很難看,因為它不能很好地擴展。如果你修改了串列,那么你也需要修改回圈。使用 groovy 這樣的現代語言,你可以這樣寫(正如已經建議的那樣):
def fruits = [
apple : { "A delicious $it" },
orange : { "Another delicious $it" },
菠蘿 : { "更美味的$it" }, 菠蘿 : { "更美味的$it"action(fruit)。
}
與你的代碼相比,這可能是低效的,因為它涉及到一個地圖,但如果我關心的是速度,我會去找另一種編程語言。
轉載請註明出處,本文鏈接:https://www.uj5u.com/net/327352.html
標籤:
