Optymilizacja kodu, przerobienie kodu na funkcje

1

Za każdym razem kiedy używasz break, na świecie umiera jakiś kotek. Break to jest synonim goto. Każdego breaka jesteś w stanie zastąpić kodem gdzie tego breaka nie ma.

Tutaj przykład:

def randomek():
    wylosowana = random.randint(1,30)
    print('  Wylosowana liczba to: ', wylosowana)
    while zapytaj_o_wybor() is not wylosowana:
        print('Nie zgadłes, próbuj dalej!')
    print('Zgadles! Koniec gry.')

W funkcji zapytaj_o_wybor() możesz usunąć break i w jego miejsce wstawić linijkę z samego końca funkcji: return wybor_liczby. Skoro chcesz wyskoczyć z pętli nieskończonej to najprostszym wyjściem jest po prostu zwrócenie wartości. Wtedy kończysz działanie pętli.

0

@Shalom: Funkcja randomek nie zna takiej zmiennej jak wynik, musisz ją do tej funkcji przekazać.

Błędów nie mam , jesli chodzi o tą zmienną wynik. W jaki sposób ją mogę ewentualnie " przekazać" do funkcji. X odwołuję do funkcji wynik czyli def (gra). I tego nie mogę tu zrozumieć do konca, ze mam blad....

0

moderator @stivens @Shalom: Udało mi się "przekazać wynik do funkcji randomek... O to chodziło ???? Program prawie chodzi , tak jakbym chciał, tylko nie konczy mi programu po zgadnięciu liczby , pętli się dalej o podanie liczby.... Zaraz idę do pracy, więc na tym się skupię pózniej. I tu mam Panowie pytanie, czy program w tej funkcji może być ??, i tak może to wyglądać w miarę dodbrze? Co do dalszej modyfikacji programu według @stivens , popracuję nad tym, dla samego zrozumienie działania kodu :) I jak tworzę na moim przykładzie ten program losujący liczby , to bez funkcji , jest to program krótki i chodzi bez zarzutu. Ostatnie pytanie: Czy warto wszystkie swoje programy robić w funkcjach , bo kod czytalniejszy jest itp...? Jeszcze raz dzięki za podpowiedzi :)

import random

def gra():
    while True:
        try:
            wybor_liczby = int(input(f'Podaj liczbę z zakresu od 1 do 30: '))
            if wybor_liczby > 3 or wybor_liczby < 1:
              raise ValueError
            break
        except ValueError:
            print('Błąd wpisywania wartosci, wpisz poprawną wartosc liczbową!')
    return wybor_liczby

def randomek(wynik):
    losowanie = random.randint(1,3)
    print('  Wylosowana liczba to: ', losowanie)   
    #for x in wynik: # w "x in wynik" - mam error ('int' object is not iterable), po wyszukaniu rozwiązania w sieci: range(wynik)
    while True:
        if wynik == losowanie:
            print('Zgadles.Koniec gry')
            break
        else:
            print('Nie zgadłes, próbuj dalej!')
        return losowanie   

while True:
    wynik = gra()
    randomek(wynik)
0

Znowu popsules :P

2

Normalnie to bym powiedział, że tak, warto zawsze dzielić na funkcje, ale patrząc na Twoje funkcje zaczynam w to wątpić (bez urazy).
Jest 28 linii kodu, a do co drugiej linijki można by się o coś przyczepić.
Jeśli chcesz zatrzymać program w dowolnym momencie to możesz zrobić: import sys, a potem tam gdzie chcesz zakończyć program: sys.exit()
ale to jest duże pójście na skróty, ja bym tu wszystko pozmieniał.

from random import randint

def pobierz_liczbe(min, max):
    liczba = None
    while liczba == None:
        text = input(f'Podaj liczbę z zakresu od {min} do {max}: ')
        try:
            liczba = int(text)
            if not (min <= liczba <= max):
                print('Liczba po za zakresem!')
                liczba = None
        except:
            print('Błąd wpisywania wartości, wpisz poprawną wartość liczbową!')
    return liczba

def losuj_liczbe(min, max):
    liczba = randint(min, max)
    print('  Wylosowana liczba to: ', liczba)   
    return liczba

def sprawdz_czy_wygrana(liczba1, liczba2):
    if liczba1 == liczba2:
        print('Zgadłeś. Koniec gry.')
        return True
    else:
        print('Nie zgadłeś, próbuj dalej!')
        return False

gramy = True
while gramy:
    liczba_uzytkownika = pobierz_liczbe(1, 3)
    liczba_wylosowana = losuj_liczbe(1, 3)
    gramy = not sprawdz_czy_wygrana(liczba_uzytkownika, liczba_wylosowana)

Druga wersja gry, zgadywanie liczby z zakresu do 30stu ... nie wymagało wielu zmian, a funkcje umożliwiają również zagranie w pierwszą wersję gry, więc jeśli chcemy to możemy np. umieścić w programie obie wersje do wyboru:

from random import randint

def pobierz_liczbe(min, max):
    liczba = None
    while liczba == None:
        text = input(f'Podaj liczbę z zakresu od {min} do {max}: ')
        try:
            liczba = int(text)
            if not (min <= liczba <= max):
                print('Liczba poza zakresem!')
                liczba = None
        except:
            print('Błąd wpisywania wartości, wpisz poprawną wartość liczbową!')
    return liczba

def losuj_liczbe(min, max, pokaz=True):
    liczba = randint(min, max)
    if pokaz:
        print('  Wylosowana liczba to: ', liczba)   
    return liczba

def sprawdz_czy_wygrana(liczba1, liczba2, podpowiedz=False):
    if liczba1 == liczba2:
        print('Zgadłeś. Koniec gry.')
        return True
    else:
        if podpowiedz:
            if liczba1 < liczba2:
                print('Podałeś zbyt małą liczbę!')
            elif liczba1 > liczba2:
                print('Twoja liczba jest zbyt duża!')
        else:
            print('Nie zgadłeś, próbuj dalej!')
        return False

liczba_wylosowana = losuj_liczbe(1, 30, pokaz=False)
gramy = True
while gramy:
    liczba_uzytkownika = pobierz_liczbe(1, 30)
    gramy = not sprawdz_czy_wygrana(liczba_uzytkownika, liczba_wylosowana, podpowiedz=True)
0

@Arthan: Urazy nie mam :) Pewnie się śmiejecie z moich prób pisania kodu. :) Ale jakoś trzeba zacząć to próbować powoli rozumieć :) Ciężko mi idzie, ale grunt to nie poddawać się.

gramy = not sprawdz_czy_wygrana(liczba_uzytkownika, liczba_wylosowana, podpowiedz=True)

Tu nie rozumiem tego , mógłbyś mi to w skrócie objaśnić :)

def sprawdz_czy_wygrana(liczba1, liczba2):

Argumenty we funkcji: liczba1, liczba2 nie mają odwołania do innych funkcji w tym kodzie, a działają, jeśli chodzi o if. Nie rozumiem tego trochę :) Mam nadzieję, że wiesz o co mi chodzi.
Co do mojego kodu, to wiem że można się przyczepić do samego kodu, ale przecież program chodzi , wywołuje się... Co do sys.exit dzieki za info :)

0

@stivens: Popsułem kod , ale kod działa jak chciałem :)Ale obiecuję sobie , że poprawię swoje kody (funkcje) . Zeby wilk i owca była syta.

0

Ktos z tego forum kiedys zrobil jakas serie poradnikow do Pythona:


(niestety nie pamietam nicku z forum)

Nie wiem na ile to bedzie dla Ciebie przydatne ale mozesz sobie obejrzec.

0

Oglądnę również. Przed chwilą skończyłem oglądać : https://www.bing.com/videos/search?q=argumenty+w+funkcji+python&docid=608040053535477455&mid=7C1EE39A46349CEEBDA17C1EE39A46349CEEBDA1&view=detail&FORM=VIRE, wcześniej oglądałem krótkie filmiki z całosci z pythona tak losowo. Powoli zaczynam dostrzegać swoje błędy w kodzie,, jeśli chodzi o funkcje. Na razie na funkchach się skupię, mam nadzieję, ze kody mi wyjdą bardzie przejrzyste. :)

0

@Arthan: Pytania miałem , co do twojej pierwszej wersji kodu, ale nie odpowiedziałeś . Wyżej zapytanie dałem do dwóch linijek kodu z pierwszej twojej wersji. .... I przy okazji , dla celów testowych stworzyłem sobie prościutki programik bez funkcji. Programik chodzi bez zarzutu

#imie bez funkcji
aktualny_rok = 2021
imie = input('podaj imie:')
rok_urodzenia = input ('Podaj rok urodzenia: ')
wiek = int(aktualny_rok) - int(rok_urodzenia)
print(f' {imie} masz lat: ',wiek)

I drugi ale z funkcjami poniżej


#imie w funkcji
aktualny_rok = 2021
def dane(imie = None):
    imie = input(f'podaj imie:')
    return imie

def obliczenie(rok_urodzenia = None, wiek = 0):
    rok_urodzenia = input ('Podaj rok urodzenia: ')
    wiek = int(aktualny_rok) - int(rok_urodzenia)
   ** for x in dane():
        print('f {x} masz lat: ',wiek)**
    return rok_urodzenia,wiek
    
dane()
obliczenie()

Co zrobiłem zle w tym kodzie, czego nie dodałem, o podpowiedzi bym prosił . I czy sam kod we funkcjach jest poprawnie napisany (def dane, def obliczenie)? Dokładnie chodzi mi o linijki: for x in dane()
Chodzi mi dokładnie o wywołanie dokładnie tego samego jak w kodzie bez funkcji:

podaj imie:Wojtek
Podaj rok urodzenia: 2011
 Wojtek masz lat:  10

Ostatnie pytanie, co sądzicie o nauce videokursach z zadaniami typu Udemy itp.... Warto?, czy po prostu z netu sciagać informacje itp...?

0

def dane(imie = None):

A po co ten parametr?

imie = input(f'podaj imie:')

Po co interpolowany string? Wiesz co robi to f? :P

obliczenie(rok_urodzenia = None, wiek = 0)

Znowu to co w punkcie 1. Po co to robisz?

int(aktualny_rok)

Przeciez aktualny rok to jest juz liczba.

for x in dane():

Ale w zasadzie to wtf? Nie rozumiem co chcialbys tym osiagnac.

print('f {x} masz lat: ',wiek)

print(f'{imie} masz lat: {wiek} ')

return rok_urodzenia,wiek

Czemu chcesz cokolwiek zwracac z tej funkcji jak juz to wyprintowales?

dane()

I co sie z tymi danymi ma stac? Bo teraz to laduja w pustce :)

0

@stivens podlinkował Ci filmiki wyjaśniające, więc jak je obejrzałeś to raczej powinieneś wiedzieć co i jak, ale jeszcze dopiszę na tym przykładzie ...
Funkcja działa tak, że jak ją definiujesz np.:

def sprawdz_czy_wygrana(liczba1, liczba2):

To mówisz: Słuchaj Python, tutaj masz nową funkcję, która nazywa się "sprawdz_czy_wygrana", musi być wywoływana z dwoma argumentami, pierwszy z nich będziesz widział wewnątrz funkcji jako liczba1, a drugi jako liczba2. Jak ta funkcja jest wywoływana to Python te zmienne sobie odpowiednio przypisuje.

Te Twoje funkcje są pisane w bardzo chaotyczny sposób, brakuje im planu. Funkcja to taka mała czarna skrzyneczka, którą gdy potrząsasz (wywołujesz) to coś robi. Możesz do niej najpierw coś wrzucić (argumenty) by to coś "przemieliła", skrzyneczka może też coś "wypluwać" (poprzez return). U Ciebie tradycyjnie wszystko jest pomieszane.

def dane(imie = None):
    imie = input(f'podaj imie:')
    return imie

Nazwa tradycyjnie nic nie mówi o czynności, którą ma wykonać funkcja, "danymi" może być wszystko. Funkcja opcjonalnie oczekuje argumentu "imie", z tym że jak podasz przy wywoływaniu funkcji to imię, to i tak zaraz pobierze nową wartość dla niej poprzez input, więc jest to zbędny parametr. "f" przed stringiem dajemy gdy chcemy w tekście umieścić jakieś wartości zmiennych. Zwraca imię, to jest ok.

def obliczenie(rok_urodzenia = None, wiek = 0):
    rok_urodzenia = input ('Podaj rok urodzenia: ')
    wiek = int(aktualny_rok) - int(rok_urodzenia)
    for x in dane():
        print('f {x} masz lat: ',wiek)
    return rok_urodzenia,wiek

Podobnie jak w przypadku "dane", wrzucasz i wyrzucasz z tej funkcji co popadnie. Rok urodzenia chcesz pobierać od użytkownika wewnątrz funkcji i obliczać w niej wiek? To usuń te parametry wejściowe. Chcesz tam wyświetlać wiek i imię osoby, wiek obliczysz, a imię jest Ci potrzebne z "zewnątrz" i to właśnie imię musisz sobie przekazać do niej poprzez argument funkcji. Pętla for... nie mam bladego pojęcia czemu ma służyć, wywalić. "f" w print daje się przed apostrofem/cudzysłowem, "x"... to właśnie powinna być nazwa argumentu funkcji, którego Ci brakuje. Funkcja zwraca rok_urodzenia i wiek i nic dalej z tym nie robisz, ale to już jak chcesz, nikt Ci nie zabroni ;)

0

Witam ponownie :) Oglądnąłem filmiki o funkcjach, albo nie rozumiem tych funkcji do konca, albo....
Poprawiłem kod:

aktualny_rok = 2021
def dane():
    imie = input('podaj imie:')
    return imie

def obliczenie( x = dane):
    rok_urodzenia = input ('Podaj rok urodzenia: ')
    wiek = aktualny_rok - int(rok_urodzenia)
    print(f'{x} masz lat: {wiek} ')

dane()
obliczenie()

Wyjaśnie po swojemu, jak rozumuję "przekazania "imie" poprzez argument funkcji. W funkcji def obliczenie(x=dane) wyciągam z zewnątrz z funkcji dane() - imię (imię= input('podaj imie').... I powinno działać, ale nie działa .Czy w tym wypadku idę w "miarę" dobrym tokiem myślenia? Bez błędów jest kod. Albo zle rozumiem,pojmuję funkcje, mimo spędzenia trochę czasu na oglądnięciu filmów o funkcjach.

1

Przekazywanie argumentu nastepuje w miejscu wywolania. Ty probujesz to zrobic w miejscu deklaracji.

Teoretycznie zadziala jesli dasz def obliczenie(imie = dane()):, ale to co chcesz zrobic to obliczenie(dane()).

PS: to nie jest zaden x a imie!

1

Dopowiem tylko, że Twój tok rozumowania nie jest zły, ale musisz znać różnicę między "dane", a "dane()". Funkcję wywołasz i zwrócisz jej wynik tylko gdy użyjesz nawiasu. Ty napisałeś w swoim kodzie, że dla funkcji "obliczenia", "x" to teraz funkcja "dane", możesz sobie w niej wywołać "x()" i odpali Ci się funkcja "dane". Nawet przy wyświetlaniu wyniku Twojego kodu program pokazuje, że x to funkcja.

0

Że z tymi nawiasami przy dane() w przekazaniu argumentu, nie wpadłem wcześniej !!!, coś umysł mi szwankuje.
Teraz jest git:)


aktualny_rok = 2021
def dane():
    imie = input('podaj imie:')
    return imie

def obliczenie( imie =dane()):
    rok_urodzenia = input ('Podaj rok urodzenia: ')
    wiek = aktualny_rok - int(rok_urodzenia)
    print(f'{imie} masz lat: {wiek} ')

obliczenie()
aktualny_rok = 2021
def dane():
    imie = input('podaj imie:')
    return imie

def obliczenie(a):
    rok_urodzenia = input ('Podaj rok urodzenia: ')
    wiek = aktualny_rok - int(rok_urodzenia)
    print(f'{a} masz lat: {wiek} ')

obliczenie(a=dane())

W miejsce imię ,też mogę stawić zmienna x = dane() i printowac x..., ale jeśli robię imieniem to bardziej wiadomo o co chodzi w tym kodzie. Tak z ciekawości , czy w inny sposób można przesłać argumenty.... Jeszcze raz dzięki za pomoc. . Idzie mi cholernie wolno niestety.... Cóż starość nie radosć :) Panowie czy warto wykupić jakieś kursy pythone od podstaw jako wideokursy typu udemy itp....? Może macie jakieś kursy warte do polecenia ?

2
import datetime

def pobierz_imie():
    return input('podaj imie: ')

def pobierz_rok_urodzenia():
    return int(input('podaj rok urodzenia: '))

def policz_ile_lat(rok_urodzenia, aktualny_rok):
    return aktualny_rok - rok_urodzenia

def odpowiedz_uzytkownikowi(imie, wiek):
    print(f'Czesc {imie}! Masz {wiek} lat.')

while True:
    imie = pobierz_imie()
    rok_urodzenia = pobierz_rok_urodzenia()
    aktualny_rok = datetime.datetime.now().year
    wiek = policz_ile_lat(rok_urodzenia, aktualny_rok)
    odpowiedz_uzytkownikowi(imie, wiek)

Oczywiscie to troche przesada i te funkcje maja po 1 linijce, ale to dlatego ze ten program wiele nie robi :P

Zwroc uwage na nazewnictwo funkcji. To nie jest jakies x czy dane a jasne okreslenie co funkcja robi. Najlepiej zeby bylo po angielsku, ale powiedzmy, ze to akurat nie ma teraz znaczenia.

0

Witam panowie ;) Napisałem kod, taki mini kalkulator co liczy dwie podane liczby. Można zastosować dodawanie, odejmowanie, mnozenie, dzielenie. Wcześniej tu taki programik dałem , ale teraz przerobiłem go bardziej i na funkcje. I tu mam pytanie, jak oceniacie ten kod pod względem samego kodu? Uwagi mile widziane, nawet negatywne :). Mam nadzieję, że już trochę te funkcje opanowałem :) Mogłem go bardziej rozbudować, ale własnoręcznie udało mi się tyle zdziałać samemu. Nie sztuką jest sciągać gotowca i dawac na forum....

reset = 't'
wybor = ['+', '-', '*', '/']

def wybory_menu():
    while True:
        for i in wybor:
            wyborek = input ("Podaj wybór działania matematycznego: '+' '-' '*' '/' "  +str(i)+ ': '  )
            if wyborek not in wybor :
                print('Nic nie wpisałeś lub podałeś nieprawidłowe dzialanie matematyczne! - Podaj prawidłowe dane! ')
                return wybory_menu
            else:
                return wyborek
            
        
def gra(gracze):
   
    while True: 
        try:
            podaj = int(input(f' Wybierz dwie liczby, które możesz dodać, odjąć, pomnożyć, lub podzielić: \n Podaj {gracze} ')) 
            break
        except ValueError:
            print('Blad wpisywania wartosi! Podaj wartość liczbową: ')
    return podaj
            
def dodawanie(liczba1,liczba2):
    
    return int(liczba1) + int(liczba2)

def odejmowanie(liczba1,liczba2):
    return int(liczba1) - int(liczba2)    

def mnozenie(liczba1,liczba2):
    return int(liczba1) * int(liczba2)

def dzielenie(liczba1,liczba2):
    return int(liczba1) / int(liczba2)

#gracze
liczba1 = gra('liczbę pierwszą: ')
liczba2 = gra('liczbę drugą: ')

#wybory
while reset == 't':
    wyborek = wybory_menu()
    if wyborek == '+':
        suma = dodawanie(liczba1,liczba2)
        print("Suma wynosi: " +str(liczba1)+ '+' +str(liczba2)+  '='   , suma)
    if wyborek == '-':
        roznica = odejmowanie(liczba1,liczba2)
        print('Odejmowanie wynosi : '+str(liczba1)+ '-' +str(liczba2)+  '='  , roznica)
    if wyborek == '*':
        iloczyn = mnozenie(liczba1,liczba2)
        print('Mnozenie wynosi : '+str(liczba1)+ '*' +str(liczba2)+  '='   , iloczyn)
    if wyborek == '/':
        iloraz = dzielenie(liczba1,liczba2)
        print('Dzielenie wynosi : '+str(liczba1)+ '/' +str(liczba2)+  '='   , iloraz)

    reset = input('Liczysz dalej: t/n: ')   
    if reset == 'n':
        print('Zakonczyłes liczenie')
        break
    













0

def wybory_menu():
    while True:
        for i in wybor:
            wyborek = input ("Podaj wybór działania matematycznego: '+' '-' '*' '/' "  +str(i)+ ': '  )
            if wyborek not in wybor :
                print('Nic nie wpisałeś lub podałeś nieprawidłowe dzialanie matematyczne! - Podaj prawidłowe dane! ')
                return wybory_menu
            else:
                return wyborek

To jest jeden wielki WTF. Mam teraz dla Ciebie takie zadanie: napisz nam tutaj na forum, w jezyku naturalnym, co robi kazda linijka Twojego programu i wyjasnij dlaczego to robi, co chciales tym osiagnac. Np. while true: # petla nieskonczona poniewaz ABCDEFG....

0

@stivens: Wklejam, to co robi według mnie każda linijka kodu . Co do pętli while True, ona jest tu nie potrzebna moim zdaniem. Mój bład . Staram się przechodzić na "myślenie programistyczne" , ale idzie mi jto ak idzie... Może z czasem będzie lepiej. Kod działa, waliduje to co chcę.

def wybory_menu():
    #while True:     # Tu pętla nieskonczona , nie jest potrzebna,mój bład. Pętlę while mam na dole pod wyborami.
        for i in wybor:     # pokazuje mi listę jedną pod drugą, bez nawiasów,przecinków  itp...
            wyborek = input ("Podaj wybór działania matematycznego: '+' '-' '*' '/' "  +str(i)+ ': '  )     # używam funkcji input do wprowadzenia zmiennych przez uzytkownika,  jak zrobię +str(wybor)+ to pokazuje mi w inpucie: [ '+','-','*' itp..]
            if wyborek not in wybor :#    jesli są wprowadzone inne działania niż wymienione w liście, to jest informacja jak niżej
                print('Nic nie wpisałeś lub podałeś nieprawidłowe dzialanie matematyczne! - Podaj prawidłowe dane! ')
                return wybory_menu #     po nie wpisaniu  lub błednym, innym wpisaniu działania mat. zwraca, wychodzi z wyjścia bloku ( do funkcji wybor_menu)
            else:
                return wyborek      # W przeciwnym razie wraca do bloku "wyborek"
0

Dobrze. Skoro zauwazyles, ze while true jest zbedne to teraz zauwaz, ze for i in wybor tez absolutnie nic nie robi. Zawsze robisz return co przerywa petle.

PS: Tam nie mialo byc return wybory_menu()?

0

@stivens: Jeśli chodzi o pętlę for i in wybór, to chodziło mi żeby nie pokazywało mi w inpucie listy jak w tym wypadku:

Podaj wybór działania matematycznego: '+' '-' '*' '/' ['+', '-', '*', '/']:

I dlatego dałem to w pętliu for i in wybor
Bez tej pętli for , też się obejdzie bo sprawdzałem wcześniej. Co do return, fakt miało być return wybory_menu(). Ogólnie jeśli chodzi o cały kod, działa poprawnie, waliduje. I poza tym while niepotrzebnym i for i in wybor domyślam się , że jest w miarę ok jeśli chodzi o sam kod....

0

Jeśli chodzi o pętlę for i in wybór, to chodziło mi żeby nie pokazywało mi w inpucie listy jak w tym wypadku

A co chciales zeby pokazalo?

1

Tak, ten while i for nie tylko nie jest potrzebny, ale po pierwsze jak wstawiasz w kodzie coś niepotrzebnego to po pierwsze strasznie źle się czyta taki kod, ktoś kto go nie pisał, lub Ty za jakiś czas będzie nieźle musiał się nagłówkować nad tym do czego to i czy w ogóle jest to potrzebne. Więc, po co sobie utrudniać? Do tego taki kod jest niebezpieczny, może powodować błędy, jak np. u Ciebie ten for, który w praktyce powoduje wyświetlenie plusa, też nie wiadomo po co. Jeśli coś w kodzie jest niepotrzebne i wiesz że takie już pozostanie to musisz to skasować.

Domyślam się, że być może chciałeś w tym for wypisywać wszystkie możliwe wybory działań w komunikacie. Pętla for nie jest tu złym podejściem, ale jeśli zrobiłbyś to sensownie. Innym sposobem na uzyskanie czegoś takiego to użycie "join" np.:

wyborek = input ("Podaj wybór działania matematycznego: '"+ "' '".join(wybor) +"' : "  )

Główna pętla programu nie przewiduje, że użytkownik wprowadzi inny wybór niż t lub n. Dobrą praktyką przy takim sprawdzaniu jest też zastosowanie upper lub lower, by wielkość liter wprowadzonych przez użytkownika nie miała znaczenia.

0

Co do pętli for , to miałem taki zamiar, bez pokazywania listy z nawiasami kwadratowymi ( teraz sam nie wiem po co, żeby lepiej to wyglądało...., coś w tym stylu) Co do głownej pętli , to racja. Jak wprowadzam inny wybór niż t/n to wychodzi z programu. O wielkości liter już nie wspomnę. Bedę musiał bardziej być uważny w pisaniu programów, i testować je pod różnym kątem. Choć tu mi chodziło czy program we funkcjach nie jest zbyt długi, i poprawnie w miarę napisany. Sądzę , że powolutku dojdę do wprawy, nie śpieszy mi się. Na razie programowanie traktuję jako zabawę w wolnym czasie który rzadko niestety mam. Co do pętli for, to jak kolego @stivens wcześniej pisał, to return ogólnie przerywa działanie pętli for we funkcji,bloku. To bym musiał dać wtedy bez return ( zwracanie funkcji), jak się domyślam, żeby zastosować we funkcji pętlę for? Tak gdybam na szybko.... , sprawdzę to w programie potem z ciekawości . Dzięki za informacje :)

0

Co do pętli for , to miałem taki zamiar, bez pokazywania listy z nawiasami kwadratowymi ( teraz sam nie wiem po co, żeby lepiej to wyglądało...., coś w tym stylu)

Ale przeciez wpisales to "z palca"

wyborek = input ("Podaj wybór działania matematycznego: '+' '-' '*' '/' : ")
0

@stivens Tak wpisałem to "z palca", bo jakbym tego nie wpisał, a dał w inpucie samo: +str(wybor)+ , to pokazywało mi całą listę z znakami kwadratowymi. A chodziło mi o samo pokazanie tylko '+','-,''*','/'... Choć i tak "jeden kij". Ale przy podpowiedzi, @Arthan , jeśli chodzi o funkcję "join" działa to idealnie. O to mi chodziło :) Za dużo chyba kombinacji robię :)

0

@Arthan:

Główna pętla programu nie przewiduje, że użytkownik wprowadzi inny wybór niż t lub n. Dobrą praktyką przy takim sprawdzaniu jest też zastosowanie upper lub lower, by wielkość liter wprowadzonych przez użytkownika nie miała znaczenia.>

Idąc twoją podpowiedzią, zmodyfikowałem trochę program o te "rzeczy", które wymieniłeś. Choć tu nie wiem jak to zakodować dokładnie z upper i lower w kodzie. Więc spróbowałem z innej beczki:


wybor = ['+', '-', '*', '/']
reset = ['T','t']

    
def wybory_menu():

    wyborek = input("Podaj wybór działania matematycznego: '"+ "' '".join(wybor) +"' : "  ) # podaję jako wybór działania, jak zrobię +str(wybor)+ to pokazuje mi w inpucie: [ '+','-','*' itp..]
    if wyborek not in wybor :
        print('Nic nie wpisałeś lub podałeś nieprawidłowe dzialanie matematyczne! - Podaj prawidłowe dane! ')
        return wybory_menu() # po nie wpisaniu  lub błednym, innym wpisaniu działania mat. zwraca, wychodzi z wyjścia bloku ( do funkcji wybor_menu)
    else:
        return wyborek # W przeciwnym razie wraca do bloku "wyborek"

def gra(gracze):

    while True: 
        try:
            podaj = int(input(f' Wybierz dwie liczby, które możesz dodać, odjąć, pomnożyć, lub podzielić: \n Podaj {gracze} ')) 
            break
        except ValueError:
            print('Blad wpisywania wartosi! Podaj wartość liczbową: ')
    return podaj

def dodawanie(liczba1,liczba2):

    return int(liczba1) + int(liczba2)

def odejmowanie(liczba1,liczba2):
    return int(liczba1) - int(liczba2)    

def mnozenie(liczba1,liczba2):
    return int(liczba1) * int(liczba2)

def dzielenie(liczba1,liczba2):
    return int(liczba1) / int(liczba2)

#gracze
while reset == 't' or 'T':
    liczba1 = gra('liczbę pierwszą: ')
    liczba2 = gra('liczbę drugą: ')
    wyborek = wybory_menu()  

    if wyborek == '+':
        suma = dodawanie(liczba1,liczba2)
        print("Suma wynosi: " +str(liczba1)+ '+' +str(liczba2)+  '='   , suma)
    if wyborek == '-':
        roznica = odejmowanie(liczba1,liczba2)
        print('Odejmowanie wynosi : '+str(liczba1)+ '-' +str(liczba2)+  '='  , roznica)
    if wyborek == '*':
        iloczyn = mnozenie(liczba1,liczba2)
        print('Mnozenie wynosi : '+str(liczba1)+ '*' +str(liczba2)+  '='   , iloczyn)
    if wyborek == '/':
        iloraz = dzielenie(liczba1,liczba2)
        print('Dzielenie wynosi : '+str(liczba1)+ '/' +str(liczba2)+  '='   , iloraz)
    
    wejscie = input('Liczysz dalej: t/n: ')
    if wejscie == 'n':
        print('Koniec liczenia')
        break
    if wejscie == 'N':
        print('Koniec liczenia')
        break
    if wejscie not in reset:
        print('Nic nie zostało wpisane lub zła wpisana wartość.Licz od nowa')
        continue

    

Krótko i na temat, co sądzicie o tym? Można krócej, lepiej, czytelniej?

P.S Przy wczesniejszym zmodyfikowaniu linijki jednej w kodzie w ten sposób :

if wejscie == 'n' or 'N':
       print('Koniec liczenia')
       break

Wysypuje mi się walidacja, nie wiem dlaczego??, więc musiałem dać dwa if z "n" i if z "N"

0
if wejscie == 'n' or 'N':

Nawiasowanie wyglada tak:

if (wejscie == 'n') or 'N':

https://www.programiz.com/python-programming/methods/string/lower
https://www.programiz.com/python-programming/methods/string/upper


Krótko i na temat, co sądzicie o tym? Można krócej, lepiej, czytelniej?

mozna

2
while reset == 't' or 'T':
    ...

zastąp tym:

TRUE_OPTIONS = ['T', 't']
while reset in TRUE_OPTIONS:
    ...

albo po prostu

while reset in ['T', 't']:
    ...

Zmienną reset na samej górze powinieneś zastąpić:

reset = 'T'

bo ją i tak później nadpisujesz.

I teraz tak. Stwórz sobie następujący słownik w którym odpowiednim wyborkom przypisujesz funkcję, którą chcesz wykonać:

operations = {
    '*': mnozenie,
    '+': dodawanie,
    '-': odejmowanie',
    '/': dzielenie
}

Następnie możesz skrócić te wszystkie warunki w taki sposób:

wyborek = wybory_menu()
operation = operations[wyborek]
print(f"{liczba1} {wyborek} {liczba2} == {operation(liczba1, liczba2)}")

Niby tracisz trochę informacji, które miałeś w tym wyświetlanym tekście w princie, ale z drugiej strony funkcje mnozenie, dodawanie, odejmowanie i dzielenie mogą też zwracać tuplę i jako pierwszy element tupli mogą zwracać wynik wynik, a jako drugi jakiś opis np.

def dodawanie(liczba1,liczba2):
    return int(liczba1) + int(liczba2), "Dodawanie"

Wtedy, żeby wyciągnąć jedno i drugie robisz:

result, description = operation[wyborek](liczba1, liczba2)
print(f"{description}: {liczba1} {wyborek} {liczba2} == {result}")

Możesz też użyć pola __name__, żeby zorientować się jaka funkcja jest pod spodem, np.:

operation = operations[wyborek]
print(f"{operation.__name__}: {liczba1} {wyborek} {liczba2} == {operation(liczba1, liczba2)}")

Edit:
I przestań używać break i continue. Zastanów się jak przepisać ten kod w taki sposób, żeby ich nie było w kodzie. Używanie break to jest bardzo zła praktyka. Używaj return wartosc_do_zwrocenia, żeby wyskoczyć z pętli/funkcji. Jeżeli nie jesteś w funkcji to najwidoczniej musisz opakować swój kod w funkcję.

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