функция нижнего регистра не работает в другой функции

#python

#python

Вопрос:

Пожалуйста, потерпите меня, я новичок в Python.

Первая функция, которую я написал, заключалась в том, чтобы вводить в нижний регистр любые символы верхнего регистра в строке, которая прошла через нее, которая работает сама по себе, игнорируя любые не прописные алфавитные символы ASCII.

Однако, когда я пытаюсь использовать ее в своей второй функции (которая ДОЛЖНА использовать функцию нижнего регистра для любых пользовательских вводов, а затем вставлять ее в файл) У меня остался файл, содержащий строку, которая изначально была передана без какой-либо функции нижнего регистра.

 import os.path
from os import path


def lowercaser(text):
    text = [ord(c) for c in text]
    length = len(text)

    i = 0
    while length != i:
        if 65 <= text[i] <= 90:
            text[i] = text[i]   32
        i  = 1

    text = [chr(c) for c in text]
    text = "".join(text)


def does_rfid_list_exist():
    if path.exists("rfidList.txt"):
        print("File found!")

    else:
        print("File was not located! Creating new file.n")
        f = open("rfidList.txt", "a ")
        user_input = input("Please enter your name!n")
        lowercaser(user_input)
        f.write(user_input)
        f.close()


does_rfid_list_exist()

 

Я понятия не имею, почему они не работают вместе, и я разбил ее, насколько смог. Есть идеи?

Комментарии:

1. код выглядит необычно, единственная проблема, которую я вижу, заключается в том, что, хотя вы вызываете функцию, которую вы не обновляете user_input , text также возвращаете функцию из нижнего регистра user_input = lowercaser(user_input) , попробуйте использовать это

2. ознакомьтесь со строковыми методами в документах Python. Вы можете найти там интересующий вас метод.

Ответ №1:

Похоже, вы ожидаете этого вызова:

 lowercaser(user_input)
 

чтобы изменить значение user_input . Он этого не сделает. Причина в том, что строковые значения неизменяемы, что означает, что каждый раз, когда вы «меняете» строку, вы создаете новую. Исходный объект string не затрагивается. Таким образом, в этом случае переменная user_input указывает на определенную строку при вызове lowercaser . Как только эта функция вернется, user_input она все равно будет указывать на ту же строку. Будет существовать какая-то другая строка, которая будет результатом обработки, выполненной функцией.

Обычно это работает так, что lowercaser функция возвращает новую строку в качестве возвращаемого значения функции, например:

 user_input = lowercaser(user_input)
 

Таким образом, вы указываете user_input на новую строку, строку, которая lowercaser была создана для вас. Но чтобы заставить это работать, вы должны исправить свою lowercaser функцию, чтобы вернуть ее результат. Поэтому вам также нужно добавить return text в качестве последней строки вашей lowercaser функции.

Ответ №2:

Сначала вам нужно научиться определять функцию. Вы можете изучить это в w3school или в любом другом источнике или книге.

Я публикую решение здесь, но оно не будет продуктивным для вас.

Поместите

 return text
 

в последней строке функции. И поместите

 user_input=lowercaser(user_input)
 

вместо

 lowercaser(user_input)
 

Ответ №3:

код выглядит необычно, единственная проблема, которую я вижу, заключается в том, что даже при вызове функции вы не обновляете user_input

user_input = lowercaser(user_input)

Помимо этого, возвращает текст из функции нижнего регистра return text

 import os.path
from os import path


def lowercaser(text):
    text = [ord(c) for c in text]
    length = len(text)

    i = 0
    while length != i:
        if 65 <= text[i] <= 90:
            text[i] = text[i]   32
        i  = 1

    text = [chr(c) for c in text]
    text = "".join(text)
    return text #### Change - 1


def does_rfid_list_exist():
    if path.exists("rfidList.txt"):
        print("File found!")

    else:
        print("File was not located! Creating new file.n")
        f = open("rfidList.txt", "a ")
        user_input = input("Please enter your name!n")
        user_input = lowercaser(user_input) #### Change - 2
        f.write(user_input)
        f.close()


does_rfid_list_exist()
 

Использование lower() на user_input

 import os.path
from os import path


def lowercaser(text):
    text = [ord(c) for c in text]
    length = len(text)

    i = 0
    while length != i:
        if 65 <= text[i] <= 90:
            text[i] = text[i]   32
        i  = 1

    text = [chr(c) for c in text]
    text = "".join(text)
    return text #### Change - 1


def does_rfid_list_exist():
    if path.exists("rfidList.txt"):
        print("File found!")

    else:
        print("File was not located! Creating new file.n")
        f = open("rfidList.txt", "a ")
        user_input = input("Please enter your name!n")
        user_input = user_input.lower() ### Change - 2
        f.write(user_input)
        f.close()


does_rfid_list_exist()
 

Комментарии:

1. вы также можете использовать lower() функцию изначально, а также на user_input

Ответ №4:

Братан, нет оператора return, и даже если бы он был, переменная нигде не сохраняется. Это означает, что текст (локальная переменная, доступ к которой возможен только внутри функции, из которой она исходит), недоступен, передается или сохраняется в функции does_rfid_list_exist() . Другая проблема заключается в том, что user_input , который, по-видимому, является данными, которыми вы пытаетесь манипулировать, не изменяется после функции lowercaser(), потому что ничего не возвращается, и данные ни в чем не хранятся. Что я хотел бы сделать, чтобы исправить это

Чтобы сделать так, чтобы user_input

верните текст после text = «».join(текст) и замените строчный регистр (user_input) на user_input = строчный регистр (user_input)

Я думаю, вы запутались и подумали, что user_input — это какой-то общедоступный класс.