【Python】第1章 Python语言的基本要素

目录

1.1   Python 的语句

1.2   注释

1.3   常量

1.4   变量

1.5   赋值语句

1.6   Python 数据类型

 1.7   字符串简介

        1.7.1   字符串的基本概念

        1.7.2   字符串的下标

        1.7.3   连接字符串

        1.7.4   用 “in” “not in” 判断子串

        1.7.5   字符串和数值的转换

1.8   输入和输出

        1.8.1   输出语句 print

        1.8.2   输入语句 input

        1.8.3   输出格式控制 

1.9   列表简介

        1.9.1   列表的基本概念

        1.9.2   字符串分割成列表

1.10   常见语法错误排查

1.11   OpenJudge 做题指南及例题讲解


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中的各种数据类型的名字、含义以及数据示例。

表1.6.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)
        程序使用的内存超出了限制。本书的例题和习题一般不会碰到这个问题。

  • 2
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值