• Najnowsze pytania
  • Bez odpowiedzi
  • Zadaj pytanie
  • Kategorie
  • Tagi
  • Zdobyte punkty
  • Ekipa ninja
  • IRC
  • FAQ
  • Regulamin
  • Książki warte uwagi

question-closed Problem z importem funkcji - python

Fiszki IT
Fiszki IT
0 głosów
104 wizyt
pytanie zadane 1 lipca 2019 w Python przez Ventre90 Obywatel (1,150 p.)
zamknięte 3 lipca 2019 przez Ventre90

Cześć drodzy pasjonaci.

Napisałem program 5 liczb, który jest taką zgadywanką jednej z pośród 5 losowych liczb z listy i liczy winratio. Program liczb5_rate w zamyśle miał wprowadzać n liczbe testów na każdy z indeksów tej listy i podawać win ratio. dlatego importuje tą funkcje. Na razie jednak zatrzymałem się na poniższym problemie:

Czy ktoś jest mi w stanie pomoc z importem funkcji z jednego modułu do drugiego ? Importuje funkcje gen_list() z programu liczb5.py do programu liczb5_rate.py

Niestety w programie liczb5_rate po zaimportowaniu tej funkcji cały czas wykonuje się dalsza instrukcja zawarta w programie liczb5. (czyli główna pętla while true – co jest efektem nie pożądanym, bo nie wykonuje się funkcja win_ratio(n) ). Próbowałem importować cały moduł i wywoływać z niego samą funkcje ale efekt jest ten sam. Ten patent z if __name__ =”__main__”: tez mi nic nie daje, choć nie wiem czy to dobrze zastosowałem. Poniżej kody:

Liczb5.py:

import random
import os
score = 0
count = 0

def cls():
    os.system("cls")

def gen_list():
    numbers = []
    for i in range(5):
        x = random.randint(1,100)
        numbers.append(x)
    for j in range(len(numbers)):
        print(numbers[j])
    y = random.randint(0,4)
    x = numbers[y]
    return numbers, y, x
if __name__ == "__main__":
    gen_list()
cls()
while True:

    print ("\nOdgadnij liczbe wylosowana przez komputer:")
    numbers, y, x = gen_list()
    while True:
        try:
            answer = int(input("Podaj liczbe: "))
            break
        except ValueError:
            continue
    
    if answer == x:
        print("\nBrawo! Odgadleś prawidlowo!")
        score +=1
        count +=1
    else:
        print("\nPrzegrana! Komputer wylosowal: ", x)
        count +=1

    print("Prob {} // Wygranych: {} // Winratio: {}%".format (count, score,round(score/count*100,2)))
    msg = "\t\tAby zagrać ponownie wcisnij ENTER, aby wyjsc wcisnij q: "
    prompt = input(msg)
    if prompt == 'q' or prompt == 'Q':
        break
    cls()

Liczb5_rate.py:

import random
import os
from liczb5 import gen_list

def cls():
    os.system("cls")

def win_ratio(n):
    score = 0
    for i in range(n):
        numbers, y, x = gen_list()
        if x == numbers[0]:
            score += 1
    cls()
    print("Prob {} // Wygranych: {} // Winratio: {}%".format (n, score,round(score/n*100,2)))

while True:
    try:
        win_ratio(int(input()))
        break
    except ValueError as e:
        continue

 

komentarz zamknięcia: Temat wyjaśniony
1
komentarz 1 lipca 2019 przez adrian17 Ekspert (297,680 p.)
Nie masz aby po prostu zepsutych wcięć? To `while True:` w Liczb5.py nie powinno być w środku ifa `if __name__ == "__main__":` ?
komentarz 1 lipca 2019 przez Ventre90 Obywatel (1,150 p.)

@adrain17 Już byłem taki zdesperowany, że napisałem to jeszcze raz na piechotę bez importu, ale jak zobaczyłem twoje rady -> zastosowałem i wszystko hula.

Umieściłem pętle while True tak jak napisałeś w środku warunku if __name__ == "__main__": no i ona przestała się wykonywać w programie liczb5_rate. Tak ma być. Jednak ta pętla nie ma bezpośredniego znaczenia przy imporcie, bo przecież importuje tylko funkcję a nie dalszą cześć kodu. Dlaczego ,,schowanie niechcianej części kodu" spowodowało, że on się przestał wykonywać? if name/main jakby jest takim separatorem - że co się znajduje w środku to się nie importuje ?

Teraz kod wygląda tak (usunąłem zmienna y i dałem z, skróciłem return, bo myślałem, że przez wielokrotnie definiowanego x mi sie coś chrzani) i jak zaimportowałem funkcję cls to ona przeszła bez żadnego problemu i wstawiania warunku if name/main. Na dodatek w tym przypadku nic nie powoduje dalszego wywoływania kodu (ale to pewnie dlatego, że jest teraz prawidłowo wcięty)

import random
import os
score = 0
count = 0

def cls():
    os.system("cls")

def gen_list():
    numbers = []
    for i in range(5):
        x = random.randint(1,100)
        numbers.append(x)
    for j in range(len(numbers)):
        print(numbers[j])
    z = random.randint(0,4)
    z = numbers[z]
    return numbers, z
if __name__ == "__main__":

    while True:

        print ("\nOdgadnij liczbe wylosowana przez komputer:")
        numbers, z = gen_list()
        while True:
            try:
                answer = int(input("Podaj liczbe: "))
                break
            except ValueError:
                continue
        
        if answer == z:
            print("\nBrawo! Odgadleś prawidlowo!")
            score +=1
            count +=1
        else:
            print("\nPrzegrana! Komputer wylosowal: ", z)
            count +=1

        print("Prob {} // Wygranych: {} // Winratio: {}%".format (count, score,round(score/count*100,2)))
        msg = "\t\tAby zagrać ponownie wcisnij ENTER, aby wyjsc wcisnij q: "
        prompt = input(msg)
        if prompt == 'q' or prompt == 'Q':
            break
        cls()

a to produkt finalny z importem, który działa teraz poprawnie

import random
import os
from liczb5 import gen_list, cls

def win_ratio(n):
    score = 0
    score2 = 0
    # win ratio na stalej pozycji
    for i in range(n):
        numbers, z = gen_list()
        if z == numbers[0]:
            score += 1
    # pozycja randomowa
    for i in range(n):
        numbers, z = gen_list()
        a = random.randint(0,4)
        a = numbers[a]
        if z == a:
           score2 += 1
    cls()
    print("STAŁA: Prob {} // Wygranych: {} // Winratio: {}%".format (n, score,round(score/n*100,2)))
    print("RANDOM: Prob {} // Wygranych: {} // Winratio: {}%".format (n, score2,round(score2/n*100,2)))

while True:
    try:
        win_ratio(int(input()))
        break
    except ValueError as e:
        continu

 

komentarz 1 lipca 2019 przez adrian17 Ekspert (297,680 p.)

Jednak ta pętla nie ma bezpośredniego znaczenia przy imporcie, bo przecież importuje tylko funkcję a nie dalszą cześć kodu

Nie.

W skrócie: zawsze cały plik jest wykonywany, a na koniec sama zmienna `gen_list` zostaje zaimportowana do pliku który importował moduł.

komentarz 1 lipca 2019 przez Ventre90 Obywatel (1,150 p.)
Czyli to co jest w środku if __name__ == "__main__": nie będzie się wykonywać po zaimportowaniu do innego moduły ?
1
komentarz 1 lipca 2019 przez adrian17 Ekspert (297,680 p.)
Tak, po to jest ten blok. `__name__` jest równe `"__main__"` gdy ten plik jest bezpośrednio wykonywany, a nie importowany.

Podobne pytania

0 głosów
1 odpowiedź 119 wizyt
pytanie zadane 11 maja 2020 w Python przez Kisielewsky Użytkownik (830 p.)
0 głosów
1 odpowiedź 179 wizyt
pytanie zadane 26 czerwca 2019 w Python przez Ventre90 Obywatel (1,150 p.)
0 głosów
1 odpowiedź 1,710 wizyt
pytanie zadane 1 lutego 2016 w Python przez Devero Początkujący (300 p.)
Porady nie od parady
Zadając pytanie postaraj się o poprawną pisownię i czytelne formatowanie tekstu.Kompozycja

84,758 zapytań

133,561 odpowiedzi

295,987 komentarzy

56,012 pasjonatów

Motyw:

Akcja Pajacyk

Pajacyk od wielu lat dożywia dzieci. Pomóż klikając w zielony brzuszek na stronie. Dziękujemy! ♡

Oto dwie polecane książki warte uwagi. Pełną listę znajdziesz tutaj.

...