我想列印每個數字和索引:
nums = [3,2,1,5,6,4]
#1st code:
for i in range(len(nums)):
print(i,nums[i])
#2nd code:
length = len(nums)
for i in range(length):
print(i,nums[i])
在這兩種代碼中,哪一種是有效的還是相同的?
uj5u.com熱心網友回復:
最好的方法是使用enumerate函式:
nums = [3, 2, 1, 5, 6, 4]
for index, number in enumerate(nums):
print(index, number)
uj5u.com熱心網友回復:
除了第二個選項還將長度存盤在單獨的變數中這一事實外,這兩個示例都將產生相同的位元組碼。因此,兩者實際上是相同的,并且使用一個而不是另一個不會有明顯的影響。
這樣做的原因是順便說一句。迭代目標,即range(len(nums))orrange(length)僅在回圈開始時執行一次。因此該代碼永遠不會運行多次,因此您是在 for 回圈語法之外還是在內部執行該代碼都沒有關系。
uj5u.com熱心網友回復:
根據CPython language reference,它只計算一次(強調我的):
for 陳述句用于迭代序列(例如字串、元組或串列)或其他可迭代物件的元素:
for_stmt ::= "for" target_list "in" expression_list ":"suite ["else" ":"suite]
運算式串列被評估一次;它應該產生一個可迭代的物件。為 expression_list 的結果創建迭代器。
uj5u.com熱心網友回復:
你可以自己拆解比較:
nums = [3,2,1,5,6,4]
# 1st code:
def f1():
for i in range(len(nums)):
pass # print(i,nums[i])
#2nd code:
def f2():
length = len(nums)
for i in range(length):
pass # print(i,nums[i])
import dis
dis.dis(f1)
dis.dis(f1)
并看到:
# f1 -----
5 0 LOAD_GLOBAL 0 (range)
2 LOAD_GLOBAL 1 (len)
4 LOAD_GLOBAL 2 (nums)
6 CALL_FUNCTION 1
8 CALL_FUNCTION 1
10 GET_ITER
>> 12 FOR_ITER 2 (to 18)
14 STORE_FAST 0 (i)
6 16 JUMP_ABSOLUTE 6 (to 12)
相對
# f2 -----
5 >> 18 LOAD_CONST 0 (None) # storing len
20 RETURN_VALUE # in variable
5 0 LOAD_GLOBAL 0 (range)
2 LOAD_GLOBAL 1 (len)
4 LOAD_GLOBAL 2 (nums)
6 CALL_FUNCTION 1
8 CALL_FUNCTION 1
10 GET_ITER
>> 12 FOR_ITER 2 (to 18)
14 STORE_FAST 0 (i)
6 16 JUMP_ABSOLUTE 6 (to 12)
5 >> 18 LOAD_CONST 0 (None)
20 RETURN_VALUE
相同(只有 len 在變數中的存盤不同)。為了便于演示,我對印刷進行了評論——兩者都是一樣的。因此f2,除了存盤的內容之外,還將 len 存盤在 const 中f1- 因此沒有明顯的時間影響 - 并且不會len(nums)多次重新評估。
轉載請註明出處,本文鏈接:https://www.uj5u.com/qukuanlian/376195.html
上一篇:如何將此矩陣轉換為整數串列?
