I created an Eternal Object, but I can’t explain why it works

Asked

Viewed 55 times

0

Hello, everybody.

I am solving a list of Python exercises (3.7) and in the first exercise I was asked, in item A), to create a generating function that scans a string for the desired substring and, in item B), to create an iterable object for me to use in the first method.

I was able to make and understand the item A), but in B), although I was able to solve, I don’t understand why my code work properly.

More specifically, my question is why my construction of the eternal is correct and why my loop goes to it works properly, because I am not able to understand how the:

for k in ScanStringPart(StrObj.ObjString, StrObj.ObjSegmento):
    print(k)

works.

From now on, thank you.

#EXERCICIO 1

#ITEM A)

def ScanStringPart(String, Segmento):
    #   Primeiro vamos checar se o que estamos a procurar sequer existe na string.
    if Segmento in String:
        for i in range(0,len(String),len(Segmento)):
            #   Temos que testar se o tamanho do segmento é igual ou maior do que 1.
            #   Se for igual, não podemos usar o caso do "elif String[i + 1 : i + 1 + len(Segmento)] == Segmento:"
            # porque isto produziria redundâncias.
            if len(Segmento) == 1:
                if String[i : i + len(Segmento)] == Segmento:
                    yield(i)
            elif len(Segmento) > 1:
                if String[i : i + len(Segmento)] == Segmento:
                    yield(i)
            #   Este elif serve para os casos onde aparece um número ímpar de caracteres antes do caractere pesquisado.
                elif String[i + 1 : i + 1 + len(Segmento)] == Segmento:
                    yield(i + 1)

"""
Dá pra resolver o Item A) com o método str.find() ou str.index()
"""


#ITEM B)
"""Crie uma classe que define um objeto iterável.                                                                                               -> OK.

Essa classe deve possuir o método construtor e os dois métodos necessários para tornar o objeto iterável (__iter__ e __next__ ).                -> OK.

O método construtor deve possuir como argumentos a string e o segmento e devem ser criados atributos para ambos argumentos recebidos.           -> OK.

Os métodos necessários para a iteração devem respeitar o protocolo de iteração e retornar a posição correta a cada iteração.

(Não se preocupe se aparecer a palavra None em algumas das iterações – é possível resolver sem None, mas não é necessário no exercício.)"""

class IterStrObject(object):
    def __init__(self, String, Segmento):
        self.ObjString = String
        self.ObjSegmento = Segmento

    def __iter__(self):
        self.i = 0
        return self

    def __next__(self):
        if self.i > len(self.ObjString):
            raise StopIteration
        self.i += 1
        return self.i
# TESTES

StrObj = IterStrObject('bbbbbb', 'bbb')

for k in ScanStringPart(StrObj.ObjString, StrObj.ObjSegmento):
    print(k)

# String1 = 'engenharia'
# String2 = 'bbbbbb'
# Segmento1 = 'n'
# Segmento2 = 'en'
# Segmento3 = 'bb'
# ScanStringPart(String1, Segmento1)
# ScanStringPart(String1, Segmento2)
# ScanStringPart(String2, Segmento3)
  • The Scanstringpart() function returns the first index of each segment occurrence in the string at each iteration of the for cycle.

  • Perfectly, Tomas. .

No answers

Browser other questions tagged

You are not signed in. Login or sign up in order to post.