从函数返回变量并打印所述变量

时间:2015-08-19 11:49:56

标签: python function variables printing running-total

在我的下面的代码中,我运行了一个二十一点游戏,我希望任何一个手(用户或经销商)都有一个功能。当我运行代码时没有出现错误,但是当我调用该函数时,不会打印总的手动值。它简单地说明了#34;这为你提供了总共:"这个数字是空白的。请参阅以下代码:

user_name = input("Please enter your name:")

print ("Welcome to the table {}. Let's deal!".format(user_name))

import random

suits = ["Heart", "Diamond", "Spade", "Club"]

ranks = ['A', '2', '3', '4', '5', '6', '7', '8', '9', '10', 'J', 'Q', 'K']

deck = [(suit, rank) for rank in ranks for suit in suits]

random.shuffle(deck,random.random)

user_hand = []

dealer_hand = []

user_hand.append(deck.pop())

dealer_hand.append(deck.pop())

user_hand.append(deck.pop())

dealer_hand.append(deck.pop())

def handtotal (hand):

    total = 0

    for rank in hand:

        if rank == "J" or "Q" or "K":

            total += 10

        elif rank == 'A' and total < 11:

            total += 11

        elif rank == 'A' and total >= 11:

            total += 1

        elif rank == '2':

            total += 2

        elif rank == '3':

            total += 3

        elif rank == '4':

            total += 4

        elif rank == '5':

            total += 5

        elif rank == '6':

            total += 6

        elif rank == '7':

            total += 7

        elif rank == '8':

            total += 8

        elif rank == '9':

            total += 9

    return total

    print (total)

print ("Your current hand is {}".format(user_hand))

print ("This provides you with a total of:")

handtotal(user_hand)

2 个答案:

答案 0 :(得分:2)

print(total)放在return total之后没有多大意义,因为return会导致函数立即终止而不会评估返回语句*之后的任何行。相反,尝试在函数定义之外添加print

print ("This provides you with a total of:")

print(handtotal(user_hand))

*(有一些使用try-except-finally块的极端​​情况,但大部分时间都是如此。)

答案 1 :(得分:0)

首先回答你的问题:

没有什么是打印的原因是因为你在打印之前返回了手的价值,因此永远不会得到你的打印声明。

return total #Stops the function

print (total) #Never gets reached

为什么会发生这种情况?

一个简单的思考方式就是一旦你回归&#39;一个价值,你基本上告诉python
&#34;这是答案,不需要做任何其他事情,你有你想要的东西&#34;
你在返回陈述后直接放置的任何东西都将永远跑。

有多种方法可以解决这个问题:
A)将print语句移到返回上方:

print (total)

return (total)

B)您只需删除print语句并引用该函数的值(这是总数,因为这是返回的内容)

    return total

print ("Your current hand is {}".format(user_hand))

print ("This provides you with a total of:" + str(handtotal(user_hand)))

你可以只使用str()返回语句,但我认为你希望能够在某个时刻将该值与经销商进行比较。

但是现在您的代码中存在三个当前最大的问题:

1st。您正在使用输入作为名称。
- 这是非常糟糕的做法,因为用户必须知道他们应该在答案旁边加上引号来表示它是一个字符串。

Please enter your name:russell
Traceback (most recent call last):
  File "/test.py", line 1, in <module>
    user_name = input("Please enter your name:")
  File "<string>", line 1, in <module>
NameError: name 'russell' is not defined

解决方案:请改用raw_input()。
- 这会将答案转换为字符串。

第二。这一行:

if rank == "J" or "Q" or "K":

不检查等级的值#&#34; J&#34;,&#34; Q&#34;和&#34; K&#34;

这实际上意味着:排名==&#34; J&#34; OR是&#34; Q&#34;真实&#34; K&#34; truthy

因为&#34; Q&#34;和&#34; K&#34;非空字符串,Python将它们视为True,这意味着现在您的值总是达到20,因为无论如何,第一个if语句将始终为真。

你真正想要的是:

if rank in {"J","Q","K"}

但是这也因为:而胜出

第三。只是说:

for rank in hand:

不会让它看到等级的实际价值。它仍然会看整个元组。
前。
排名=(&#39;钻石&#39;,&#39; 7&#39;)为rank!=&#39; 7& #39;

解决方案:您实际上想要撤消所有if语句并使用&#39;:

    if "J" in rank or "Q" in rank or "K" in rank:

        total += 10

    elif 'A' in rank and total < 11:

        total += 11

    elif 'A' in rank and total >= 11:

        total += 1

    ...


附:这也是有效的,因为在Spade,Diamond,Club或Heart中没有大写字母A,K,Q或J,否则该套装总是会得到卡的价值,而不是实际价值。但在这种情况下,这不是一个问题。