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

  • 1881 Animation

    1881 Animati

    5 EKİM 2013
  • Majestic Casual

    Majestic Cas

    28 NİSAN 2012
  • Trevor Eckhart

    Trevor Eckha

    19 Aralık 2009