SORU
11 Temmuz 2014, Cuma


Neden döngü için bir Python yineleyici ve sıra aynı ismi kullanabilir miyim?

Bu kavramsal bir soru daha. Geçenlerde gördüm bir parça kod Python (işe yaradı 2.7, ve belki de hep vadede 2.5 olarak) for döngü kullanılan aynı adı her iki listede miydi yineledi ve madde listesi, grev benim gibi hem kötü uygulama ve bir şey olmamalı iş.

Örneğin:

x = [1,2,3,4,5]
for x in x:
    print x
print x

Verim:

1
2
3
4
5
5

Şimdi, bana göre mantıklı olan son değeri basılı olurdu son değer atanmış x-döngü, ama ben başarısız olmasına neden olursun kullanabilir aynı değişken adı için iki parça for döngü ve fonksiyon olarak tasarlanmıştır. Farklı kapsamları olan onlar mı? Böyle bir çalışma olanağı sağlar kaputun altında neler oluyor?

CEVAP
11 Temmuz 2014, Cuma


dis bize ne söylüyor:

Python 3.4.1 (default, May 19 2014, 13:10:29)
[GCC 4.2.1 Compatible Apple LLVM 5.1 (clang-503.0.40)] on darwin
Type "help", "copyright", "credits" or "license" for more information.
>>> from dis import dis
>>> dis("""x = [1,2,3,4,5]
... for x in x:
...     print(x)
... print(x)""")

  1           0 LOAD_CONST               0 (1)
              3 LOAD_CONST               1 (2)
              6 LOAD_CONST               2 (3)
              9 LOAD_CONST               3 (4)
             12 LOAD_CONST               4 (5)
             15 BUILD_LIST               5
             18 STORE_NAME               0 (x)

  2          21 SETUP_LOOP              24 (to 48)
             24 LOAD_NAME                0 (x)
             27 GET_ITER
        >>   28 FOR_ITER                16 (to 47)
             31 STORE_NAME               0 (x)

  3          34 LOAD_NAME                1 (print)
             37 LOAD_NAME                0 (x)
             40 CALL_FUNCTION            1 (1 positional, 0 keyword pair)
             43 POP_TOP
             44 JUMP_ABSOLUTE           28
        >>   47 POP_BLOCK

  4     >>   48 LOAD_NAME                1 (print)
             51 LOAD_NAME                0 (x)
             54 CALL_FUNCTION            1 (1 positional, 0 keyword pair)
             57 POP_TOP
             58 LOAD_CONST               5 (None)
             61 RETURN_VALUE

Anahtar parçalarıdır bölüm 2 ve 3 - biz yük değeri x (24 LOAD_NAME 0 (x)) ve sonra onun yineleyici (27 GET_ITER) ve Başlat üzerinden yineleme (28 FOR_ITER). Pythonasla geri yineleyici, tekrar yüklemek için de geçerli.

Kenara:Zaten yineleyici, 16*,* 17 ** aslında bu davranış gerektirir) bu yana herhangi bir anlamda bunu yapmak için iyi olurdu değil mi.

Ne zaman adını x alır üzerine noktada her değerin içini listesi eski ismiyle x Python yok herhangi bir sorun bulmak yineleyici çünkü hiç ihtiyaçlarına bak adı x tekrar için son yineleme protokolü.

Bunu Paylaş:
  • Google+
  • E-Posta
Etiketler:

YORUMLAR

SPONSOR VİDEO

Rastgele Yazarlar

  • androidandme

    androidandme

    10 Mart 2009
  • LounaTutorials

    LounaTutoria

    10 EYLÜL 2009
  • William Sledd

    William Sled

    24 EYLÜL 2006