Проблема с возвратом нескольких фрагментов данных из функции - PullRequest
0 голосов
/ 19 мая 2019

Я пытаюсь создать функцию, которая проверяет каждую строку кода и отсекает все в и после знака фунта в каждой строке, если он присутствует, в противном случае он не изменится. Я пытаюсь вернуть тот же текст, но с каждой строкой нарезать знак фунта.

Проблема в том, что когда я печатаю текст, я вижу результат, но когда я возвращаю его, ничего не происходит.

code_1='''
hello this is a test to remove anything after
 and to get #this letter out 
 def hello_world():        # this is a comment
    print("Hello world!") # this is another comment
print("I # like # pound sign # .")
'''

def remove_octothorpe_and_after(code):
    code_in_lines = code.splitlines()
    for i in code_in_lines:
        if '#' in i:
            index=i.index('#')
            aftertext=i[index:]
            i = i.replace(aftertext,"")
        new_code=("".join(i))
        return new_code

Ответы [ 3 ]

0 голосов
/ 19 мая 2019

Возврат не работает так.Вместо этого используйте список:

def foo():
    bar = []
    for x: 
        bar.append(y)
    return bar

print(foo())

Или конвертируйте в генератор:

def baz():
    for x:
        yield y

foobar = baz()

for result in foobar:
    print(result)
0 голосов
/ 19 мая 2019

Вы возвращаетесь сразу после первой итерации и видите пустой результат, потому что первая строка является пустой строкой, потому что она начинается с:

''' hello this is a test to remove anything after

Если бы вы запустили это так, вы бы увидели только первую строку.

'''hello this is a test to remove anything after

Если вы переместите отступ с возвратом 1 влево, вы увидите только последнюю строку в возврате, поскольку вы будете перезаписывать new_code=("".join(i)) на каждой итерации.

Что вы можете сделать, это создать список в функции для хранения временных результатов, а когда цикл будет завершен, верните "".join(tmp)

Если вы хотите вернуть только первую часть до #, вы можете разделить и вернуть первый элемент с индексом 0 и добавить новую строку, чтобы сохранить отдельные строки.

code_1='''
hello this is a test to remove anything after
 and to get #this letter out 
 def hello_world():        # this is a comment
    print("Hello world!") # this is another comment
print("I # like # pound sign # .")
'''

def remove_octothorpe_and_after(code):
    code_in_lines = code.splitlines()
    tmp = []
    for i in code_in_lines:
        tmp.append(i.split("#")[0] + "\n")
    return "".join(tmp)

print(remove_octothorpe_and_after(code_1))

Результат

hello this is a test to remove anything after
 and to get 
 def hello_world():        
    print("Hello world!") 
print("I

Демо Python

0 голосов
/ 19 мая 2019

Таким образом, после обновления new_code, если вы печатаете, он показывает все строки.Но если вы вернете его пустым, вы, вероятно, не захотите помещать этот оператор возврата в цикл for, как упоминалось ранее.

В моем подходе я сохранил все обновленные строки в списке и присоединился к ним позже.затем в строку возвращается строка.

Поскольку new_code в каждой итерации является другим значением.

def remove_octothorpe_and_after(code):
    code_in_lines = code.splitlines()
    upCode=[]
    for i in code_in_lines:
        new_code=""
        if '#' in i:
            ind=i.index('#')
            aftertext=i[ind:]
            i = i.replace(aftertext,"")
        new_code=("".join(i))
        updatedCode.append(new_code+"\n")
    s = ''.join(updatedCode) 
    return s

print(remove_octothorpe_and_after(code))
...