Range fonksiyonu önündeki yıldız

Merhabalar

print(*range(0,10))

range ’ in önündeki yıldız işareti kullanmak for a bir alternatif fakat buradaki mantık nedir ? Arka planda ki olay nedir ?
Bir de range bir veri tipi midir ?
Vakit ayıranlara şimdiden teşekkürler.

o generatorler ve listeler için bir özellik o range fonksiyonunun içindeki elemanları teker teker parametre olarak fonksiyona gönderiyor

değil…

Yinelenebilir bir verinin önüne * işareti koymak yinelenebilir bir veriyi açmayı sağlar.

Örnek:

a = range(*[1, 10])

Bu yukarıdaki ifade range(1, 10) ifadesiyle aynıdır.

Dolayısıyla siz *range(0, 10) yazdığınızda, bu yinelenebilir veriyi açmış oluyorsunuz.

Arka plandaki olay nedir sorusunun cevabını vermek o kadar da kolay değil.

evet, range bir veri tipidir.

1 Beğeni

hmm bilmiyordum nasıl ya biraz daha anlatabilir misiniz?

range bir sınıf, aynı list veya int gibi.

1 Beğeni

Kendisine ait metotları bulunan bir sınıf işte.

print(type(range(10))) yazdığınızda cevabı alırsınız aslında.

1 Beğeni

Mantık şu;

print(*range(3))

ile bu:

print(0, 1, 2)

eşdeğer.


Bu:

>>> from dis import dis
>>> dis("print(*range(0, 10))")
  1           0 LOAD_NAME                0 (print)
              2 LOAD_NAME                1 (range)
              4 LOAD_CONST               0 (0)
              6 LOAD_CONST               1 (10)
              8 CALL_FUNCTION            2
             10 CALL_FUNCTION_EX         0
             12 RETURN_VALUE

Biraz açıklarsam, 8 sayısının yanındaki CALL_FUNCTION, range fonksiyonunun çağrılmasına karşılık geliyor. Yanındaki 2 de iki tane argüman ile çağırıldığını söylüyor (0 ve 10). Daha sonraki CALL_FUNCTION_EX de print fonksiyonunun çağırılışına karşılık geliyor, aradaki fark stack’de biriktirilen nesneleri ayrı ayrı kullanmak yerine stack’daki son değerin (range fonksiyonunun dönüş değerinin) içeriğini kullanmak.


Evet.

>>> isinstance(range, type)
True

Bu özellik sadece iterable’lar için.

2 Beğeni