web-dev-qa-db-ja.com

Python:関数からの戻り値に別の関数でアクセスする

私はプログラミング全般に少し慣れていないので、Pythonを使い始めたばかりです。そして、私は数推量プロジェクトに取り組んでいます。

import random

def main(): # main function
    print("Welcome to the number guesser game")
    range_func()
    max_guess_number(lower_range_cut, upper_range_cut)
    evaluation(random_number, total_guesses)

def range_func():   # allows user to select a range for the number guess
    print("Please select a range in which you would like to guess.")
    lower_range_cut = int(input("Lower boundary limit: "))
    global lower_range_cut
    upper_range_cut = int(input("Upper boundary limit: "))
    global upper_range_cut
    random_number = random.randint(lower_range_cut,upper_range_cut)
    global random_number
    return lower_range_cut, upper_range_cut, random_number

def max_guess_number(low,high): # returns the total number of guesses
    total_numbers = (high - low) + 1
    total_guesses = 0
    while (2**total_guesses) < total_numbers:
        total_guesses += 1
    print ("You have a total of %d guesses\n"
           "for your range between %d to %d"
           % (total_guesses, low, high))
    global total_guesses
    return total_guesses

def evaluation(random_number, total_guesses): # evaluates the users input
    guess_count = 0
    while guess_count < total_guesses:
        user_guess = int(input("Your guess: "))
        print("Your guess is: %d" % (user_guess))
        if (random_number == user_guess):
            print("You got it ")
            break
        Elif user_guess > random_number:
            print("Guess lower!")
            guess_count += 1
        else:
            print("Guess higher!")
            guess_count += 1

if __name__ == "__main__":
    main()

それを書いているときに経験した1つの問題は、各変数をグローバル変数として再定義しないとこのプログラムを実行できなかったことです。 1つの関数から値を返すだけでは、アクセスできませんでした。 range_functionから2番目に返された変数upper_range_cut

それをどうにかして短くする方法はありますか?

また、コード自体に関するすべてのメモ(読みやすさ、関数の使用、長さ)にも満足しています。リストの内包表記を使用することで、このコードを大幅に短縮できたかもしれませんが、まだこの分野での機会を見ることはできません。

助けてくれてありがとう!

キリビオ

5
KiliBio

あなたはほとんどそこにいます。すべてのグローバルを削除し、各関数から返された値をローカル変数に格納して、新しい関数に渡すだけです。

以下に加えた他の唯一の変更は次のとおりです。

そうでなければあなたは格好良いです。

import random

def main(): # main function
    print("Welcome to the number guesser game")
    lower, upper, Rand = range_func()
    total_guesses = max_guess_number(lower, upper)
    evaluation(Rand, total_guesses)

def range_func():   # allows user to select a range for the number guess
    print("Please select a range in which you would like to guess.")
    lower_range_cut = int(input("Lower boundary limit: "))
    upper_range_cut = int(input("Upper boundary limit: "))
    random_number = random.randint(lower_range_cut, upper_range_cut)
    return lower_range_cut, upper_range_cut, random_number

def max_guess_number(low,high): # returns the total number of guesses
    total_numbers = (high - low) + 1
    total_guesses = 0
    while (2**total_guesses) < total_numbers:
        total_guesses += 1
    print ("You have a total of %d guesses\n"
           "for your range between %d to %d"
           % (total_guesses, low, high))

    return total_guesses

def evaluation(random_number, total_guesses): # evaluates the users input
    guess_count = 0
    while guess_count < total_guesses:
        guess_count += 1
        user_guess = int(input("Your guess: "))
        print("Your guess is: %d" % (user_guess))
        if (random_number == user_guess):
            print("You got it!")
            break
    else:
        print "Sorry, you didn't guess it in time. The answer was: %d" % random_number

if __name__ == '__main__':
    main()
3
misshapen

globalを定義する必要はありません。関数から返す値を変数に割り当てるだけです。

簡単な例:

def add(a, b):
    """This function returns the sum of two numbers"""
    return a + b

今、あなたのコンソールでは、次のことができます

# print the return
>>> print(add(2, 3))
5

# assign it to a variable
>>> c = add(2, 3)
>>> c
5

main関数では、さまざまな関数から返される値を変数に割り当て、さらに他の関数に渡すことができます。

def main(): # main function
    print("Welcome to the number guesser game")
    lower_range_cut, upper_range_cut, random_number = range_func()
    total_guesses = max_guess_number(lower_range_cut, upper_range_cut)
    evaluation(random_number, total_guesses)
1
AKS