Python 缩进中的制表符和空格的不一致使用
这里的单词 缩进 是指在开始任何语句或代码块时使用的 空格数 和 制表符 的数量。在特定代码块结束时,这些空格和制表符的使用必须相匹配;因此,它指的是特定代码块的正确缩进。
- 缩进被用于Python编程语言中,起着非常重要的作用。
- 为了初始化任何代码块或开始某个代码块,缩进被用来识别该代码块。
- 在其他编程语言中,如C、C++、Java、C#等,缩进对于开始任何代码块都没有关系。
- 这些语言使用大括号来表示代码块,而不是缩进。
- 但在Python编程语言中,缩进是有关紧要的。整个代码及其运行过程仅从匹配的缩进块开始。
- 在Python编程语言中,与其他编程语言(如C、C++、C#、Java等)相比,我们没有主函数的概念。
- 代码的初始代码块不包含任何空格和制表符,最终表示主函数;之后,根据程序员的要求,他们将根据需要使用if-else、for循环等更改缩进。
- 不一致地使用空格和制表符进行缩进会生成语法错误。
- 当我们使用任何特定的编程语言编码时,我们需要记住相应的语法,因此不要应用不必要的空格。
- 如果我们不必要地使用空格和制表符,它将相应地生成特定的错误。
- 如果我们谈论Python编程语言,它更关注适当的缩进和正确使用空格和制表符以访问代码。
- 如果我们谈论C编程语言,它更关注在特定位置适当使用括号以开始和结束特定的代码块。
- 但是,假设我们在C语言中不必要地使用空格和制表符。在那种情况下,编译器会忽略它,因为C编译器的工作预定义为在执行程序时忽略所有空格和注释。
Python中的缩进是如何工作的
这里的缩进术语指的是在开始任何代码块之前和某个代码块结束之前使用的制表符和空格的数量相匹配,因为它最终代表了一个代码块。同样地,通过这种方式,我们可以使用嵌套代码块,但该代码块的缩进是从块到块引用的。
如果我们谈论起始块,不需要任何空格和制表符,但是当我们进一步前往即将到来的第二个代码块时,我们使用2个空格。在开始特定代码块时,为了结束它,我们会做相同的事情并应用2个空格,这表示该代码块的结束。
如果我们想要包含更多的嵌套代码块,我们将比以前的代码块应用更多的空格,这表明下一个嵌套代码块的开始。我们将应用与我们在开始该代码块时相同数量的空格以表示其结束。
同样,在这种方式中,我们可以添加更多的嵌套块,每个块的开始和结束在表示特定代码块时使用的空格数将有所不同。但是,随着我们在嵌套内部使用嵌套代码块,空格和制表符的数量也增加了。
在Python编程语言中,每个代码块的缩进在指示特定代码块时起着非常重要的作用。
当我们不一致地使用空格和制表符时会发生什么
正如我们所谈论的Python编程语言,在不必要的地方不一致地应用空格的数量时,将最终生成缩进错误。
当我们正确开始代码块时,但在结束时使用不规则使用多个空格和制表符来指示该特定代码块时,将产生错误,原因是空格和制表符数量不匹配。
如果我们谈论C编程语言,空格和制表符的数量是无关紧要的;它不会生成任何错误,因为C编译器会忽略它。但有时,在运行’scanf’函数和应用额外的空格时,可能会生成不寻常的结果;我们将通过对其进行更详细的讨论来了解。
如何纠正由于不必要的使用空格和制表符而导致的代码不一致性
为了纠正错误,我们必须遵循以下步骤:
- 识别生成错误的代码行。
- 观察该行并找到其对应的代码块。
- 通过计算空格和制表符的数量,匹配用于开始该代码块的空格数。
- 计算用于结束特定代码块的空格数;如果不匹配,则通过应用正确的空格和制表符数量进行纠正。
- 如果仍然存在错误,则将目标代码块的缩进与上方和下方的代码块进行匹配。为了匹配,类似于上述操作,检查用于开始每个代码块的空格数。它必须包含2个空格的差异。如果它们是嵌套的,则通过随机匹配空格数量纠正相应的缩进错误。
不一致使用制表符和空格的示例
现在让我们通过示例来更详细地了解:
示例1:
# Python Program to find the smallest odd number from the given number
n=int(input("Enter a number "))
i = n
count = 0
while( i != 0 ): # This loop will count the number of digits
# present in the given number
count = count + 1
i = i / 10
i = n
j = count - 1
A = [int(i) for i in str(n)] # This loop will allocate the each digits seperately in the list A
minodd = 10000
for i in A:
if( i % 2 != 0 ):
if( i < minodd ): # This condition will find the minimum odd digit
# present in the array, if any
minodd = i;
if ( minodd == 10000 ): # If in case no smallest odd digit found then it will
# assign the -1 to minodd, which indicates no odd digit found
minodd = -1
print("Minimum odd number found is: " , minodd )
上面程序的输出:
上面突出显示的代码块会因为开始该代码块的缩进错误而导致缩进错误,即空格和制表符的数量不匹配。即使是嵌套缩进也会影响上述代码块。
IndentationError: expected an indented block
例1的更正:
# Python Program to find the smallest odd number from the given number
n=int(input("Enter a number "))
i = n
count = 0
while( i != 0 ): # This loop will count the number of digits
# present in the given number
count = count + 1
i = i / 10
i = n
j = count - 1
A = [int(i) for i in str(n)] # This loop will allocate the each digits seperately in the list A
minodd = 10000
for i in A:
if( i % 2 != 0 ):
if( i < minodd ): # This condition will find the minimum odd digit
# present in the array, if any
minodd = i;
if ( minodd == 10000 ): # If in case no smallest odd digit found then it will
# assign the -1 to minodd, which indicates no odd digit found
minodd = -1
print("Minimum odd number found is: " , minodd )
以上程序的输出:
上述程序将会完美地工作,就好像错误已经通过匹配用于表示特定代码块的空格和制表符的数量而纠正了一样。
示例2:
# Python program to implement the file concept using readline() for reading a file
Fruit = [ "Apple\n" , "Graphs\n" , "Mango\n" , "Orange\n" , "Kiwi\n" ]
# Writing to a file
file1 = open('new.txt', 'w')
file1.writelines((Fruit)) # writelines is used to write the data into the file in # the form of list, by inserting multiple values at a same time,
# here we are taking new.txt file
file1.close() # This instruction is used to close the file, i.e., hello.txt
# Using readline()
file1 = open('new.txt', 'r')
count = 0
while True:
count = count + 1
# Get next line from file
s = file1.readline()
# if line is empty
# end of file is reached
if not s:
break
print("Statement{}: {}".format(count, s.strip()))
file1.close()
上述程序的输出:
上面突出显示的代码块将由于开头与结尾之间有不匹配的空格和制表符数量而导致缩进错误。甚至嵌套缩进也会影响上述代码块。
IndentationError: expected an indented block
示例2的更正:
# Python program to implement the file concept using readline() for reading a file
Fruit = [ "Apple\n" , "Graphs\n" , "Mango\n" , "Orange\n" , "Kiwi\n" ]
# Writing to a file
file1 = open('new.txt', 'w')
file1.writelines((Fruit)) # writelines is used to write the data into the file in # the form of list, by inserting multiple values at a same time,
# here we are taking new.txt file
file1.close() # This instruction is used to close the file, i.e., hello.txt
# Using readline()
file1 = open('new.txt', 'r')
count = 0
while True:
count = count + 1
# Get next line from file
s = file1.readline()
# if line is empty
# end of file is reached
if not s:
break
print("Statement{}: {}".format(count, s.strip()))
file1.close()
以上程序的输出为:
上述程序将完美运行,就好像通过匹配用于表示特定代码块的空格和制表符的数量来纠正了错误。
示例3:
// C Program to implement Binary search
// Array should be given in sorted order in ascending by the user
#include<stdio.h>
int bs( int a[] , int i ,int j ,int x ) // This function will return the corresponding
// index, where the given element found
// If the element was not present in the array,
// then it will return the -1
{
if ( i == j )
{
if ( a [ i ] == x )
{
return i ;
}
else
{
return ( -1 ) ;
}
}
else
{
int mid ;
mid = ( i + j ) / 2 ;
if ( x == a[ mid ] )
return mid ;
else
{
if ( x < a[ mid ] )
{
bs ( a , i , mid - 1 , x ) ;
}
else
{
bs ( a , mid + 1 , j , x ) ;
}
}
}
}
void main()
{
int A[ 100 ] , n , i , val ;
printf( " Enter size of Array: " ) ;
scanf (" %d " , &n ) ;
printf( " Enter Array \n " ) ;
for( i = 0 ; i < n ; i++ )
{
scanf ( " %d" , &A[ i ] ) ;
}
printf( " Enter element to search: " ) ;
scanf(" %d " , &val ) ;
int pos = bs( A , 0 , n , val ) ; // pos will hold the index
// value where the element found,
// if not found then it will simply print -1
printf( " Element found at : %d " , pos ) ;
}
上面程序的输出:
上面程序的输出可以正确生成。尽管它不会生成任何错误,但如果使用不必要的空格,我们将无法获得期望的输出。在scanf函数中多余的元素会干扰上述程序的工作。因此,这被称为上述程序中制表符和空格的不一致使用。
修正示例3:
// C Program to implement Binary search
// Array should be given in sorted order in ascending by the user
#include<stdio.h>
int bs( int a[] , int i ,int j ,int x ) // This function will return the corresponding
// index, where the given element found
// If the element was not present in the array,
// then it will return the -1
{
if ( i == j )
{
if ( a [ i ] == x )
{
return i ;
}
else
{
return ( -1 ) ;
}
}
else
{
int mid ;
mid = ( i + j ) / 2 ;
if ( x == a[ mid ] )
return mid ;
else
{
if ( x < a[ mid ] )
{
bs ( a , i , mid - 1 , x ) ;
}
else
{
bs ( a , mid + 1 , j , x ) ;
}
}
}
}
void main()
{
int A[ 100 ] , n , i , val ;
printf( " Enter size of Array: " ) ;
scanf (" %d" , &n ) ;
printf( " Enter Array \n " ) ;
for( i = 0 ; i < n ; i++ )
{
scanf ( " %d" , &A[ i ] ) ;
}
printf( " Enter element to search: " ) ;
scanf(" %d " , &val ) ;
int pos = bs( A , 0 , n , val ) ; // pos will hold the index
// value where the element found,
// if not found then it will simply print -1
printf( " Element found at : %d " , pos ) ;
}
上述程序的输出:
在上述程序中,只需移除scanf函数中的不需要的空格,输出就是完美的。
示例4:
// C Program to implement fibonacci series using tabulation method
#include<stdio.h>
#include<time.h>
int fib( int n ) // This function will return the fibonacci value
// for corresponding n values
{
if ( n <= 1 )
{
return 0 ;
}
if ( n == 2 )
{
return 1 ;
}
else
{
return fib( n - 1 ) + fib ( n - 2 ) ;
}
}
void main()
{
double time_spent = 0.0 ;
int i , n ;
printf( " Enter terms of fibonacci series \n " ) ;
scanf( " %d " , &n ) ;
printf( " Fibonacci series is : \n " ) ;
clock_t begin = clock() ;
for( i = 1 ; i <= n ; i++ )
{
printf(" %d" , fib( i ) ) ;
}
clock_t end = clock() ;
time_spent = time_spent + (double)(end-begin)/ CLOCKS_PER_SEC ;
printf( " \n %f secs " , time_spent ) ;
}
上述程序的输出:
由于有空格,即使程序正确也无法生成输出。
上述代码的更正如下:
示例4的更正:
// C Program to implement fibonacci series using tabulation method
#include<stdio.h>
#include<time.h>
int fib( int n ) // This function will return the fibonacci value
// for corresponding n values
{
if ( n <= 1 )
{
return 0 ;
}
if ( n == 2 )
{
return 1 ;
}
else
{
return fib( n - 1 ) + fib ( n - 2 ) ;
}
}
void main()
{
double time_spent = 0.0 ;
int i , n ;
printf( " Enter terms of fibonacci series \n " ) ;
scanf( " %d " , &n ) ;
printf( " Fibonacci series is : \n " ) ;
clock_t begin = clock() ;
for( i = 1 ; i <= n ; i++ )
{
printf(" %d" , fib( i ) ) ;
}
clock_t end = clock() ;
time_spent = time_spent + (double)(end-begin)/ CLOCKS_PER_SEC ;
printf( " \n %f secs " , time_spent ) ;
}
上面程序的输出:
在上面的程序中,通过在scanf函数中删除不需要的空格,输出是完美的。