目录
1.1 Python 的语句
print("hello,world")
print,顾名思义,就是打印。只不过不会打在打印机上,而是打在屏幕上。运行它,会在屏幕上产生下面的输出:
hello,world
下面程序的意思是,分两行输入两个数,输出它们的和:
a=int(input())
b=int(input())
print(a+b)
input,顾名思义,就是输入。这个程序运行后,输入一个数按 Enter 键,再输入一个数按 Enter 键,程序就会打出两个数的和。
Python程序每一行可以称为一条语句。
Python程序是用英文字母、数字、标点符号和空格写成的。应该在英文而非中文输入状态下输入程序,确保输入的字符都是英文半角的字符。如果输入各种中文全角的标点符号或空格(中文的标点符号和空格看起来比英文的更宽),那么Python的开发环境往往就会在下面用触目惊心的红色波浪线提示语句非法。
常见错误:将Python程序中的标点符号打成全角的中文字符,如将'、(、)、"、:打成‘’、“”、(、)、:,或将空格打成全角的空格,都是不允许的。
除非满足必须缩进的特定条件,Python 程序每一行都要靠左顶格书写,前面不能加空格。比如下面的程序:
a=int(input())
b=int(input())
print(a+b)
第二行行首加了空格,是不允许的。有的开发环境就会在本行开头处加红色下画线,提示错误。
在一行的中间加些空格,往往没有关系。比如“b=a”和“b=a”是一样的,“print(a+b)”和“print(a+b)”也一样。
如果一条Python语句太长看着不方便,则可以分若干行写,但并不是随便在什么地方断行都可以。如果要随意断行,那么就要在断行处写“\”(在有些地方断行可以不写“\”)。一条语句分多行的情况下,除第一行外,其他行随便怎么缩进都行。例如:
c=1 + 2 \
+ 3
print("hello",
c)
print("hello \
world")
输出:
hello 6
hello world
1.2 注释
软件一般都是由多个程序员合作开发的,因此一个程序员常常需要阅读别人编写的代码。想读懂别人编写的代码并非易事,常常会读着读着就恨不得干脆自己重写一遍。即便是自己写的程序,过了一两个月再看,很可能也会想不起来某段代码在做什么,为什么要那样写,甚至会破口大骂是哪个笨蛋写出这样的东西。因此,在程序中需要书写一些提示,或者解释性的文字,用以说明某段代码的作用。很多公司还会要求程序员在程序里面写上自己名字,以免出了bug找不到责任人。这部分说明性的、用于帮助别人或自己理解程序的文字,不是程序的一部分,不会被执行,就称为注释。几乎所有的程序设计语言都支持注释。在实际的软件开发工作中,写程序不写注释,就是不讲“码德”。
有的时候,对于某段代码,想将其删掉或者修改,但又拿不准这么做是否正确,也可以将删改前的代码变成注释保留在程序中,以后要恢复就容易了。
Python中的注释以“#”开头,从“#”开始到行末都是注释。例如:
#下面输入两个数,输出其和
a = int(input()) #输入a
b = int(input()) #输入b
print(a+b) #输出a+b的值
注释不是程序的一部分,因此用什么文字写都行。
有时候想把连续多行都变成注释,在每行开头加“#”显然比较麻烦。在Python开发环境里,选中这些行,然后将Ctrl键和“/”键一起按下,就可以自动在每行前面都添加“#”,将这些行都变成注释。再按“Ctrl+/”组合键,又可以将其恢复成正常代码。
有许多教材和网络资料,称Python有一种多行注释,是用一对三个引号括起来的,这是不正确的说法,7.2节会细说。
1.3 常量
各种程序设计语言中都有“常量”的概念,表示固定不变的数据。Python中的常量有整数(如123)、小数(如34.12)、字符串(如"hello")、True(表示真)、False(表示假)、None(表示啥也不是)等。。下面程序打印出一些常量:
1. print(123) #>>123
2. print(34.54) #>>34.54
3. print("hello") #>>hello
4. print(0b1101) #>>130b表示二进制整数
5. print(0xa8) #>>1680x表示十六进制整数
6. print(None) #>>None
7. print(True) #>>True
第4行:二进制整数常量以0b开头。比如0b10就是2。
第5行:十六进制整数常量以0x开头。比如0xf就是15。
在本书中,为讲解方便,大部分程序都会像上面的程序一样,每行前面都会加行号。须知真正可以运行的程序是不允许带行号的,也不能没理由就在行首加空格。
在本书中,大量使用注释对程序进行讲解。这些注释的目的是帮助初学者掌握Python语言。对程序员来说,本书程序中绝大部分注释都没有必要,是不该写的。
在本书中,注释中的“#>>”表示后面就是本行输出的结果。“>>”不是输出结果的一部分。“>>”也不是写注释必需的。
1.4 变量
各种程序设计语言中都有“变量”的概念。变量是用来存储数据的,它有名字,其值可变。例如:
1. a=12
2. b=a #让b的值变得和a一样
3. print(a+b) #>>24
4. a="hello"
5. print(a) #>>hello
第1行:a就是个变量,它的值被设置成12。
第2行:b也是个变量,它的值被设置成和a的值一样。
第3行:输出a+b的值,所以输出24。
第4行:将a的值改成字符串"hello"。
第5行:输出变量a的值,于是输出hello。
Python中变量的名字,由英文大小写字母、数字和下画线构成,中间不能有空格。不能以数字开头,长度不限。
变量名最好能够体现变量的含义(虽然语法上无此要求),这样做便于理解程序。必要时应该使用多个单词作为变量名,以便一眼看出变量的作用。多单词的变量名,最好第一个单词小写,后面每个单词首字母大写。
Python中变量名的大小写是有区别的,即a和A、name和Name是不同的变量。
Python预留了一些有特殊用途的名字,称为保留字。保留字不可用作变量的名字。部分保留字如下:
andasassertbreakclasscontinuedefdelelifelseexceptexecforfinallyfromglobalifimportinislambdanotorpassprintraisereturntrywhilewithyield
如果用保留字作为变量名,Python会报错。
1.5 赋值语句
赋值语句格式如下:
变量 = 表达式
其作用是对变量进行“赋值”,即将变量的值变得和“表达式”的值一样。变量、数、字符串等,以及它们通过各种运算符号组合在一起,都可以称为“表达式”。“表达式”在Python中是一个很宽泛的概念,没有必要严格描述其定义。
赋值语句中的“=”称为赋值号,不要将其理解为数学上的等号。赋值号左边必须是变量。对一个变量的首次赋值,称为对这个变量的“定义”。
1.6 Python 数据类型
Python语言中的数据,有不同的类型。例如,有整数类型的数据如123、100,字符串类型的数据如"hello"、"123"。每种数据类型有特定的名字,比如整数这种类型,名字就是int。表2.7.1列出了Python中的各种数据类型的名字、含义以及数据示例。
名称 | 含义 | 数据示例 |
bool | 布尔(真假) | True False |
int | 整数 | 0 2345 6899899 |
float | 小数 | 3.2 1.5E6 |
complex | 复数 | 1+2j |
str | 字符串 | "hello" '1233' 'a' |
list | 列表 | [1,2,'ok',4.3] |
tuple | 元组 | (1,2,'ok',4.3) |
dict | 字典 | {"tom":20,"jack":30} |
set | 集合 | {"tom",18,71,1200} |
1.5E6也可以写成1.5e6,表示1.5×106。
bool类型的数据,只有两个取值,True和False(注意首字母都是大写),表示真和假。其余数据类型后文会有详解。
1.7 字符串简介
1.7.1 字符串的基本概念
Python中的字符串,代表一串文字,可以而且必须用单引号、双引号或三单引号、三双引号括起来。例如:'abc'、"123你好"、'''67,3'''、"""thisisok"""等。字符串中可以出现中文。程序示例:
x = "Hello,world!" #x的值是个字符串,其中的文字是Hello,world!
print(x) #>>Hello,world!
x = "I said:'hello'"
print(x) #>>I said:'hello'
print('我说:"hello" ') #>>我说:"hello"
print(' ' 'I said:'he said "hello" '.' ' ') #>>I said:'he said "hello" '.
print(" " "I said:'he said "hello" '." " ") #>>I said:'he said "hello" '.
使用单引号、双引号或三单引号,基本无区别。如果字符串中本身包含单引号,那么用双引号括起来较好,否则字符串中的单引号还要用后文提到的“转义字符”来表示,不太方便。同理,如果字符串中本身包含双引号,那么用单引号括起来比较好。
""和''也是字符串,里面一个字符也没有,称为“空串”。
常见错误:误以为字符串里面可以包含变量。需要强调的是,用各种引号括起来的,就是字符串,引号括起来的部分,就是一个个字符(文字),字符串里面不会包含变量。
想要输出一串文字就要通过字符串。print(hello,world)这样的语句不会输出“hello,world”,因为语句中的hello,world没有用引号括起来,不能代表一串文字,而是代表两个变量hello和world。
1.7.2 字符串的下标
有n个字符的字符串,其中的每个字符,从左到右依次编号为0,1,2,...,n−1。从右到左依次编号为−1,−2,...,−n。编号也称为“下标”。通过在中括号中填入下标的方式,就能查看字符串中指定位置的字符:
a = "ABCD"
print (a[0]) #>>A
print ("ABCD"[2]) #>>C
print (a[-1]) #>>D
i = 3
print(a[i]) #>>D变量也可以作为下标
值为整数的表达式,都可以作为下标使用。
Python中,单个字符,就是长度为1的字符串。上面程序中的a[0],a[−1]都是长度为1的字符串。
字符串中的字符是不能修改的。例如:
a = "ABCD"
a[1]= "K"
上面第二条语句试图修改a中下标为1的字符,这是不可行的,会引发运行时错误。
1.7.3 连接字符串
用“+”可以将若干个字符串连接起来得到新的字符串。若a和b都是字符串,则a+b也是一个字符串,内容是a的内容后面再拼接上b的内容:
a = "ABC"
b = "123"
a = a + b
print(a) #>>ABC123
a = a + a[1] #a[1]是单个字符,也是长度为1的字符串
print(a) #>>ABC123B
a += b #a += b等价于a = a+b
print(a) #>>ABC123B123
1.7.4 用 “in” “not in” 判断子串
一个字符串中连续的一部分,称为该字符串的子串。一个字符串的子串,也包括它自身。经常需要判断一个字符串是否是另一个字符串的子串。若a是b的子串,则ainb的值就是True,否则就是False。若a不是b的子串,则anotinb的值就是True,否则就是False:
a = "Hello"
b = "Python"
print("el" in a) #>>True
print("th" not in b) #>>False
print("lot" in a) #>>False
1.7.5 字符串和数值的转换
字符串和数值,可以互相转换。具体做法如下:
int(x) 把字符串x转换成一个整数
float(x) 把字符串x转换成一个小数
str(x) 把数值x转换成一个字符串
eval(x) 把字符串x看作一个Python表达式,求其值
“把x转换成……”是一种约定俗成的说法,从字面上看是x变了,其实上述转换操作不会改变x,而会生成一个新的值。所以如果较真的话,精确的说法是“从x转换出一个……”。在这个问题上,本书还是遵循惯例不较真吧。请看程序示例:
1. a = 15
2. b = "12"
3. c = a + b #错误的语句,字符串和整数无法相加
4. print (a + int(b) #>>27b没有变成整数,int(b)的值是整数12
5. print (str(a) + b) #>>1512str(a)的值是字符串'15'
6. c = 1 + float("3.5") #float("3.5")的值是小数3.5
7. print(c) #>>4.5
8. print(3 + eval("4.5")) #>>7.5
9. print(eval("3 + 2")) #>>5
10. print(eval(" 3+ a")) #>>18
eval(x)的值,是将字符串x的内容看作Python表达式后,求这个表达式的值得到的结果。例如,第8行的eval("4.5"),将字符串"4.5"中的文字4.5看作一个Python表达式,那么其值就是小数4.5。。同理,第9行,将3+2看作Python表达式,其值就是5。第10行,eval("3+a")的值就是表达式3+a的值。由于此时a的值为15,因此3+a的值是18。
需要注意的是,int(x)要求字符串x必须是整数的形式(只包含数字),float(x)要求字符串x必须是整数或者小数的形式,否则转换不合法,会导致程序运行出错。
常见错误:初学者程序出现运行时错误(RuntimeError),经常是由于做了不合法的转换。如x为"a12"或"12.34"时做int(x),或x为"abc"时做float(x)。将字符串与数值相加也会导致运行时错误。
另外,int(x)也能用于从小数x转换出整数,转换的规则是去尾取整,即一律舍弃小数点后面的部分。例如,int(4.9)的值是4。round(x)则求得和小数x最接近的那个整数,例如round(4.9)的值是5。round不是四舍五入,因为四舍五入是不公平的,长此以往将导致偏大的累积误差。round的策略是五有时舍,有时入。比如round(4.5)和round(3.5)的值都是4。
1.8 输入和输出
1.8.1 输出语句 print
Python用print语句进行输出。print语句格式如下:
print(e1,e2,e3......)
准确地说,print是个“函数”,括号内的是函数的参数。参数e1,e2,e3......都是表达式,可以有任意多项。上面的语句会依次输出每项的值,各项之间用空格分隔,然后换行。换行的意思是,下次再执行print,就会输出新的一行。例如:
print("hello")
print("world")
上面程序的输出结果是:
hello
world
如果不希望print换行,则可以用end参数指定输出的结束符。例如:
print(x,y,z,...,end=" ")
上面程序会连续输出多项,各项之间以空格分隔,输出以后不换行。end=""表示结束符是空串。不指定end就默认end的值是换行字符,因此会导致换行。
print(1,2,3,end="")
print("ok")
print("hello",end="!?")
上面程序的输出结果是:
1 2 3ok
hello!?
请注意,输出完“1 2 3”后没有换行 ,下次再执行print("ok")就在同一行紧接着输出。
print输出多项的时候,可以用sep参数指定分隔符:
print(3,4,5,sep=",")
print(3,4,5,sep=" ") #分隔符是空串就等于没有分隔符
print(3,4,5,sep="..")
输出:
3,4,5
345
3..4..5
1.8.2 输入语句 input
Python中输入语句格式如下:
x = input(y)
x是变量,名字随意。y是字符串,或任何值为字符串的表达式。y也可以不写。
此语句输出y,并等待输入。输入并按Enter键后(注意一定要按Enter键),input(y)的值就是输入的文字,并且该值被赋给x。y可以是提示信息。如果不写y,就不会输出任何信息,直接等待输入。例如:
s = input("请输入你的名字:")
print(s + ",你好!")
程序运行时显示:
请输入你的名字:
然后等待你输入。输入“Tom Lee”后按Enter键,程序输出:
Tom Lee,你好!
运行起来效果如下:
请输入你的名字:Tom Lee↙
Tom Lee,你好!
本书用斜体字表示输出部分,下划线表示键盘输入部分,↙表示按Enter键。
注意:执行x=input()后,x的值一定是一个字符串,哪怕你输入的是一个整数。
在PyCharm中运行需要输入的程序,则在PyCharm下方的窗口进行输入,输出结果也会出现在下方,如图1.8.1所示。图1.8.1中的PyCharm程序运行时,分两行输入4和5,输出9。
注意:使用一次input()会输入一行的内容。如果是在一行里输入数据,比如一行里面有多个整数用空格隔开,那么也只能用一次input()。如何用一次input就得到多个整数,后文会交代。如果输入数据有n行,就必须要用n次input()。
1.8.3 输出格式控制
s = 1.75
print("I am s m tall") #>>Iamsmtall
我们已经知道,上面的程序并不会输出“I am 1.75 m tall”。然而,将变量s的值嵌入到输出结果里面,又是本能的需求。解决办法之一,就是使用“格式控制符”。
有一些以“%”开头的字符组合,用在字符串中,可以指明此处需要用某个常量或变量的值替代,这样的字符组合称为“格式控制符”。常见的格式控制符如下:
%s 表示此处要用一个字符串替代
%d 表示此处要用一个整数的十进制形式替代
%x 表示此处要用一个整数的十六进制形式替代
%f 表示此处要用一个小数替代
%.nf 表示此处要用一个小数替代,保留小数点后面n位,四舍六入,五则可能入也可能舍(注意,有“.”)
注意:格式控制符只能出现在字符串中。
下面是程序示例:
1. age = 18
2. s = "I am %d years old." % age
3. print(s) #>>Iam18yearsold.
4. h = 1.746
5. print("My name is %s,I am %.2fm tall." % ("tom",h))
6. #>>My name is tom,I am 1.75m tall.
7. print("%d%s" % (18,"hello")) #>>18hello
8. print("%.2f,%.2f%%,%x" % (5.225, 5.325, 255)) #>>5.22,5.33%,ff
第2行:"%d"表示此处应该用一个十进制整数替代。包含格式控制符号的字符串,后面跟一个"%",后面再跟着用来替代格式控制符号的表达式,就会形成一个替换后的字符串。本行赋值号右边就形成了一个将"%d"替换成age的值18以后的字符串,即"Iam18yearsold."。要得到同样的字符串,也可以写为:
s = "I am" + str(age) + "years old."
第5行:如果字符串中包含多个格式控制符,则需将用以替换的多个表达式,用括号括起来,并用逗号隔开。本行中,"tom"用以替换"%s",h的值用以替换"%.2f"。"%.2f"指明此处小数只保留小数点后面2位,所以替换的结果就是1.75。"%f"则一般默认保留小数点后面6位。
第8行:要表示"%"字符本身,就要连写两遍。%x表示其对应的整数255应该呈现十六进制形式,即ff。
格式控制符应该与其对应的替换表达式类型匹配。比如下面这个表达式是非法的:
"Please give me %d dollars" % "123"
因为"%d"要求替换项必须是个值为整数的表达式,而"123"是个字符串,所以非法。
1.9 列表简介
1.9.1 列表的基本概念
列表是任意多个元素的有序集合,元素的类型可以不同,形式如下:
[元素0,元素1,元素2......]
例如:[1,2,3],[1,'jack',4,21]都是列表。[]也是列表,是一张没有元素的空列表。
列表的元素,在内存中是连续存放的。列表有序,体现在每个列表元素都有一个编号,即下标。下标从0开始。通过将下标填入[]中的形式,可以访问列表的特定元素。即如果a是列表,x是下标,则a[x]表示a中下标为x的元素。例如:
empty = [ ] #empty是空表
list1 = ['Xiaomi', 'Runoob', 1997, 2000]
list2 = [1, 2, 3, 4, 5, 6, 7]
print(list1[0]) #>>Xiaomi
list1[2] = 'ok' #更改了列表中下标为2的元素,即1997
print(list1) #>>['Xiaomi', 'Runoob', 'ok', 2000]
列表下标的使用规则和字符串一样,一个有n个元素的列表,元素的下标从左到右依次为0,1,2,...,n1,从右到左依次为1,2,...,n。n个元素的列表,下标合法的范围就是0到n−1,以及−1到−n。任何值为整数的表达式,都可以作为下标使用。但是,如果下标超过合法下标的范围(称为“下标越界”),就会引发程序运行时错误。
常见错误:列表、字符串或元组的下标越界,是引发程序运行时错误的最常见原因之一。
和字符串类似,也可以用ainb和anotinb判断元素a是否在列表b中。例如:
lst = [1,2,3,"4",5]
print(4 in lst) #>>False
print("4" in lst) #>>True
print(3 not in lst) #>>False
第2行结果为False,是因为整数4并不在列表lst里面,lst里面有的是字符串"4"。
1.9.2 字符串分割成列表
若x是字符串,则x.split()的值是一个列表,包含字符串x经空格、制表符(对应键盘上的Tab键)或换行符分割得到的所有子串。x.split()不会改变x。例如:
1. print("ab cd hello".split()) #>>['ab', 'cd', 'hello']
2. s = "12 34"
3. print(s.split()) #>>['12', '34']
4. print("34\t45\n7".split()) #>>['34', '45', '7']
5. print("abcd".split()) #>>['abcd']
第1行:字符串"abcdhello"用空格分割后的结果是一个列表,里面包含分割后得到的子串,即列表['ab','cd','hello']。
第4行:"\t"表示制表符,"\n"表示换行符。print("34\t\t45\n7")的结果如下:
34 45
7
第5行:"abcd"中没有空白字符,所以分割后的结果就是一个只有一个字符串的列表。本书后续例题和习题中,几乎每个程序都会用字符串的split功能来处理输入。
1.10 常见语法错误排查
程序有语法错误时,PyCharm会在代码底下划红色波浪线标识出来。将鼠标移到红线上,PyCharm会弹出错误提示信息。就算查英文词典也要搞清楚错误信息说的是什么。常见的出错信息有:
Unresolved reference 'x' x没定义
Unexpected indent 不该有的缩进
Colonexpected 少了冒号
再次强调,不要把标点符号输入成全角汉字的,这种情况下错误提示信息看上去不知道在说什么。
有时几行代码明明看着缩进是一致的,却会提示缩进相关错误。这可能是因为有的行缩进用的是Tab键,有的行用的却是和Tab等宽的4个空格字符。这种情况下,可以选中要缩进的若干行,按几次Shift+Tab组合键把它们都顶到最左边,然后再按Tab键让它们一起缩进。
注意:有时红线划在某一行,实际上错误却是在上一行的末尾,尤其是上一行末尾少写了一个")",造成括号不配对的时候。如果多写了一个")",提示信息却往往会是“Endofstatementexpected”。
1.11 OpenJudge 做题指南及例题讲解
本书的大部分例题和练习题,可以在“北京大学OpenJudge开放在线程序评测平台”的“程序设计实习MOOC”小组中的“Python程序设计基础及实践(慕课版)教材题集”比赛中找到。例题习题后面的编号,如“(P002)”就是题目在比赛中的编号。
OpenJudge上每个题目都会提到“时间限制”和“内存限制”。对后者我们不必关心。前者的意思是提交的程序必须在一定时限内可以运行结束,否则就会被判定为超时错误。如果不是对算法要求高的专业题目,一般来说也不必关心。OpenJudge上的题目的基本形式如下。
例题2.12.1:字符三角形(P002)
给定一个字符,用它构造一个底边长5个字符,高3个字符的等腰字符三角形。
输入:输入只有一行,包含一个字符。
输出:该字符构成的等腰三角形,底边长5个字符,高3个字符。
样例输入
*
样例输出
*
***
*****
所谓的“样例输入”和“样例输出”只是一个例子,用来解释前面对程序输入输出的要求。如果程序运行时输入“样例输入”中的内容,则输出就应该和“样例输出”一样。但是能做到这一点并不意味着你的程序已经正确,这只是第一步,离最终成功可能还有很远距离。题目不是只有固定的一种输入,对不同的输入数据,程序都应该按照要求产生输出才行。就本题来说,如果输入一个字符“A”然后按Enter键,程序就应该输出一个由"A"构成的字符三角形;如果输入字符“X”按Enter键,程序就应该输出一个由字符“X”构成的三角形……程序提交到OpenJudge以后,服务器会用多种输入数据对程序进行测试,必须对所有输入数据都能按题目要求产生输出,程序才算正确,才能得到一个“Accepted”的结果。在其他在线程序评测平台(OnlineJudgePlatform,简称OJ)做题,也是这样。
解题程序:
1. a = input()
2. print(" " + a) #" "是两个空格
3. print(" " + a + a + a)
4. print(a*5)
第1行:获取输入的字符,赋值给a。
第2行:输出两个空格紧接一个字符a。注意不能写成print("",a),那样的话,就会在两个空格和字符a之间再加一个空格,就不对了。
第3行:输出一个空格,再连着三个字符a。同理,不能写成print("",a,a,a)。
第4行:用字符串乘法会比写print(a+a+a+a+a)简单。
如果要写5个空格,也可以写成""*5。
写完程序,一定要先在本机测试,确保输入“样例输入”中的数据,程序的输出和“样例输出”一模一样,否则提交无意义。不能比样例多输出任何字符(包括空格),也不能少输出任何字符。输入“样例输入”的方法,是复制题目中的全部样例输入数据,粘贴,然后一定要按Enter键(以后“按Enter键”这件事就不再提了)。程序的输出和样例输入可能会混在一起,不必关心它们混在一起是什么样子,只要单独看程序输出部分,和“样例输出”一致即可。
样例数据通过以后,还应该自己构造一些输入数据,看看输出结果是否符合题目要求。
比如本题,应该输入“*”“A”“X”等多个字符试试。即便对你自己构造的各种输入数据,程序都能按题目要求进行输出,你的程序也未必正确。因为构造的数据很可能没有覆盖所有可能的情况。出题人设计的输入数据往往比较全面,会覆盖各种情况。有一些特别难考虑到的情况,可称之为“坑”。如果你的程序考虑不周,碰到“坑”就会掉进去,即因输出结果不对而被判定为错误,得到一个“WrongAnswer”的下场。
在OpenJudge上做题,程序提交以后,可能得到以下几种结果。
(1)Accepted(简称AC)
恭喜!你的程序正确!只有得到这个结果才算任务完成。
(2)WrongAnswer(简称WA)
程序不正确,输出了错误的数据。应该多编造一些输入数据进行测试,或仔细想想程序里面有没有逻辑错误。
(3)TimeLimitExceeded(简称TLE)
超时,不通过。一般每道题目都有时间限制,比如时限1000毫秒,就意味着你的程序必须在1000毫秒内运行结束。如果你的程序跑得太慢,运行时间超过时限,就会导致这种结果。程序有死循环永远不会结束,或者算法不好,都会导致超时。
(4)RuntimeError(简称RE)
程序产生运行时错误,简称RE。这种错误如果在本机发生,现象就是程序突然中止,并输出一些关于出错原因的信息。程序提交以后得到这个结果是很常见的。RE常由以下原因导致,如果碰到RE,可以对着以下几条来查错:
①不合法的转换,如int("abc")、int("12.45")。
②字符串和数值相加,如:
a = input()
b = a + 5 #字符串a和整数5相加导致RuntimeError
再次强调,执行input()读入的一定是字符串,哪怕你输入的是一个整数。不要忘了该做的转换。
③输入数据已经结束,还执行input()。比如题目中给出的输入数据只有2行,程序却执行了3次input(),那么第3次执行input(),无法获取输入数据,就会产生RE。
再次强调,执行一次input()只会读入一行,有几行输入就要用几次input()。
在本机测试程序的时候,如果是在PyCharm或IDLE中运行程序,则按Ctrl+D组合键表示输入结束。例如下面程序:
a = input()
b = input()
程序运行后,随便输入什么,按Enter键,输入的文字就会被赋值给a。然后按Ctrl+D组合键,此时程序就会出现RE。因为第2行的input()试图获取输入,然而Ctrl+D却宣告输入结束了。于是input()不会等待你继续输入数据,而是直接导致RE。
④使用了不合法的下标,如:
a = [1,2,3]
b = a[3] #RuntimeError!a的合法下标有0,1,2,3不是合法下标
⑤不能比较大小的两个数据比大小,比如字符串和整数比大小。
⑥除法或求余数运算的除数是0。
在本机运行程序,如果出现RE,会有出错信息告知哪行程序出错,为何出错;提交到OJ后,若产生RE,OJ不会提供任何可用于找bug的有用信息。所以一定要先在本机运行程序无误后再提交。
(5)PresentationError(简称PE)
输出格式错误。也可以恭喜一下,你的程序离正确只有一步之遥,只是输出的时候多了或少了空格,该换行没换行,或不该换行却换行。仔细检查输出的格式,就可以排除这个错误。
例如,print(a,b)会导致a,b两项之间有空格输出,这个空格很可能是多余的,不符合题目要求。多出来的空格可能导致此错误,也可能导致WrongAnswer。
不过,在OpenJudge上,如果仅在行的末尾多输出空格,是没有关系的,不会导致这个错误,也不会WA。
(6)OutputLimitExceeded(简称OLE)
程序有死循环导致没完没了地输出,就会引发这个错误。
(7)MemoryLimitExceeded(简称MLE)
程序使用的内存超出了限制。本书的例题和习题一般不会碰到这个问题。