为什么在使用之前声明此范围变量?

时间:2018-08-06 21:18:29

标签: python

我刚刚开始通过使用Python发明自己的计算机游戏。这是第3章的示例代码:

1   # This is a Guess the Number game.      
2   import random       
3   
4   guessesTaken = 0        
5           
6   print('Hello! What is your name?')      
7   myName = input()        
8           
9   number = random.randint(1, 20)      
10  print('Well, ' + myName + ', I am thinking of a number between 1 and 20.')      
11          
12  for guessesTaken in range(6):       
13      print('Take a guess.') # Four spaces in front of "print"        
14      guess = input()     
15      guess = int(guess)      
16          
17      if guess < number:      
18          print('Your guess is too low.') # Eight spaces in front of "print"      
19          
20      if guess > number:      
21          print('Your guess is too high.')        
22          
23      if guess == number:     
24          break       
25          
26  if guess == number:     
27      guessesTaken = str(guessesTaken + 1)        
28      print('Good job, ' + myName + '! You guessed my number in ' + guessesTaken + ' guesses!')       
29          
30  if guess != number:     
31      number = str(number)        
32      print('Nope. The number I was thinking of was ' + number + '.') 

为什么显然可以在Python中的任何时间声明变量时,为什么guessesTaken首先被声明?

我已经尝试过完全不使用该行,并且将guessesTaken更改为非0的数字。在两种情况下,它的工作原理似乎都完全相同,因为range函数似乎可以管理guessesTaken

这本书说:

  

第4行创建一个名为guessesTaken的新变量:

4. guessesTaken = 0
     

您将在此变量中存储玩家做出的猜测数目。   由于播放器此时尚未在程序中进行任何猜测,因此请在此处存储整数0

这并不能为我证明这条线的存在。

3 个答案:

答案 0 :(得分:3)

循环之前的声明没有任何作用。只是为了提高可读性或理解代码。

答案 1 :(得分:3)

首先,Python不需要声明变量。它们从上下文继承它们的类型,并且可以一时兴起。您引用的行定义 guessesTaken;没有这样的声明。相反,global声明一个变量。

就像Sam所说的那样,使您感到困惑(对您有好处!)的那一行是没有用的:for语句为该变量的使用充分定义了该语句;第4行赋予它的任何值都将被销毁;可能很容易

guessesTaken = ["My list", 7, True, "of useless data"]

在循环之前不使用guessesTaken的值,并且在循环之后将名称重新定义为字符串(文本值高一)-使用草率的变量。另外,请注意如何有独立的,排他的和详尽的if语句-这些应该是if - elif - else的构造,以确保整洁和高效。

简而言之,这不是学习编程风格的好例子。

答案 2 :(得分:2)

没有充分的理由,但是不管这是Python代码的一种奇怪结构。以这种方式对代码进行编码需要在循环退出后将循环变量保留在范围内(这在Py2和Py3中都是准确的)在编程上有点麻烦。我不能成为唯一一个认为以下方面的经验丰富的Python程序员:

for x in some_iter:
    frobnicate(x)

# x is undefined here

由于这个原因,我会完全避免使用这种结构,而是选择:

for guess_number in range(MAX_GUESSES):
    guess = int(input("Guess: "))
    if guess == number:
        # it took guess_number+1 guesses. Let the player know and:
        break  # or return
    elif guess > number:
        # too high, tell the player
    elif guess < number:
        # too low, tell the player
else:
    # you trigger the for/else block when you don't break from a for loop
    # so getting here means you've failed to guess in MAX_GUESSES tries
    # tell the player and handle it