Pomoc w pierwszym programie - prosta baza danych

0

Cześć!
Jestem na początku swojej drogi w byciu programistą i stworzyłem sobie na początek ot taki mały program. Chciałem zapytać, czy polecilibyście mi coś w nim do poprawy oraz poprosić o pomoc przy jednej rzeczy. Mianowicie, gdy użytkownik wpisuje dany index listy, który ma mu się wyświetlić, wyświetla mu się, lecz na odwrót, tzn. dla indexu 0 wyświetla się index 2.

for i in range (3):
    database1 = input("Please give me up to 3 words you want to add into your database: ")
    database = []
    if database == "":
        continue
    database.append(database1)

try:
    question = int(input("Which word do you want to see?: "))
    print(database[question])
except IndexError:
    print("Invalid index! Try again using less number.")```python
2

Pierwsza uwaga to nazywanie zmiennych. Zwróć na to uwagę, bo obecne nazewnictwo jest mylące i mało co mówi o logice programu.

2

@Mrożon: Druga uwaga, spójrz dokładnie na tę linijkę:

database = []

i prześledź w głowie wartość tej zmiennej przy każdym powtórzeniu pętli.

0

@Eldorad O.: Prześledziłem i wyrzuciłem ją poza pętlę, teraz program działa zgodnie z założeniem, dziękuję za pomoc. Czy są może jeszcze jakieś proste funkcjonalności, które mógłbym dodać do tego programu i czy są do niego jeszcze jakieś uwagi? Powtórzę, jestem początkujący i zależy mi na poznaniu dobrych praktyk już na starcie :).

1

@Mrożon: Tak jak wspomniał kolega wyżej, przede wszystkim naucz się nadawać sensowne nazwy zmiennym, bo sam się nie połapiesz w kodzie - nie mówiąc o innych ludziach.

Zamiast:

  • database1 daj np. word, inputed_word czy coś takiego
  • zamiast database daj words_list, input_words_list etc.
  • question zmień na np. word_id

Z uwag to przeanalizuj sobie jeszcze ten kod:

if database == "":
        continue

i zastanów się dlaczego on nie ma żadnego znaczenia.

0

@Eldorad O.: Chciałbym jeszcze zapytać, czy dobrze napisać tutaj except Exception na wypadek jakiegoś błędu oraz czy to będzie dobra praktyka w przyszłych programach?

1

@Mrożon: W tym przypadku użycie wyjątków mija się raczej z celem, poczytaj sobie, ja na pewno tego lepiej nie wyjaśnię:

https://stackoverflow.com/questions/77127/when-to-throw-an-exception

Takie "sytuacje" rozwiązuje się raczej instrukcjami warunkowymi, tzn. w tym przypadku sprawdzasz zawczasu czy index nie wykracza poza rozmiar listy:

if index >= len(list):
   ...
else:
   ...
0

Cześć!
Rozszerzyłem co nieco mój program, teraz wygląda on tak:

import os
import sys

word_list = []

while True:
    try:
        word_amount = int(input('Please type how many words you want to add: '))
        if word_amount == int(word_amount):
            break
        else:
            pass
    except ValueError:
        print('This is not a number! Try again!')

for i in range(word_amount):
    word = input("Please give me words you want to add: ")
    word_list.append(word)

print("These are your words: {} ".format(word_list))

while True:
    try:
        word_id = int(input("Which word do you want to see?: "))
        if word_id <= len(word_list):
            print(word_list[word_id])
            break
        else:
            pass
    except ValueError:
        print('This is not a number! Try again!')

while True:
    file_creation = input('Do you want to create a file containing you words? or a directory (yes/no): ').lower()

    if file_creation == 'yes':
        decision = input('Do you want to create a file or a directory?: ')
        if decision == 'file':
            text = str(word_list)
            with open('C:\\Users\\USER\\Desktop\\test.txt', 'w') as file:
                file.write(text)
                name = input('How do you want to name your file?: ')
                os.rename('C:\\Users\\USER\\Desktop\\test.txt', 'C:\\Users\\USER\\Desktop\\' + name)
                break
        elif decision == 'directory':
            os.mkdir('C:\\Users\\USER\\Desktop\\Justfolder')
            name = input('How do you want to name your directory?: ')
            os.rename('C:\\Users\\USER\\Desktop\\Justfolder', 'C:\\Users\\USER\\Desktop\\' + name)
            break
    elif file_creation == 'no':
        print('Bye!')
        sys.exit(0)
    else:
        print('This is not a proper word!')
        pass
2

@Mrożon:

Tutaj masz trochę masło maślane:

word_amount = int(input('Please type how many words you want to add: '))
        if word_amount == int(word_amount):
            break

ostatecznie robisz coś takiego:

if int(word_amount) == int(int(word_amount)):
   ...

Jeżeli ktoś poda id równe wielkości listy, to pójdzie wyjątek:

if word_id <= len(word_list):
            print(word_list[word_id])
            break

Jak korzystasz ze ścieżek to używaj funkcji os.path.join, ona automatycznie dostosuje się do OS na którym odpalasz program i nie będziesz musiał się bawić w jakieś slashe czy backslashe.

1

Pracujesz cały czas na ścieżce "C:\Users\USER\Desktop\", aż prosi się o zmienną.
Dziwny flow z tym zapisem: 1. zapisz plik 2. zapytaj o nazwę 3. zmień nazwę ... powinno być 1. zapytaj o nazwę 2. zapisz plik ... i tyle :)
Nie rozumiem za bardzo też tego z tworzeniem folderu, tzn. po co to, zresztą nie wnikam :)
Nie wiem czy już o tym myślisz, ale jeśli nie to pomyśl o rozbudowanie programu o odczytywanie, wyświetlanie, dopisywanie danych, ewentualnie również ich edycje i wybiórcze usuwanie. To nie jest tak trudne jak się wydaje. Jak wszystko przećwiczysz to możesz się nawet pokusić o program do nauki słówek języka obcego z funkcją jakiegoś odpytywania (program wyświetla słowo po polsku, pyta użytkownika o angielskie lub na odwrót) :)

0

@Arthan: Z tą zmienną i z tym zapisem to po prostu błędy początkującego, nie mam jeszcze wprawy, aby to sprawnie napisać i czasami się gdzieś zamotam. To tworzenie folderu to takie bardziej dla praktyki, żeby sobie coś przećwiczyć i żeby to działało :). Dziękuję za porady, co można z tym dalej zrobić, zajmę się tym w najbliższym czasie. :)

0

@Eldorad O.: Z tym masłem maślanym od początku źle o tym pomyślałem i w innym zapisie nie chciał mi program działać, tak jak powinien, teraz wygląda to tak:

while True:
    try:
        word_amount = int(input('Please type how many words you want to add: '))
        break
    except ValueError:
        print('This is not a number! Try again!')

Co do os.path.join, jeszcze nie bardzo rozumiem jak to działa i jak to użyć :)

1 użytkowników online, w tym zalogowanych: 0, gości: 1