Skip to content

Python

选择题

  1. B。A选项以数字开头;C选项是保留字;D选项以特殊字符开头。

相关知识点:合法变量名

合法变量名是由26个字母、数字和下划线组成的。要求符合以下规则:

  • 不允许以数字开头

  • 不允许使用保留字(由于大小写敏感,因此可以使用保留字的大写版本)

  • 可以以下划线开头

  • 可以是单独的或多个下划线

注意大小写敏感问题,Name和name不是同一个变量。

注意规范问题。全大写的变量代表常量。虽然变量在Python中可以被后期修改,但考试中一般认为常量不可修改

保留字:需要记忆。常用保留字见末尾附录1

  1. B。pip是python的库管理器,可以用于安装、卸载第三方库。常用的命令是pip install <包名>, pip uninstall <包名>, pip install -r requirements.txt(安装requirements.txt中的所有包)

  2. C。input输入进的内容永远是str。

相关知识点:input

input默认输入的所有内容全部为str。为了输入int或float,可以有以下两种方案:

  • 使用eval()函数,例如a=eval(input("请输入一个数字:"))

  • 保证用户输入正确的情况下直接int()float(),例如b=float(input("请输入一个浮点数:"))。如果为了防止输入错误,可以使用try模块。

  1. B。相关内容有赋值、字符串的format方法。

相关知识点:format

format用在一个字符串后面,可以是字符串变量(例如a.format()),也可以是立即字符串(例如本题)。format方法是返回函数而不是操作函数,因此需要用变量来接收format结果(即本题formatted_string=...

format内容:搜寻字符串中的 {} 并用后面给定的变量替换。{} 含义如下:

  • 空:直接替换

  • 包含整数:指定位置替换,从0开始,例如"{0} {1} {0}".format("hello","world")输出hello world hello

  • 包含字母:代表参数,需在format后指定。例如"{name}: {age}".format(name="小明", age=18)

  • 以:开头:数字格式化。常用的有::.xf 保留小数点后x位(如题中保留两位,x=0时不带小数):+.xf 保留小数点后前面加+(-也可以替换),:,逗号隔开数字(例如1000->1,000)

其余用法基本不需要考虑,考试考到的可能性较小。可以参考这篇教程

  1. D。bool函数用以判断条件并返回结果。

相关知识点:bool()

bool()函数可以传入一个变量并返回TrueFalse。判断方法如下:

  • 如果是判断式,例如a==b, c>d, x!=y,返回判断结果

  • 如果是单一变量,例如题中,那么对于int和float来说,除了0,都是True;对于str来说,除了"",都是True;对于list和dict来说,除了空的,都是True

  • 如果是True或False,返回他们本身。注意这里的True和False是本身还是字符串。本题中就是字符串。

  1. C。A中10%2==0为True,中间是or连接,故为True;B中'b'<'c'字符串的比较是True,详见知识点;C中'0'的结果是True(详见上一条知识点),not True就是False;D中结果为2j,complex数不为0即为True。

相关知识点:逻辑判断

逻辑判断的核心就是and or和not。and和or优先级低于not。所有表达式先计算not(有括号除外),然后从左到右计算and和or。python是“短路判断”,即判断到有False and ...的时候,结果立即返回False;判断到有True or ...的时候,结果立即返回True。

练习:判断以下结果:

  1. 10%5==0 and 10//2==0 and '0'

  2. "x" or not(not (not True or 7**2==49))

答案
  1. False,因为10//2==5

  2. True,因为"x"是True

相关知识点:字符串比较

字符串有相等判断、长度比较和unicode比较三种。本题中是最难的unicode比较。

相等比较:单纯看两个字符串是否相同即可。"a"和"a"就是相等的,和"abc"就是不等的。比较方式是"a"=="b"

长度比较:看两个字符串的长度,这里长度指的是各种字的个数。例如"abcde"的长度是5,"hello, w0rld!"的长度是13(包含9个字母,一个数字,两个符号和一个空格)。需要注意的是转义符,例如"\n", "\t", "\",这几个长度记为1。或者可以这样记忆:所有带"\"的长度都不计,只有"\"长度记为1。如果字符串前面带r,例如r"\n123",那么按正常的数数记法。本字符串长度为5。否则长度为4。长度比较的方式是len("\n123")==len("\t456")

unicode比较:从两个字符串的第一个字符开始向下比较,直到unicode不相等,给出结果。例如本题"abcdef"<"ac",比较方式就是先比较第一个字符,都是"a",向下比较;第二个左边是"b",右边是"c",于是左边的字符更小,结束比较,返回小于。发现题目也是小于,所以返回True。unicode的核心就是比较两个字符在unicode表中的位置前后

什么是unicode表?

unicode表是用于编码字符的一个表,每一个字符都对应了一个整数。例如"A"对应65,"a"对应97。除了汉字日文假名等字符外,也可以叫ascii表。你可以在你的python中使用ord("x")来获得一个字符的unicode值(ascii值和unicode值在英文、数字、部分符号上是相等的,你在看到ascii的时候可以自动替换他为unicode)。

需要记住的是: $ 数字<大写字母<下划线<小写字母 $ 。内部顺序按0 ~ 9、A ~ Z、a ~ z来排。比如"X"<"c","_">"0"等

比较方式是"xyz"<"asdw"

计算符号

计算符号包括+、-、*、/、//、**、%。代表含义是加法、减法、乘法、除法、整除、指数、取余。

注意除法返回结果一定是float。例如10/2返回5.0而不是5。

注意0.1+0.2=0.30000000000004。(原因在于二进制浮点误差,不过可能不考。如果有兴趣可以参考这个视频

指数这里可以进行开方操作。指数操作例子:2**2 代表 $ 2^2 $,-4**0.5 代表 $ -4^{0.5} = \sqrt{-4} $,8**(-1/3) 代表 $ 8^{-\frac{1}{3}} = \frac{1}{\sqrt[3]{8}} $

取余指的是$ x mod y $,即 $ x $除 $ y $后取余数,例如10%2==015%7==1

  1. C。A.违反定义,B.违反定义。AB互换后定义正确,即C;D显然错误。

相关知识点:流程控制

流程控制中有两个关键字:break和continue。break代表完全跳出循环,continue代表结束本次循环进入下一次循环。这两个关键字只可以在while或for循环中使用。

如果你还是理解不了……

假设你是“上海脚痛大学2025年度十佳歌手”的评委,一共有100个待选人,你需要完成的任务是进行100次以下循环:喊选手入场,听歌手唱歌,给选手评价,把选手从台上扒拉下来,给选手打分。在你听到“周鑫迟”选手的歌时,觉得他一定不会入选了,因此不需要再进行后续的评价和打分环节了,于是你可以喊出“下一位”(continue),跳过这个选手,进行下一个选手;在你听到“宋雨哼”选手的歌时,你发现他是隔壁“负担大学”来的,比赛前面说不定还混进了“折将大学”的学生,这个比赛出现了问题,需要叫停检查,于是你喊出了“停”(break),进行接下来的处理工作,“宋雨哼”后面的选手就都不用继续流程循环了。

  1. B。详见上一题解析。在count==2时,输出"2 ",count+=1(count现在==3),然后跳转回while,count<5成立,于是进入循环:if count==3成立,于是进入if分支:break,跳出循环。

  2. A。(卧槽这个题你们也考)B生成的是0到49的列表[0,1,2,...,49],C生成的是0~200中的偶数列表[0,2,4,...198],D生成的是True和False的列表,偶数位是True,奇数位是False[True,False,True,...False]

相关知识点:生成器和选择器

生成器和选择器属于不是特别建议但是很方便的一个语法糖了,说他满足语法又不是特别满足,但是也是官方语法中的一种。

生成器的使用方式是在列表中或是字典中使用。阅读方式是:for(或是if)前面的是生成元素,for后面是生成方式。有for时if必须放在for后面。

例如:[x for x in range(100)]代表生成元素x,x是0~99的数字;["This is "+str(x) for x in range(100) if x%3==0]代表生成This is x,x是0~99的数字,但是只生成除3余0的数字,也就是3的倍数。

  1. B。A位置实参是以位置确定的参数传递方式,与题意明显不符;C默认实参是允许不传递实参,但仍需要按位置实参进行;D匿名实参不是Python概念,是C语言系列概念。

相关知识点:函数的参数传递

函数有时需要传入参数,因此演变出实参和形参的概念(个人认为这两个概念就是毒瘤,因为实际开发中从来不会考虑这两个概念) 形参:写在函数中的等待接收的参数;实参:调用函数时传入的参数。例如以下代码中:

1
2
3
4
5
6
def add(a:int,b:int):
    print(a,"+",b,"=",a+b)
c=10
d=20
add(c,d)
add(b=c,a=d)

这里面a是形参,代表add函数等待传入参数a和b,且期待是int型。在add函数内部,a和b作为局部变量使用,任何传入作为a和b参数都会在add函数内部使用。例如下面的add(c,d)是调用add,并把add中的a用c代替,b用d代替。这里的ab是形参,cd是实参。

之后的add(b=c,a=d)是关键字实参传递,指定了add中的b必须是c,a必须是d,不再依赖顺序传递。

  1. C。字典的键必须用不可变元素担当,例如字符串、数字、元组。

相关知识点:dict:key

dict(即字典)类型中以一个键来确定对应变量。定义字典时,只允许用不可变的元素来担当键,且不允许重复。题中的C列表是可变元素,因此不可担当键。

什么是键?键就是字典中用于索引的值,定义时在冒号前面的是键;索引时在中括号中的是键。

什么是值?值就是字典中索引得到的内容,定义是在冒号后面的是值;索引时整个索引得到的结果是值。

例如sjtu={"name":"上海脚痛大学","location":"上海"}中的name和location是键,上海脚痛大学和上海是值

  1. B。add是set的内置函数,执行后向set中添加2。但是2已经存在,因此原集合不变。

相关知识点:set

set和dict共用{}来代表,区别是dict中有键和值,但是set中只有值。set中的元素没有位置前后、不能重复、不可描述,对应集合的无序性、互异性、确定性。(但是Python作为机器语言本来就是不可描述的,所以确定性可以忽略)

  1. D。groupA=groupA+(5,6)=(1,2,3,4)+(5,6)=(1,2,3,4,5,6);groupB.update(groupA) => groupB=set(groupA)=set((1,2,3,4,5,6))={1,2,3,4,5,6},故选D。

相关知识点:列表/元组拼接

列表和元组可以进行拼接。注意元组虽然不可变,但是元组可以拼接得到新元组。

拼接方式就是使用+号。例如:

1
2
3
a=[1,2]
b=[3,4]
c=a+b

这里c等于[1,2,3,4]。元组同理(见本题)。注意拼接时类型统一,a=[1,2]+3这种语法是错误的,可以用a.append(3)或是a=[1,2]+[3]

相关知识点:set方法update()

set的update方法可以通过一个列表或元组来生成一个新集合,类似于set()。

  1. B。本题考查局部变量和全局变量。在函数内的变量作为局部变量只能在函数内使用,且优先级高于全局变量。本题中x=10定义的是全局变量,x=20定义的是my_function()的局部变量,接下来的print(x,end=' ')调用的是局部变量。之后的print(x)调用的是全局变量。

  2. B。考察numpy的array使用。二级索引下,[0,1]代表原来的2,修改为10后arr变为[[1,10],[3,4]]

相关知识点:numpy.array

numpy中的array支持多级索引,索引的index都是从0开始的,例如本体的[0,1]代表第一个列表中的第二个元素。Python原版也支持多级索引,但是方式不同,Python应当使用arr[0][1]的方式索引。可以理解为先获得arr[0],然后对arr[0]索引[1]。

  1. D。先写入一行(字数大于10),然后用二进制打开,fw.tell()返回0;之后从头开始向后偏移10个量,fw.tell()返回10。

这个题是错题!

这个题是错题,正确答案是0\n10,如果认为是最后一行的输出可以选10,实际输出结果是第一行为0,第二行为10。可见外院计算机老师的不严谨程度,尤其是Python语言。

相关知识点:FileIO

Python中使用open和close进行文件的读写。open需要传入2个或更多参数。第一个参数是打开的文件,第二个参数是打开方式。有:

参数 代表内容
r 只读,不存在文件时报错
rb 二进制只读
w 只写。存在文件时会覆盖原文件,不存在时新建文件
wb w的二进制方式
a 追加,存在文件时将指针放在文件末尾,然后向文件添加内容,不存在时新建文件
ab 追加的二级制方式

以上参数后加“+”可以拓展为读写模式。除"r+"在无文件时会报错外,其他均为正常的读写模式。

可以参考这篇教程

相关知识点:tell(), seek()和read()

一般Python都是read()常用,谁家好人用tell和seek啊(

tell函数返回当前指针位置。可以想象用r打开文件后,有一个箭头指着这个文件的第一个字(index=0),tell就返回这个index的值。

seek函数偏移指针,seek函数接受1个或2个参数,第一个参数是偏移量,第二个是方式。第一个参数接受负数。第二个参数使用方法见表:

参数 作用
0 从当前位置
1 从头
2 从末尾

例如题中的seek(10,1)代表从头开始向后偏移10个位置,于是index=0+10=10。

接下来的tell返回当前的index,也就是10。

read函数接受1个参数n,执行时向后读取n个字并打印,指针随之改变。

例如本题中的文件,在打开后执行read(3),会输出"Pyt",此时指针指向"h",index=3。执行tell()将返回3。

  1. C。考察pandas使用。这里使用pandas的dataframe创建了一个表,每一个键对应一个列,之后的列表对应一行。索引时先行后列,也就是查询0行1列(第一行第二列),即'B'的第一个元素3。

相关知识点:pandas.DataFrame

pandas中的DataFrame用于创建一个Series对象,可以比作一张表。不过这张表创建时先列后行,也就是一维下是列1、列2,二维下是行1、行2。比如本题'A'和'B'代表列A和列B(0列和1列),'A'和'B'下面的列表代表了这一列中的每一行的元素是什么。

但是索引时的顺序是先行后列,类似坐标。比如[0, 1]代表第一行第二列。

  1. B。必须先绘制图形再添加图例。

相关知识点:matplotlib

本库用于绘制matlab图形,物理化学实验时常用。基本思想是提供x、y数据,然后它可以按序用直线或光滑曲线连接各个数据点。plt.show()时打开GUI程序展示绘制图形。这一步是阻塞的,在你关闭GUI前程序不会继续进行,而是会停在这一步等待你关闭程序。

添加图例必须要先添加图线,也就是绘制图形。否则你不可能给一个不存在的图线添加图例。

xy轴默认存在,不过需要指定其标签以表示意义。这一步只需要在展示图形前完成即可。

savefig()需要在show()前进行,否则show()后图形内存就会被释放,无法savefig()。

  1. D。由BC知显然是支持自定义颜色的。

相关知识点:RGB

(本知识点不仅适用于Python,还适用于计算机各种领域)

在计算机中存储图形时是用坐标+颜色来存储的,每个像素点都有自己的颜色。而颜色信息使用RGB或RGBA存储。RGB就是Red, Green, Blue的缩写,RGBA中的A是Alpha(透明度)。RGB一般要以“#”开头代表这是一种颜色。取值范围是0~255( $ 2^8 -1 $),一般用两位十六进制数表示。

如果你不知道什么是十六进制数的话……

计算机中存储数据一般不是十进制而是二进制(因为开关只有两种状态:开和关),在二进制中,每次逢2进1,比如1001+1=1010,这里遇见了2因此向前进1位,类似于9+1=10,这里的1+1=10。

在实际操作中,为了缩短二进制,一般使用二进制的高位进制,常用的是八进制和十六进制,且十六进制比八进制更常用(像我前天通宵搓CPU可能八进制更常用一些,因为不用使用字母),十六进制中,9+1=a(A),a+1=b,以此类推,最大是f,f+1=10。十六进制中的字母要小写都小写,要大写都大写。十六进制最大的一位数是F,代表十进制的15(16-1);最大的两位数是255,代表十进制的255(256-1)。

在RGB中,#后面跟着六位十六进制数,每两位代表一种颜色的数值,数值越大添加越多。注意这里是光的叠加而非色彩的叠加,也就是说三原色不再是红黄蓝而是红绿蓝。于是对应的,#000000代表纯白色,#FFFFFF代表纯黑色。当每两位两位都相等时代表不同程度的灰色,某一个值突出时代表是这种颜色的偏色。比如#66ccff是一种天蓝色(红色=102,绿色=204,蓝色=255)题中C选项的#FF0000代表红色255、绿色0、蓝色0,也就是纯红色(这种颜色非常的丑,所以不建议用)

RGB还有一种表示方式,即浮点表示法。使用0~1.0中的浮点数代表一种颜色的值。可以认为是添加百分之多少这种颜色,或是255乘以这个数并向下取整。例如题中B中的0.2,0.4,0.6代表红色=51,绿色=102,蓝色=153,也就是#336699(一种有点发灰的浅蓝色)

  1. B。try块中出现了错误,因为输入的68e不能强制转为int;从此处跳到except块,执行后跳转到finally块。

相关知识点:try

try块包含except/else/finally附属指令。一般try后必须含except,其他两个非必须。而且finally非常没用,因为执行完try块后肯定会接着往下执行,不管有没有finally最后执行结果是一样的。

try块的逻辑是:先执行try块下的内容,如果没有出现错误,就跳转到else块;如果没有else块,就跳转的finally块;如果没有finally块,就跳出try块继续向下执行。如果出现了任何错误,停止执行try块并立即跳转到except块,然后正常执行,但跳转到except块后会跳过else块。

这里的except XXX as e相当于设置了一个局部变量e,e可以当作一个形参。XXX必须是一种错误类型。这里的Exception是任意错误类型。其他错误类型有KeyError等等。存在的意义是多个except处理不同的错误。

判断题

  1. T。Python是解释型、面向对象的、大小写敏感的语言。

  2. F。is可能更偏向自然语言,例如[1,2,3] is list返回True。is判断的是二者是否为同一类,==严格判断二者是否相等。尤其在自定义class时,如果没有定义__eq__函数,两个实例用==比较时比较的是两个实例的存储地址而非它们的各项值。

  3. F。字典的键必须不可变,见选择11题相关知识点

  4. T。这两个玩意是毒瘤,少用。*args是可变长度的参数,**kwargs是任意的关键字参数。

  5. T。局部变量优先于全局变量。见选择14题解析。

  6. F。open函数中的a功能可以新建文件。见选择16题解析。

  7. F。with块发生异常后仍然会清空文件内容。换句话说,w的功能就是新建一个文件,然后覆盖原文件,之后再对这个文件进行操作。

  8. F。ndarray可以存储任意数据类型。但要保证必须是同类型的。

  9. T。见选择17题相关知识点。

  10. F。这样设置只能让ASCII的负号改成Unicode的负号,并不能解决中文乱码问题。正确做法是指定字体,例如plt.rcParams['font.sans-serif']=['SimHei']指定为微软雅黑字体。

填空题

  1. 5.0-823%5//3-True=5.0-88%5//3-True=5.0-64%5//3-True=5.0-4//3-True=5.0-1-True=4.0-True=4.0-1=3.0。

相关知识点:算式

在计算时,括号优先级最高,其次是乘方,再次是乘除、整除和取余,最次是加减。

在算式中,True=1,False=0.

  1. 列表和元组。字典和集合都是无序数据。

  2. b=sorted(a,reverse=True)

相关知识点:sort

对于一个列表,可以用sorted函数进行排序,sorted函数返回一个排好序的原列表,排序原则是从小到大。允许指定reverse参数,此时返回反转的列表。

另外,使用sort方法可以进行原地排序,例如a.sort(reverse=True)可以实现和题目相同的效果,只不过这里没有b,而是把a直接进行从大到小排序。

  1. (year%400==0) or (year%4==0 and year%100!=0)。闰年是每四年一闰,整百年时整400才能闰。

  2. break语句退出。for循环下面的else块是for的附属行,else块相当于是for循环结束后的执行内容。用上面介绍for循环的例子来说,就是演唱比赛结束后的颁奖仪式环节。但是如果有外校学生闯入,颁奖仪式也可以不用进行了,直接执行特殊程序即可。

  3. "1232"。字符串拼接,类似于列表拼接,结果是字符串拼起来。但是注意字符串不可减,只可加。

  4. popitem()。字典的用法。可以参考这篇教程最后的部分

  5. ndarray。Numpy中的数列一般都是ndarray。

  6. 文本文件。文本文件是可读的文件,二进制文件是编码好的用于交予计算机执行的文件。

  7. end=';'。print函数的用法之一。还有类似的sep=""。end用于指定print结尾的内容,默认是换行符"\n";sep用于指定print多参数之间的分割,默认是空格" "。例如print(1,2)实际输出是"1 2\n",print(1,2,sep=",",end=";")实际输出是"1,2;"

  8. a.resize(9,2)。numpy的数组方法。实际上,numpy中的数组是一个一维序列,只不过把它人为分割后生成了一个类似于表格的东西。使用resize可以重新指定分割方式。

  9. np.random.normal(loc=0.9,scale=2.5,size=(3,4))。numpy的random类用法。random用于生成随机数据,后面的.normal代表正态分布。类似的还有random.rand返回0到1中的数据,random.randint根据给定的范围返回随机数等等。

  10. 元组。return a,b,c,...返回多个元素时,会自动使用元组打包。

  11. lst[start],lst[end]=lst[end],lst[start]。这里是python的一个语法糖,即多变量赋值。a,b,c,...=x,y,z,...相当于a=x,b=y,c=z,...,但还是有一些细微的区别。当x,y,z...是变量时,赋值语句首先取临时变量表出来将x,y,z...一一写入,然后再一一赋给a,b,c...。这也就导致了lst[start],lst[end]=lst[end],lst[start]是交换值,而lst[start]=lst[end],lst[end]=lst[start]是覆盖值(后者损失了lst[start]原来的值)

  12. if n%i==0。这里判断从2开始到根号n结束的所有整数中有没有数可以整除n(即除后余数等于0)

附录1:常见保留字

False, None, True, and, as, break, class, continue, def, del, elif, else, except, finally, for, from, if, import, in, is, not, or, pass, raise, return, try, while, with, yield

不常见保留字:assert, async, await, lambda, nonlocal, global