Optymilizacja kodu, przerobienie kodu na funkcje

0

Witam, mam taki kod znaleziony w sieci, orzeł , reszka...

# importujemy potrzebne biblioteki
import random
import time
# ustawiamy początkowy wynik dla użytkownika oraz komputera
user = 0
computer = 0 
while True:
    
    # wczytujemy wybór uzytkownika
    x = input()
    if x == '0': break
    elif x == 'o': x = "orzeł"
    elif x == 'r': x = "reszka"
    else:
        print("Proszę dokonać prawidłowego wyboru:")
        print("o - orzeł")
        print("r - reszka")
        print("0 - zakończenie gry")
        
        # jezeli użytkownik nie wybrał ani, o, r, 0, to wróć do początku wykonywania pętli 
        continue
    
    # rzucamy monetą
    y = random.choice(["orzeł", "reszka"])
   
    # Odliczamy 3,2,1
    for i in range (0,3):
        print (3-i)
        time.sleep(1)
        
    print ("Wynik rzutu: ", y)
    
    # sprawdzamy kto wygrał
    if x == y: 
        user+=1
    else:
        computer+=1
        
    # Drukujemy podsumowanie
    print ("Wyniki łacznie.")
    print ("Użytkownik: ", user)
    print ("Komputer: ", computer)

I tu mam pytanie, czy można w.w . kod przerobić na funkcje i czy to w tym wypadku tego kodu ma sens przerabiania na funkcje??? Tzn. żeby kod był krótszy, bardziej czytelny? Pytanie czyste teoretyczne. Co sądzicie na ten temat? Dążę, do tego, kiedy można , w ogóle optymilizować kod np. we funkcjach itp... Bo program jakiś tam z załozenia przykładowo działa, ale ma długi kod załóżmy. Domyślam się, że chodzi też o czas uruchamiana, działatnia takiego programu(kodu). Chętnie bym posłuchał waszych opinii...Dzięki z góry.

6

czy można w.w . kod przerobić na funkcje

Tak.

czy to w tym wypadku tego kodu ma sens przerabiania na funkcje?

Tak.

Tzn. żeby kod był krótszy,

Kod nie będzie od tego krótszy.

bardziej czytelny?

Tak.

Co sądzicie na ten temat?

Podzielenie kodu na małe, logiczne fragmenty znakomicie ułatwia zrozumienie jego idei i, przede wszystkim, przetestowanie jego poprawności.

Dążę, do tego, kiedy można , w ogóle optymilizować kod np. we funkcjach itp.

Optymalizacja nie powinna, poza bardzo szczególnymi przypadkami, być dokonywana kosztem czytelności kodu. Przejmowanie się kosztem wywołania funkcji czy o czym tutaj piszesz poza główną pętlą programu jest zabiegiem pozbawionym znaczenia.

3

Poczytaj tu: https://pl.wikipedia.org/wiki/Spaghetti_code
W samym kodzie nie podoba mi się:

  • po uruchomieniu nie ma komunikatu instrukcji gry
  • przez to że nie ma funkcji, żaden fragment kodu nie jest re-używalny,
  • jest nierozwojowy, wyobraź sobie, że chcesz monetę zastąpić 3 kubkami, albo zrobić najpierw menu, w którym możesz wybrać wariant z monetami lub kubkami, albo chciałbyś go przetłumaczyć na angielski, albo zmienić interfejs z konsoli na GUI, w ilu miejscach musisz zmieniać kod? Jak mógłbyś go napisać by zmian było jak najmniej?
0

Dzięki. Jak znajdę, czas to spróbuję ten program (kod) przerobić od nowa we funkcjach po swojemu :) Pozdrawiam :) Wkleję potem , jak mi się uda cały przerobiony kod :)

1

Pozostaje pytanie do czego jest ten kod i czy jest sens jego poprawiania ta w ogóle... Nie każdy kod musi być piękny, a tym bardziej dzielony na jakiekolwiek struktury typu obiekty, moduły funkcje itd...

  • Jeśli to np. jakiś skrypt do jednorazowego użycia to tego typu "optymalizacje" bywają zwykłą stratą czasu.
  • Jeśli dla nauki to zdecydowanie warto podzielić na funkcje.
  • Jeśli mamy zamiar używać tego kodu w przyszłości to zdecydowanie warto podzielić na funkcje a może nawet zrobić z niego klasę.
0

Przeczytaj książkę Czysty Kod Robert C. Martin
Zawiera kilka zasad na początek odnośnie pisania kodu.

Nie dodaj komentarzy po Polsku - tak się nie robi.
Za dużo komentarzy, choć rozumiem, że na początku to pomaga.

Program nie jest instrukcjami komputera wykonywanymi linijka po linijce. Zainteresuj się paradygmatami - funkcyjnym oraz obiektowym ale dopiero gdy opanujesz podstawy

1

@Marcin Marcin: Czemu nie dodaje się komentarzy po polsku? Też nie jestem za mieszaniem języków, ale czasami lubię pisać po polsku np. jeżeli język domenowy jest na tyle wyszukany, że nie chce mi się szukać jak coś się nazywa po angielsku, wszystkie zmienne, funkcje i obiekty nazywam wtedy po polsku, komentarz też wtedy pisze w tym języku. Skoro w zespole wszystkie osoby znają ten język to czemu nie, ale staram się wtedy wszędzie trzymać języka polskiego, nie licząc słów kluczowych oczywiście.

Co do zasadności użycia w ogóle tych komentarzy to też uważam, że są zbyteczne. Tu właśnie jest kolejna zaleta funkcji i obiektów - ich nazwy powinny być najlepszym komentarzem :) Dodasz funkcje: rzuc_moneta(), odliczaj() itd. a kod sam będzie wyglądał jak jeden piękny i czytelny komentarz :)

0

Witam, dzięki za informacje od Was wszykich. Muszę przyznać , że chyba jednak samych funkcji do konca nie rozumiem. Chciałem dokładnie zrobić prawie taki sam program orzeł i reszka co wkleiłem w pierszym poście, ale z dodatkiem samych funkcji. Prawie kilka godzin na tym spędziłem i zero efektów. A nie chcę się zniechęcać znowu. Wklejam swój kod z funkcjami:

# importujemy potrzebne biblioteki
import random
import time
# ustawiamy początkowy wynik dla użytkownika oraz komputera
uzytkownik = 0
komputer = 0
opcje = ['orzel','reszka']
wybor = ["o - orzeł", "r - reszka", "0 - zakończenie gry"]
        
def gra():
    while True:
        wybor_gracza = input (' Proszę dokonać właściwego wyboru: ')
        
        if wybor_gracza == 'o': wybor_gracza = "orzeł"
        elif wybor_gracza == 'r': wybor_gracza = "reszka"
        elif wybor_gracza == '0': break
        continue

        
 #def menu() dlaczego nie działa mi we funkcji ?
wybor_menu = []
for x in wybor:
    wybor_menu.append(gra)
    print(x)  

def rzut_moneta(losowanie):
    losowanie = random.choice(["orzeł", "reszka"])
    for i in range (0,3): #odliczanie od 3 do 0 po wyborze orła lub reszki/Ale nie działa.
        print (3-i)
        time.sleep(1)
    print(losowanie)    


wynik = gra()
print (wynik)


Tu mam pytanie, czy do funkcji jakieś mogę dodać inną funkcję przez .append i zeby mi to wyświetliło...? Tu w moim kodzie pokazuje mi menu, wybór, ale jak wybieram "o" czy "r" to nie zaczyna się mi odliczanie i od razu dodawanie punktów jak w poprzednim kodzie bez funkcji... Będę musiał jednak dłużej nad samymi funkcjami posiedzieć i poćwiczyć sobie różne opcje z kodami.... Na razie do jutra odpoczne od Pythona, bo głowa boli mnie od tego "siedzenie przy tym " :). Byłbym wdzięczy za wskazówki, podpowiedzi co robię w tym kodzie z funkcjami zle, bo kombinowałem na różne sposoby, jak mi już "logika" wysiadła od tego myślenia:(

0

@szatkus: próbowałem użyć wcześniej return pod funkcją,ale dalej kod nie chce "iść dalej"

# importujemy potrzebne biblioteki
import random
import time
# ustawiamy początkowy wynik dla użytkownika oraz komputera
uzytkownik = 0
komputer = 0
opcje = ['orzel','reszka']
wybor = ["o - orzeł", "r - reszka", "0 - zakończenie gry"]
        
def gra():
    while True:
        wybor_gracza = input (' Proszę dokonać właściwego wyboru: ')
        if wybor_gracza == 'o': wybor_gracza = 'orzeł'
        elif wybor_gracza == 'r': wybor_gracza = 'reszka'
        elif wybor_gracza == '0':
            print('koniec gry') 
            break
        return wybor_gracza
#def menu():   Gdy funkcję def menu uaktywniam, nie mam opcji wyboru na wyswietlaczu, dlaczego?
for x in wybor:
    wybor_menu = []
    wybor_menu.append(gra)
    print (x)

def rzut_moneta(losowanie):
    losowanie = random.choice(["orzeł", "reszka"])
    for i in range (0,3): #odliczanie od 3 do 0 po wyborze orła lub reszki/Ale nie działa.
        print (3-i)
        time.sleep(1)
    print('wynik rzutu kostką: ', losowanie)
    return losowanie
      

wynik = gra()
print (wynik)


Po prostu próbuję zrozumieć jak działają same funkcje w kodzie. Dlatego próbuję przerobić kod na funkcje (dla samej nauki, jak funkcje działają) Niby myślałem, ze oglądnąłem o funkcjach wszystko co było w necie, ale chyba nie.... Jadę na rower, żeby się przewietrzyc . :), potem dalej pokombinuję. Bez funkcji jak to przerabiam , działa. Ale z funkcjami tu mam problem.

1

Ajajaj tutaj tak bardzo brakuje Ci podstaw, ze nawet nie wiem co Ci powiedziec. Moze poczytaj o funkcjach i control-flow jeszcze raz?

0

@stivens: Niestety brak podstaw niestety... Przećwiczyłem kawałek kodu z funkcjami: dodawanie do magazynu liczb

#Dodawanie do magazynu
magazyn = []

def wloz():
    while True:
        z = input('Podaj liczbę do magazynu: ')

        magazyn.append(int(z)) 
        print(magazyn)
        return z
        
        
def suma_kwot():
    saldo = sum(magazyn)
    print('Suma kwot wynosi: ',saldo)
    return saldo
    

        
wynik = wloz()
print(wynik)


Bez funkcjji , kod mi dobrze chodzi. Dodaje do magazynu liczby i sumuje przy kazdej dodanej liczbie do magazynu. Funkcje jakby to blokowały....
Zaczynam od nowa naukę o funkcjach, bo chyba nie rozumiem ich dzialania. Tylko nie śmiejcie się ze mnie :)

0
def wloz():
    while True:
        z = input('Podaj liczbę do magazynu: ')

        magazyn.append(int(z)) 
        print(magazyn)
        return z

Jest efektywnie rownowazne

def wloz():
        z = input('Podaj liczbę do magazynu: ')

        magazyn.append(int(z)) 
        print(magazyn)
        return z

Suma kwot natomiast nie jest nawet nigdzie wywolywane. Poza tym co tu sumowac jak tam jest tylko jeden element.

0

@stivens: Co do sumy kwot , to return z , która zwraca 'z' , nie pozwala pętlować dalej... Po usunięciu return z , pętla działa ok, wpisuje dalej elementy do magazynu, ale ich nie sumuje za każdym razem jak dodaję te elementy do magazynu. Bez funkcji w tym kodzie, wszystko działa mi dobrze.

A tu dobrze działający kod bez funkcji:

magazyn = []


while True:
    z = input('Podaj liczbę do magazynu: ')

    magazyn.append(int(z)) 
    print(magazyn)
        
    saldo = sum(magazyn)
    print('Suma kwot wynosi: ',saldo) 



I dodaję funkcje, zeby sobie poeksperymentować z funkcjami....A tu klapa :(

0

@pythonowiec74: chcielibyśmy Ci pomóc, wiem że początki są trudne ale wspieram Cię bo próbujesz sam
Tutaj jest poradnik dotyczący Pythona:

oraz Mateusz Kupilas @Matttt nagrał kiedyś o tym filmik

Pisz kod, brzydki kod i nie przestawaj pisać. Pokazuj go i będziemy pomagać

0

@Marcin Marcin: Dzięki.
@stivens udało mi się poprawić kod, teraz wkłada i sumuje elementy do magazynu :)

#Dodawanie do magazynu
magazyn = []
while True: 
    def wloz():
    
        z = input('Podaj liczbę do magazynu: ')
        magazyn.append(int(z)) 
        return magazyn

    #sumowanie liczb w magazynie 
    saldo = sum(magazyn)
    print('Suma kwot wynosi: ',saldo) 
    
    
    wynik = wloz()
    print (wynik)
   

Bym Cię , czy kogoś z forum prosił o jedną krótką odpowiedz... Czy samo sumowanie liczb w magazynie da się zrobić we funkcji??? , tu właśnie mi nie wychodzi sumowanie elementów w funkcji!

0

Wyobraź sobie że masz psa o imieniu Python i go uczysz różnych komend, nie jest to głupi pies i niektóre komendy już zna, ale chciałbyś by nauczył się bardziej złożonych.
Umie np. jak go zawołasz przybiec i wziąć od Ciebie zabawkę, umie też położyć ją obok Ciebie i szczekać tyle razy ile leży tam zabawek.
Ty chciałbyś żeby przyszedł do Ciebie po zabawkę, zaniósł zabawkę do pudełka, potem wrócił do Ciebie i zaszczekał tyle razy ile jest zabawek w pudełku i żeby czekał na kolejną zabawkę i tak w kółko.

# najpierw uczysz Pythona co to w ogóle jest to pudełko, pokazujesz mu je, dajesz powąchać ...
magazyn = []

# uczysz go dwóch komend - pierwsza to włóż ..
def wloz():
    # uczysz go, że ma podejść i że dajesz mu zabawkę ...
    z = input('Podaj liczbę do magazynu: ')
    # i że ma ją zanieść do pudełka
    magazyn.append(int(z)) 
    # tu zaglądasz do pudełka i sprawdzasz czy faktycznie ją zaniósł
    print(magazyn)

# potem uczysz go drugiej komendy - suma_kwot
def suma_kwot():
    # na to polecenie ma szczekać tyle razy ile zabawek jest w magazynie
    saldo = sum(magazyn)
    print('Suma kwot wynosi: ',saldo)
    return saldo

# twój piesek zna już Twoje skomplikowane komendy, czas sprawdzić jak mu idzie ...
# dajesz mu więc w kółko dwie komendy na zmianę.. Python je zna i wykonuje bez marudzenia ;)
while True:
    wynik = wloz()
    suma_kwot()
    
# nie nauczyłeś go komendy koniec, więc będzie za każdym razem wracał po kolejną zabawkę, ale najważniejsze że robi to co chciałeś :)

Nie wiem czy taka analogia Ci pomoże, ale mniej więcej tak to wygląda, że funkcja to polecenie by Python wykonał kilka innych poleceń. Z podstaw o funkcjach musisz wiedzieć tylko, jak je utworzyć (def Nazwa) i jak je wywołać (Nazwa z nawiasem).

Do tego można im przekazywać parametry przy wywoływaniu - tak jakby nauczyć Pythona dodatkowych opcji danego polecenia, np. że jak powiesz "włóż do pudełka!" albo "włóż do magazynu", a wcześniej wytłumaczysz mu co jest czym to będzie umiał wykonać te same polecenia dla różnych miejsc.

#uczysz go, że mówiąc komendę "włóż" podajesz mu pewne miejsce, i tłumaczysz mu co ma zrobić ...
def wloz(miejsce):
    z = input('Podaj liczbę do magazynu: ')
    miejsce.append(int(z)) 
    print(miejsce)
wloz(magazyn) # teraz gdy dasz taką komendę, będzie wiedział co ma z tym magazynem zrobić

Ostatnia rzecz z podstaw to słowo kluczowe "return" ... ale na to nie mam teraz już czasu, ani natchnienia :D

0

Dziękuję @Arthan za "łopatologiczne", ze tak nazwę wytłumaczenie :) Bład robiłem w braku wywołania na koncu sum_kwot, jak i kolega @stivens słusznie o tym wspominał we wczesniejszym poście. I tu mam pytanie do tego kodu, czy pętla while True może być również wywołana przed funkcją wloz? Bo kod tak samo chodzi poprawnie jak z twojego poprawionego kodu. I tu jak sądzę , różnicy nie ma. Byle kod dobrze działał? :)

#Dodawanie do magazynu
magazyn = []

while True: 
    def wloz():

Co do funkcji return to zwraca daną wartość we funkcji... Poczytam sobie jeszcze o funkcjach itp... Mam czas , żeby to pojąć.NIe śpieszy mi się. Jednym to zajmuję chwilę, a drugim odwrotnie :) W wolnej chwili znowu spróbuję wrócić do kodu orzel i reszka i dac to we funkcjach. Jak mi się uda, to wkleję gotowca to ocenienia Wam. Dzięki wszystkim za pomoc, wskazówki :) Gdyby nie praca i inne obowiązki, to bym non stop siedział na kodzie ha ha ha. Cóż doba powinna mieć 48h, a nie 24h :)

0

@pythonowiec74: możesz zdefiniować funkcję wewnątrz pętli, ale jest to mniej czytelne i zapewne mniej wydajne, jeżeli wydajność miałaby tu jakiekolwiek znaczenie. Innymi słowy jeśli możesz coś zrobić tylko raz, to zrób to raz, a nie za każdym razem w pętli :)

0

Wydajność może być nawet taka sama, zależy jak konkretnie Python sobie kompiluje funkcje. Problem jest właśnie z czytelnością, bo tuż pod inicjalizacją pętli raczej spodziewasz się kodu tego, co się będzie działo w tej pętli. Nawet jeśli się tworzy jakieś funkcje pomocnicze (ale to raczej w ciele funkcji, nie pętli) to umieszcza się je na końcu, bo gdy ktoś przegląda kod to interesuje go przede wszystkim big picture, jeśli interesują go detale to sobie sobie tam przeskoczy.

0

Panowie , udało mi się to jakoś zrobić we funkcjach ( do nauku , zeby sprawdzić jak funkcje działają) orzeł i reszka...:

 opcje = ['orzel','reszka']
wybor = ["o - orzeł", "r - reszka"]
print('Witam w grze orzel i reszka. Gra polega na rzucaniu orzel i reszka. Jest 8 podejść gry. Wygrywa ten, kto ma najwięcej punktów.\n ')

def gra():  
   
    wybor_gracza = input (f'Proszę  dokonać właściwego wyboru:')
    if wybor_gracza == 'o' : wybor_gracza = 'orzel'
    if wybor_gracza == 'r' : wybor_gracza = 'reszka'
    return wybor_gracza

def menu():     
    for x in wybor:
        wybor_menu = []
        wybor_menu.append(gra)
        print(x)
  
def rzut_moneta():
    uzytkownik = 0
    komputer = 0
    losowanie = random.choice(["orzeł", "reszka"])
    for i in range (0,3): #odliczanie od 3 do 0 po wyborze orła lub reszki/Ale nie działa.
        print (3-i)
        time.sleep(1)
    print('Wynik losowania: ',losowanie)

    # Wynik losowania
    if x == losowanie: 
        uzytkownik +=1
    else:
        komputer +=1
    print('Wynik łączny:')
    print('Uzytkownik', uzytkownik)
    print('komputer', komputer)



for x in range(8):
    menu()
    wynik = gra()
    print (wynik)
    rzut_moneta()
    


Moim zdaniem , szału nie ma . Jesli chodzi o kod w porównaniu do kodu bez funkcji , który wkleiłem na początku tego postu. Chodzi mi o długość kodu, czytelność?? Nie wiem tylko jak zrobić , żeby w tym kawałku kodu:

# Wynik losowania
    if x == losowanie: 
        uzytkownik +=1
    else:
        komputer +=1

za x wstawic z funkcji gra : if wybor_gracza == losowanie, jak to przerobic? Ogólnie co sądzicie o mojej przeróbce orła i reszki wykorzystująć funkcje? Przyjmuję wszelką krytyke! I czy można to krócej zrobić ten kod wykorzustując funkcje??? Dziś biorę się za czytanie trochę, bo nie miałem czasu. Pozdrawiam

2

@pythonowiec74: w funkcji menu, niepotrzebnie tworzysz wybor_menu, do niczego tego nie wykorzystujesz.

losowanie = random.choice(["orzeł", "reszka"])

zamień na

losowanie = random.choice(opcje)

Raz używasz polskiej litery, raz nie i to jest jednym z powodów dlaczego porównywanie nie działało.
Drugi to to, że porównujesz if x == losowanie ? Co to jest "x" w tym przypadku? "wynik" porównuj.
Jak do tego zmienne uzytkownik i komputer zadeklarujesz całkiem na początku kodu, a w funkcji rzut_moneta dasz:

    global uzytkownik
    global komputer

To wszystko powinno w miarę działać.
Opcje mogłyby być jako słownik, wtedy by to wszystko mogło wyglądać np. tak:

import random
import time

podejsc = 8
uzytkownik = 0
komputer = 0
opcje = {'o': 'orzeł', 'r': 'reszka'}
print('Witam w grze orzel i reszka. Gra polega na rzucaniu orzel i reszka. Jest ' + str(podejsc) + ' podejść gry. Wygrywa ten, kto ma najwięcej punktów.\n ')

def pobieranie_wyboru():  
    wybor_gracza = input (f'Proszę dokonać właściwego wyboru: ')
    if wybor_gracza in opcje.keys():
        return wybor_gracza
    else:
        return pobieranie_wyboru()

def wyswietl_menu():     
    for klawisz, nazwa in opcje.items():
        print(f'{klawisz} - {nazwa}')

def rzut_moneta():
    losowanie = random.choice(list(opcje.keys()))
    for i in range (0,3):
        print (3-i)
        time.sleep(1)
    print('Wynik losowania: ', opcje[losowanie])

    # Wynik losowania
    global uzytkownik
    global komputer
    
    if wynik == losowanie: 
        uzytkownik +=1
    else:
        komputer +=1
    print('Wynik łączny:')
    print('Uzytkownik', uzytkownik)
    print('komputer', komputer)

for x in range(podejsc):
    wyswietl_menu()
    wynik = pobieranie_wyboru()
    print (opcje[wynik])
    rzut_moneta()
0

@Arthan: Tu poprawiłem swój kod , według Twoich wskazówek :)

import random
import time
uzytkownik = 0
komputer = 0

opcje = ['orzel','reszka']
wybor = ["o - orzel", "r - reszka"]
print('Witam w grze orzel i reszka. Gra polega na rzucaniu orzel i reszka. Jest 8 podejść gry. Wygrywa ten, kto ma najwięcej punktów.\n ')
def gra():  
   
    wybor_gracza = input (f'Proszę  dokonać właściwego wyboru:')
    if wybor_gracza == 'o' : wybor_gracza = 'orzel'
    if wybor_gracza == 'r' : wybor_gracza = 'reszka'
    return wybor_gracza

def menu():     
    for x in opcje:
      print(x)
  
def rzut_moneta():
    global uzytkownik
    global komputer
    losowanie = random.choice(opcje)
    for i in range (0,3): #odliczanie od 3 do 0 po wyborze orła lub reszki/Ale nie działa.
        print (3-i)
        time.sleep(1)
    print('Wynik losowania: ',losowanie)

    # Wynik losowania
    if wynik == losowanie: 
        uzytkownik +=1
    else:
        komputer +=1
    print('Wynik łączny:')
    print('Uzytkownik', uzytkownik)
    print('komputer', komputer)



for x in range(8):
    menu()
    wynik = gra()
    print (wynik)
    rzut_moneta()
    



Szczerze mówiąc, myślałem że kiepsko mi wyszło napisanie tego kodu pod orzeł i reszka. O global ( uzytkownik, komputer) nie znałem tych opcji zastosowania w kodzie. I drugi mój bład z tym if X!, powinno być wynik zamiast X. Polskie litery - moje niedopatrzenie :) Prawie się mi udało, ale to prawie. Bo kod nie działał do konca. Teraz kod działa ok.

Co do twojej wersji kodu orzeł i reszka , przenalizuję to dokładnie.
Szczególnie to:

ef wyswietl_menu():     
    for klawisz, nazwa in opcje.items():
        print(f'{klawisz} - {nazwa}')

def rzut_moneta():
    losowanie = random.choice(list(opcje.keys()))
    for i in range (0,3):

opcje.items / opcje.keys

Dzięki jeszcze raz. Nie jest łatwo, ale powoli , bardzo powoli myślę ,że dam radę coś tam opanować :)
I tu mam pytanie jeśli chodzi o czytelność, kod, ,formę kodu kodu mojego i twojego. Czy mój kod względem twojego(zmodyfikowanego) lub odwrotnie robi jakąś różnice, jeśli chodzi o samo wywołania (uruchamiania) kodu, programu ? Dziękuję.

0

Pobieranie wyboru od użytkownika u mnie jest w pętli dopóki nie wpisze prawidłowego wyboru, u Ciebie sprawdza z czymkolwiek co tam użytkownik wprowadzi.

Ilość podejść, nazwy opcji i ich litery są zdefiniowane w jednym miejscu, mogę sobie zmienić, dodać nowe pozycje do słownika "opcje" i program powinien z nimi działać np. na trzy kubki i użytkownik musi zgadnąć pod którym jest piłka.

Ja osobiście nie lubię używać "global", wolałbym przekazywać zmienne do funkcji poprzez ich argumenty. Najlepiej to bym w ogóle przerobił to na obiekt lub trzy :P

Masz rację, nie jest źle, ale sam program jakoś wielce skomplikowany nie jest :)

0

@Arthan: Pobieranie wyboru od użytkownika u mnie jest w pętli dopóki nie wpisze prawidłowego wyboru, u Ciebie sprawdza z czymkolwiek co tam użytkownik wprowadzi.

Tego nie sprawdzałem, fakt. Byłem skupiony na samych funkcjach.

@Arthan: a osobiście nie lubię używać "global", wolałbym przekazywać zmienne do funkcji poprzez ich argumenty

Poczytałem sobie trochę o tych zmiennych globalnych. Niby ich nie rekomendują, i często jest to niby bład w nauce dla początkujących, którzy uczą się programowania. Trochę dziwi mnie to, bo ktoś to musiał z jakiegoś powodu te zmienne globalne wprowadzić w pythonie w jakimś celu.. Kod, kodem, ale moim zdaniem podstawa, że kod się uruchamia bez błedów i dobrze program chodzi. Przecież dla koncowego użytkownika, ważne jest , żeby progam ( na podstawie pythona , czy innego jezyka programowania) chodził bez zarzutu. Kod go nie obchodzi. Taka moja logika jest, jak się mylę, to prosze o naprostowanie mnie :) Może czepiam sie szczegółów, ale właśnie diabeł tkwi w szczegółach :) Pozdrawiam .

0

A teraz wyobraz sobie ze idziesz do pracy. Dostajesz jakies zadanie. Myslisz ze wiesz jak je zrobic, ale wprowadzasz mala zmiane i sie okazuje ze caly system wybucha. Siedzisz tydzien nad rozwiazaniem.
Oprocz Ciebie jest jeszcze X innych programistow ktorzy tez maja podobne problemy. Wprowadzenie zmian w projekcie zajmuje dlugie miesiace a klient dostaje efekt duzo pozniej.

Dlatego lepiej programowac zgodnie ze sztuka :)

0

Dzięki za informacje :) Tu mam , takie małe zapytanie względem mojego kodu prostego we funkcjach:

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

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

Przy wyborze np.: 2 nie dostaję informacji, ze zgadłem i koniec gry. Przez break program powinien się zakonczyć. Gdzie tu robię błąd?
Jak robię bez walidacji Try , i bez funkcji to program działa w miarę ok.

Podaj liczbę z zakresu od 1 do 30: 10
  Wylosowana liczba to:  1
Nie zgadłes, próbuj dalej!
Podaj liczbę z zakresu od 1 do 30: 25
  Wylosowana liczba to:  2
Nie zgadłes, próbuj dalej!
Podaj liczbę z zakresu od 1 do 30: 
Błąd wpisywania wartosci, wpisz poprawną wartosc liczbową!
**Podaj liczbę z zakresu od 1 do 30: 2
  Wylosowana liczba to:  2
Nie zgadłes, próbuj dalej!
Podaj liczbę z zakresu od 1 do 30: **

Sprawdzałem spacje, odstępy, akapity - wygląda ok, ale dalej program nie działa jak  powinien. Może problem jest z tym for x in range(wynik) ?, bo jak miałem  for x in wynik to dostawałem błąd jak w kodzie opisałem go po #...

1

Funkcja randomek nie zna takiej zmiennej jak wynik, musisz ją do tej funkcji przekazać. Dodatkowo x in wynik nie ma sensu, bo wynik to jedna liczba.

0

@pythonowiec74:

import random

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

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


while True:
    randomek()

I zastananow sie dlaczego w ten sposob :)

0

Tak na szybko kod uruchomiłem.... Na początku uruchomienie pokazuje info: wylosowana liczba to: , a potem dopiero przechodzi do zapytania o liczby. Nie pokazuje info ,po każdym losowaniu,: wylosowana liczba to: , i break nie działa , tzn nie przerywa programu po zgadnieciu liczby , tylko pętli dalej , żeby podać liczbę z zakresu od 1 do 30.. Pokombinuję przy tym kodzie :) Pozdrawiam

0

To zastanow sie dlaczego tak sie zachowuje i jak to zmienic :)

tzn nie przerywa programu po zgadnieciu liczby

programu nie przerywa ale petle a w konsekwencji i funkcje tak

PS: break jest lokalny!

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