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

2024-04-24 04:06:57 发布

您现在位置: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 + '.') 

为什么guessesTaken在Python中可以在任何时候声明变量的时候就在开头声明呢?你知道吗

我尝试了两种方法,一种是完全不使用那一行,另一种是将guessesTaken改为0以外的数字。在这两种情况下,它的工作方式似乎完全相同,因为range函数似乎管理guessesTaken。你知道吗

书中说:

Line 4 creates a new variable named guessesTaken :

4. guessesTaken = 0

You’ll store the number of guesses the player has made in this variable. Since the player hasn’t made any guesses at this point in the program, store the integer 0 here.

这并不能证明这条线的存在。你知道吗


Tags: oftheinnumberinputifisrange
3条回答

这并没有什么好的理由,但无论如何,对于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

循环之前的声明没有任何作用。它只是为了可读性或对代码的理解。你知道吗

首先,Python不需要声明变量;它们从上下文继承它们的类型,并且可以随心所欲地更改。您引用的行定义了guessesTaken;没有这样的声明。相反,global声明一个变量。你知道吗

正如Sam已经说过的,让你困惑的那句话(对你有好处!)是无用的:for语句充分定义了变量,以便在那里使用;第4行中给它的任何值都会被销毁;它可以很容易地被删除

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

在循环之前不使用guessesTaken的值,在循环sloppy变量使用之后,名称被重新定义为字符串(文本值高一个)。另外,请注意如何有独立的、排他的和详尽的if语句,这些语句应该是if - elif - else结构,以保持清洁和效率。你知道吗

简而言之,这不是一个学习编程风格的好例子。你知道吗

相关问题 更多 >