Belirli degerler arasinda donecek (enumvari) veri turu

Selamlar,

Bir gorsellestirme programi yaziyorum ve modullerden birinin dort degisik ciktisi var. Bir tusla bu ciktilar arasinda gezmek istiyorum:

OFF = "off"
LO_RES = "low res"
HI_RES = "high res"
POINTS = "points"
CIKTILAR = [OFF, LO_RES, HI_RES, POINTS]
aktif_cikti = 0

def degistir():
    aktif_cikti = (aktif_cikti + 1) % len(CIKTILAR)

def cikti_ver():
    print("Aktif cikti:", CIKTILAR[aktif_cikti])

Bunu yapmanin daha guzel, belki enum kullanan bir versiyonunu ariyorum. Modul dokumentasyonunu fazla kurcalamadim (aslinda bu soruyu sormak daha cok vaktime mal oluyor ama hic sorum yokmus, bi tane olsun dedim) ama basit bir Enum yarattigimda values, belki ne bileyim next gibi yardimci seyleri goremedim.

Enum gibi calisip kendi degerlerini bilen ve yukaridaki degistir'in yaptigini yapan bir get_next veya set_next fonksiyonu olan bir sinif yazmam mumkun elbet, ama vakit harcamak istemiyorum, testlerini yazasim da yok.

O yuzden kolektif deneyimimize bir danisayim dedim. Sorunu muhtemelen bu mesaji yazdiktan 5 dakika sonra cozmus olacagim, fakat bu fikir alisverisine engel degil.

Bu arada elemanlarin degere sahip olmalari (ÔÇťoffÔÇŁ, ÔÇťlow resÔÇŁ) onemli degil ama isimlere sahip olmalari (OFF, LOW_RES) onemli. Bu isimlere symbolic constant (sembolik/simgesel/temsili sabit) diyoruz ve kodda kullanmayi seviyoruz. (if output == Outputs.LO_RES: ÔÇŽ)

import pygame

OFF = "off"
LO_RES = "low res"
HI_RES = "high res"
POINTS = "points"
CIKTILAR = [OFF, LO_RES, HI_RES, POINTS]
aktif_cikti = 0

width, height = 600, 300
screen = pygame.display.set_mode([width, height])

pygame.init()
myfont = pygame.font.SysFont("monospace", 60)


def degistir():
    global aktif_cikti
    aktif_cikti = (aktif_cikti + 1) % len(CIKTILAR)


def control():
    for event in pygame.event.get():
        if event.type == pygame.KEYDOWN:
            if event.key == pygame.K_e:  # e tu┼čuna bas─▒nca degistir() fonksiyonunu ├ža─č─▒r─▒r.
                degistir()
            elif event.key == pygame.K_q:  # q tu┼čuna bas─▒nca programdan ├ž─▒k─▒┼č yapar.
                quit()


while True:
    screen.fill((0, 0, 0))  # Ekran─▒ siyah renk ile kaplar.
    control()
    text = myfont.render("Text= " + CIKTILAR[aktif_cikti], True, (255, 255, 255))
    screen.blit(text, (0, 0))
    pygame.display.update()

Kodlar─▒ gereksiz yere uzatmada ├╝st├╝me yoktur :ÔÇÖ)

Nas─▒l olmu┼č? (─░simlendirmeler pek uymam─▒┼č olabilir :slight_smile:)

#!/usr/bin/env python3
# -*- coding:UTF-8 -*-

class Switch:
    def __init__(self, options=[]):
        self.options = options
        self.case = 0

    @property
    def current(self):
        return self.options[self.case]

    def change(self):
        if self.case < len(self.options) - 1:
            self.case += 1

        else:
            self.case = 0

    def reset(self):
        self.case = 0

    def __repr__(self):
        return f"{self.__class__.__name__}<({self.current}), {self.options}>"


def main():
    state = Switch(["OFF", "LO_RES", "HI_RES", "POINTS"])

    print(state)
    state.change()
    print(state)
    
    state.reset()

    for _ in range(7):
        print(state.current)
        state.change()


if __name__ == "__main__":
    main()

Cycle kullan─▒labilir belki.

# coding: utf-8
from itertools import cycle
from enum import Enum

class CIKTILAR(Enum):
	OFF = "off"
	LO_RES = "low res"
	HI_RES = "high res"
	POINTS = "points"

ciktilar = cycle(CIKTILAR)

# iki kez t├╝m verilerin ├╝st├╝nden ge├žece─čiz ve 
# StopIteration hatas─▒ almayaca─č─▒z
for i in range(8): 
	print(next(ciktilar))

not: Enum s─▒n─▒f─▒n─▒n niteliklerin tan─▒mlanma s─▒ras─▒n─▒ hat─▒rlamas─▒ Python3.4 ve sonras─▒ i├žin ge├žerlidir.

3 Be─čeni

Peki ni├žin Enum s─▒n─▒f─▒n─▒ kulland─▒n─▒z? ┼×u ┼čekilde de yap─▒lamaz m─▒yd─▒?:

from itertools import cycle

ciktilar = cycle(["OFF", "LO_RES", "HI_RES", "POINTS"])

for i in range(8):
    print(next(ciktilar))

Bilmiyorum, ┼čartlar─▒ en iyi kar┼č─▒layan s─▒n─▒f─▒n Enum s─▒n─▒f─▒ oldu─čunu d├╝┼č├╝nd├╝m. Hem elemanlar─▒n s─▒ras─▒n─▒ tutacak, hem siradaki == Ciktiler.LOW gibi bir yaz─▒ma imkan verecek. ─░kinci durum okuma kolayl─▒─č─▒ sa─čl─▒yor. Mesela liste kullansak

siradaki = next(ciktilar)
if siradaki == liste[0]:
    ...

gibi bir ┼čey yazar─▒z. Ama Enum kullansak

siradaki = next(ciktilar)
if siradaki == Ciktilar.OFF:
    ...  

bir ┼čey yazabiliriz. ─░kincisi daha okunakl─▒.

D├╝z s─▒n─▒f kullansak s─▒n─▒f de─či┼čkenlerine eri┼čebiliriz ama de─či┼čkenlere eri┼čirken gereksiz baz─▒ de─či┼čkenler de listede yer alacak ve temizlemek zorunda kalaca─č─▒z. Enum s─▒n─▒f─▒n─▒ miras alarak ek i┼člem yapmadan sadece ilgili de─či┼čkenler ├╝zerinde iterable yapm─▒┼č olduk. Hem de Sinif.DEGISKEN gibi bir kullan─▒ma sahip olduk.

B├Âyle d├╝┼č├╝n├╝yorum genel olarak yani :slight_smile:

3 Be─čeni