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.
– tomasantunes
Perfectly, Tomas. .
– ACGarcia00