Python¶
选择题¶
- B。A选项以数字开头;C选项是保留字;D选项以特殊字符开头。
相关知识点:合法变量名
合法变量名是由26个字母、数字和下划线组成的。要求符合以下规则:
-
不允许以数字开头
-
不允许使用保留字(由于大小写敏感,因此可以使用保留字的大写版本)
-
可以以下划线开头
-
可以是单独的或多个下划线
注意大小写敏感问题,Name和name不是同一个变量。
注意规范问题。全大写的变量代表常量。虽然变量在Python中可以被后期修改,但考试中一般认为常量不可修改
保留字:需要记忆。常用保留字见末尾附录1
-
B。pip是python的库管理器,可以用于安装、卸载第三方库。常用的命令是
pip install <包名>,pip uninstall <包名>,pip install -r requirements.txt(安装requirements.txt中的所有包) -
C。input输入进的内容永远是str。
相关知识点:input
input默认输入的所有内容全部为str。为了输入int或float,可以有以下两种方案:
-
使用
eval()函数,例如a=eval(input("请输入一个数字:")) -
保证用户输入正确的情况下直接
int()或float(),例如b=float(input("请输入一个浮点数:"))。如果为了防止输入错误,可以使用try模块。
- 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)
其余用法基本不需要考虑,考试考到的可能性较小。可以参考这篇教程
- D。bool函数用以判断条件并返回结果。
相关知识点:bool()
bool()函数可以传入一个变量并返回True或False。判断方法如下:
-
如果是判断式,例如
a==b,c>d,x!=y,返回判断结果 -
如果是单一变量,例如题中,那么对于int和float来说,除了0,都是True;对于str来说,除了"",都是True;对于list和dict来说,除了空的,都是True
-
如果是True或False,返回他们本身。注意这里的True和False是本身还是字符串。本题中就是字符串。
- 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。
练习:判断以下结果:
-
10%5==0 and 10//2==0 and '0'
-
"x" or not(not (not True or 7**2==49))
答案
-
False,因为10//2==5
-
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==0,15%7==1
- C。A.违反定义,B.违反定义。AB互换后定义正确,即C;D显然错误。
相关知识点:流程控制
流程控制中有两个关键字:break和continue。break代表完全跳出循环,continue代表结束本次循环进入下一次循环。这两个关键字只可以在while或for循环中使用。
如果你还是理解不了……
假设你是“上海脚痛大学2025年度十佳歌手”的评委,一共有100个待选人,你需要完成的任务是进行100次以下循环:喊选手入场,听歌手唱歌,给选手评价,把选手从台上扒拉下来,给选手打分。在你听到“周鑫迟”选手的歌时,觉得他一定不会入选了,因此不需要再进行后续的评价和打分环节了,于是你可以喊出“下一位”(continue),跳过这个选手,进行下一个选手;在你听到“宋雨哼”选手的歌时,你发现他是隔壁“负担大学”来的,比赛前面说不定还混进了“折将大学”的学生,这个比赛出现了问题,需要叫停检查,于是你喊出了“停”(break),进行接下来的处理工作,“宋雨哼”后面的选手就都不用继续流程循环了。
-
B。详见上一题解析。在count==2时,输出"2 ",count+=1(count现在==3),然后跳转回while,count<5成立,于是进入循环:if count==3成立,于是进入if分支:break,跳出循环。
-
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的倍数。
- B。A位置实参是以位置确定的参数传递方式,与题意明显不符;C默认实参是允许不传递实参,但仍需要按位置实参进行;D匿名实参不是Python概念,是C语言系列概念。
相关知识点:函数的参数传递
函数有时需要传入参数,因此演变出实参和形参的概念(个人认为这两个概念就是毒瘤,因为实际开发中从来不会考虑这两个概念) 形参:写在函数中的等待接收的参数;实参:调用函数时传入的参数。例如以下代码中:
这里面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,不再依赖顺序传递。
- C。字典的键必须用不可变元素担当,例如字符串、数字、元组。
相关知识点:dict:key
dict(即字典)类型中以一个键来确定对应变量。定义字典时,只允许用不可变的元素来担当键,且不允许重复。题中的C列表是可变元素,因此不可担当键。
什么是键?键就是字典中用于索引的值,定义时在冒号前面的是键;索引时在中括号中的是键。
什么是值?值就是字典中索引得到的内容,定义是在冒号后面的是值;索引时整个索引得到的结果是值。
例如sjtu={"name":"上海脚痛大学","location":"上海"}中的name和location是键,上海脚痛大学和上海是值
- B。add是set的内置函数,执行后向set中添加2。但是2已经存在,因此原集合不变。
相关知识点:set
set和dict共用{}来代表,区别是dict中有键和值,但是set中只有值。set中的元素没有位置前后、不能重复、不可描述,对应集合的无序性、互异性、确定性。(但是Python作为机器语言本来就是不可描述的,所以确定性可以忽略)
- 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。
相关知识点:列表/元组拼接
列表和元组可以进行拼接。注意元组虽然不可变,但是元组可以拼接得到新元组。
拼接方式就是使用+号。例如:
这里c等于[1,2,3,4]。元组同理(见本题)。注意拼接时类型统一,a=[1,2]+3这种语法是错误的,可以用a.append(3)或是a=[1,2]+[3]
相关知识点:set方法update()
set的update方法可以通过一个列表或元组来生成一个新集合,类似于set()。
-
B。本题考查局部变量和全局变量。在函数内的变量作为局部变量只能在函数内使用,且优先级高于全局变量。本题中x=10定义的是全局变量,x=20定义的是my_function()的局部变量,接下来的
print(x,end=' ')调用的是局部变量。之后的print(x)调用的是全局变量。 -
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]。
- 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。
- 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]代表第一行第二列。
- B。必须先绘制图形再添加图例。
相关知识点:matplotlib
本库用于绘制matlab图形,物理化学实验时常用。基本思想是提供x、y数据,然后它可以按序用直线或光滑曲线连接各个数据点。plt.show()时打开GUI程序展示绘制图形。这一步是阻塞的,在你关闭GUI前程序不会继续进行,而是会停在这一步等待你关闭程序。
添加图例必须要先添加图线,也就是绘制图形。否则你不可能给一个不存在的图线添加图例。
xy轴默认存在,不过需要指定其标签以表示意义。这一步只需要在展示图形前完成即可。
savefig()需要在show()前进行,否则show()后图形内存就会被释放,无法savefig()。
- 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(一种有点发灰的浅蓝色)
- 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处理不同的错误。
判断题¶
-
T。Python是解释型、面向对象的、大小写敏感的语言。
-
F。is可能更偏向自然语言,例如
[1,2,3] is list返回True。is判断的是二者是否为同一类,==严格判断二者是否相等。尤其在自定义class时,如果没有定义__eq__函数,两个实例用==比较时比较的是两个实例的存储地址而非它们的各项值。 -
F。字典的键必须不可变,见选择11题相关知识点
-
T。这两个玩意是毒瘤,少用。*args是可变长度的参数,**kwargs是任意的关键字参数。
-
T。局部变量优先于全局变量。见选择14题解析。
-
F。open函数中的a功能可以新建文件。见选择16题解析。
-
F。with块发生异常后仍然会清空文件内容。换句话说,w的功能就是新建一个文件,然后覆盖原文件,之后再对这个文件进行操作。
-
F。ndarray可以存储任意数据类型。但要保证必须是同类型的。
-
T。见选择17题相关知识点。
-
F。这样设置只能让ASCII的负号改成Unicode的负号,并不能解决中文乱码问题。正确做法是指定字体,例如
plt.rcParams['font.sans-serif']=['SimHei']指定为微软雅黑字体。
填空题¶
- 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.
-
列表和元组。字典和集合都是无序数据。
-
b=sorted(a,reverse=True)
相关知识点:sort
对于一个列表,可以用sorted函数进行排序,sorted函数返回一个排好序的原列表,排序原则是从小到大。允许指定reverse参数,此时返回反转的列表。
另外,使用sort方法可以进行原地排序,例如a.sort(reverse=True)可以实现和题目相同的效果,只不过这里没有b,而是把a直接进行从大到小排序。
-
(year%400==0) or (year%4==0 and year%100!=0)。闰年是每四年一闰,整百年时整400才能闰。
-
break语句退出。for循环下面的else块是for的附属行,else块相当于是for循环结束后的执行内容。用上面介绍for循环的例子来说,就是演唱比赛结束后的颁奖仪式环节。但是如果有外校学生闯入,颁奖仪式也可以不用进行了,直接执行特殊程序即可。
-
"1232"。字符串拼接,类似于列表拼接,结果是字符串拼起来。但是注意字符串不可减,只可加。
-
popitem()。字典的用法。可以参考这篇教程最后的部分
-
ndarray。Numpy中的数列一般都是ndarray。
-
文本文件。文本文件是可读的文件,二进制文件是编码好的用于交予计算机执行的文件。
-
end=';'。print函数的用法之一。还有类似的sep=""。end用于指定print结尾的内容,默认是换行符"\n";sep用于指定print多参数之间的分割,默认是空格" "。例如print(1,2)实际输出是"1 2\n",print(1,2,sep=",",end=";")实际输出是"1,2;"
-
a.resize(9,2)。numpy的数组方法。实际上,numpy中的数组是一个一维序列,只不过把它人为分割后生成了一个类似于表格的东西。使用resize可以重新指定分割方式。
-
np.random.normal(loc=0.9,scale=2.5,size=(3,4))。numpy的random类用法。random用于生成随机数据,后面的.normal代表正态分布。类似的还有random.rand返回0到1中的数据,random.randint根据给定的范围返回随机数等等。
-
元组。
return a,b,c,...返回多个元素时,会自动使用元组打包。 -
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]原来的值) -
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