• 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

VPS Starter Arubacloud
0 głosów
284 wizyt
pytanie zadane 1 lipca 2019 w Python przez Ventre90 Obywatel (1,170 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 (344,100 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,170 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 (344,100 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,170 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 (344,100 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ź 326 wizyt
pytanie zadane 11 maja 2020 w Python przez Kisielewsky Użytkownik (830 p.)
0 głosów
1 odpowiedź 429 wizyt
pytanie zadane 26 czerwca 2019 w Python przez Ventre90 Obywatel (1,170 p.)
0 głosów
1 odpowiedź 2,253 wizyt
pytanie zadane 1 lutego 2016 w Python przez Devero Początkujący (300 p.)

92,453 zapytań

141,262 odpowiedzi

319,088 komentarzy

61,854 pasjonatów

Motyw:

Akcja Pajacyk

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

Oto polecana książka warta uwagi.
Pełną listę książek znajdziesz tutaj.

Akademia Sekuraka

Akademia Sekuraka 2024 zapewnia dostęp do minimum 15 szkoleń online z bezpieczeństwa IT oraz dostęp także do materiałów z edycji Sekurak Academy z roku 2023!

Przy zakupie możecie skorzystać z kodu: pasja-akademia - użyjcie go w koszyku, a uzyskacie rabat -30% na bilety w wersji "Standard"! Więcej informacji na temat akademii 2024 znajdziecie tutaj. Dziękujemy ekipie Sekuraka za taką fajną zniżkę dla wszystkich Pasjonatów!

Akademia Sekuraka

Niedawno wystartował dodruk tej świetnej, rozchwytywanej książki (około 940 stron). Mamy dla Was kod: pasja (wpiszcie go w koszyku), dzięki któremu otrzymujemy 10% zniżki - dziękujemy zaprzyjaźnionej ekipie Sekuraka za taki bonus dla Pasjonatów! Książka to pierwszy tom z serii o ITsec, który łagodnie wprowadzi w świat bezpieczeństwa IT każdą osobę - warto, polecamy!

...