找回密码
 会员注册
查看: 24|回复: 0

Python八股文系列:100个Python的面试笔试高频考点

[复制链接]

2万

主题

0

回帖

7万

积分

超级版主

积分
71769
发表于 2024-9-6 19:56:27 | 显示全部楼层 |阅读模式
Python的100个面试/笔试高频考点本文主要整理了关于Python的面试/笔试的一些考点,可用于查漏补缺。涉及到的一些Python进阶知识,可以查看专栏学习:《Python进阶》\quad\quad1.解释型和编译型语言的区别编译型语言:把做好的源程序全部编译成二进制的可运行程序。然后,可直接运行这个程序。如:C,C++;解释型语言:把做好的源程序翻译一句,然后执行一句,直至结束!如:Python。注意:Java有些特殊,java程序也需要编译,但是没有直接编译成为机器语言,而是编译称为字节码,然后用解释方式执行字节码。\quad\quad2.简述下Python中的字符串、列表、元组和字典字符串(str):字符串是用引号括起来的任意文本,是编程语言中最常用的数据类型。列表(list):列表是有序的集合,可以向其中添加或删除元素。元组(tuple):元组也是有序集合,元组中的数无法修改。即元组是不可变的。字典(dict):字典是无序的集合,是由键值对(key-value)组成的。集合(set):是一组key的集合,每个元素都是唯一,不重复且无序的。\quad\quad3.简述上述数据类型的常用方法字符串:切片:'luobodazahui'[1:3]format:"welcometoluobodazahui,dear{name}"format(name="baby")join:可以用来连接字符串,将字符串、元组、列表中的元素以指定的字符(分隔符)连接生成一个新的字符串。'-'.join(['luo','bo','da','za','hui'])String.replace(old,new,count):将字符串中的old字符替换为New字符,count为替换的个数'luobodazahui-haha'.replace('haha','good')split:切割字符串,得到一个列表>>>mystr5='luobo,dazahuigood'>>>print(mystr5.split())#默认以空格分割['luobo,dazahui','good']>>>print(mystr5.split('h'))#以h分割['luobo,daza','uigood']>>>print(mystr5.split(','))#以逗号分割['luobo','dazahuigood']12345678910列表:切片,同字符串append和extend向列表中添加元素>>>mylist1=[1,2]>>>mylist2=[3,4]>>>mylist3=[1,2]>>>mylist1.append(mylist2)>>>print(mylist1)[1,2,[3,4]]>>>mylist3.extend(mylist2)>>>print(mylist3)[1,2,3,4]1234567891011删除元素del:根据下标进行删除pop:删除最后一个元素remove:根据元素的值进行删除>>>mylist4=['a','b','c','d']>>>delmylist4[0]>>>print(mylist4)['b','c','d']>>>mylist4.pop()>>>print(mylist4)['b','c']>>>mylist4.remove('c')>>>print(mylist4)['b']12345678910111213元素排序sort:是将list按特定顺序重新排列,默认为由小到大,参数reverse=True可改为倒序,由大到小。>>>mylist5=[1,5,2,3,4]>>>mylist5.sort()>>>print(mylist5)[1,2,3,4,5]>>>mylist5.reverse()>>>print(mylist5)[5,4,3,2,1]1234567reverse:是将list逆置。字典:清空字典dict.clear()>>>dict1={'key1':1,'key2':2}>>>dict1.clear()>>>dict1{}1234指定删除:使用pop方法来指定删除字典中的某一项(随机的)。>>>dict1={'key1':1,'key2':2}>>>d1=dict1.pop('key1')>>>dict1{'key2':2}>>>d11123456遍历字典>>>dict2={'key1':1,'key2':2}>>>mykey=[keyforkeyindict2]#['key1','key2']>>>mykey['key1','key2']>>>myvalue=[valueforvalueindict2.values()]>>>myvalue[1,2]>>>key_value=[(k,v)fork,vindict2.items()]>>>key_value[('key1',1),('key2',2)]12345678910fromkeys用于创建一个新字典,以序列中元素做字典的键,value为字典所有键对应的初始值。>>>keys=['zhangfei','guanyu','liubei','zhaoyun']>>>dict.fromkeys(keys,0){'zhangfei':0,'guanyu':0,'liubei':0,'zhaoyun':0}123\quad\quad4.简述Python中的字符串编码计算机在最初的设计中,采用了8个比特(bit)作为一个字节(byte)的方式。一个字节能表示的最大的整数就是255,如果要表示更大的整数,就必须用更多的字节。最早,计算机只有ASCII编码,即只包含大小写英文字母、数字和一些符号,这些对于其他语言,如中文,日文显然是不够用的。后来又发明了Unicode,Unicode把所有语言都统一到一套编码里,这样就不会再有乱码问题了。当需要保存到硬盘或者需要传输的时候,就转换为UTF-8编码。UTF-8是隶属于Unicode的可变长的编码方式。在Python中,以Unicode方式编码的字符串,可以使用encode()方法来编码成指定的bytes,也可以通过decode()方法来把bytes编码成字符串。>>>"你好".encode('utf-8')b'\xe4\xbd\xa0\xe5\xa5\xbd'>>>b'\xe4\xb8\xad\xe6\x96\x87'.decode('utf-8')"你好"1234\quad\quad5.一行代码实现数值交换>>>a,b=1,2>>>a,b=b,a>>>print(a,b)123\quad\quad6.is和==的区别==是比较操作符,只是判断对象的值(value)是否一致,而is则判断的是对象之间的身份(内存地址)是否一致。对象的身份,可以通过id()方法来查看。>>>c=d=[1,2]>>>e=[1,2]>>>print(cisd)True>>>print(c==d)True>>>print(cise)False>>>print(c==e)True1234567891011121314只有id一致时,is比较才会返回True,而当value一致时,==比较就会返回True。\quad\quad7.Python函数中的参数类型位置参数,默认参数,可变参数,关键字参数。\quad\quad8.*arg和**kwarg作用允许我们在调用函数的时候传入多个实参>>>deftest(*arg,**kwarg):...ifarg:...print("arg:",arg)...ifkwarg:...print("kearg:",kwarg)...>>>test('ni','hao',key='world')arg'ni','hao')kearg:{'key':'world'}123456789可以看出,*arg会把位置参数转化为tuple,**kwarg会把关键字参数转化为dict。\quad\quad9.获取当前时间>>>importtime>>>importdatetime>>>print(datetime.datetime.now())2022-09-1219:51:24.314335>>>print(time.strftime('%Y-%m-%d%H:%M:%S'))2022-09-1219:51:24123456\quad\quad10.PEP8规范简单列举10条:尽量以免单独使用小写字母’l’,大写字母’O’,以及大写字母’I’等容易混淆的字母。函数命名使用全部小写的方式,可以使用下划线。常量命名使用全部大写的方式,可以使用下划线。使用has或is前缀命名布尔元素,如:is_connect=True;has_member=False。不要在行尾加分号,也不要用分号将两条命令放在同一行。不要使用反斜杠连接行。方法定义之间空1行,顶级定义之间空两行。如果一个类不继承自其它类,就显式的从object继承。内部使用的类、方法或变量前,需加前缀_表明此为内部使用的。要用断言来实现静态类型检测。\quad\quad11.Python的深浅拷贝(🧡🧡)浅拷贝>>>importcopy>>>list1=[1,2,3,[1,2]]>>>list2=copy.copy(list1)>>>list2.append('a')>>>list2[3].append('a')>>>list1[1,2,3,[1,2,'a']]>>>list2[1,2,3,[1,2,'a'],'a']123456789浅拷贝只成功”独立“拷贝了列表的外层,而列表的内层列表,还是共享的。(划重点!!!)深拷贝>>>importcopy>>>list1=[1,2,3,[1,2]]>>>list3=copy.deepcopy(list1)>>>list3.append('a')>>>list3[3].append('a')>>>list1[1,2,3,[1,2]]>>>list3[1,2,3,[1,2,'a'],'a']123456789深拷贝使得两个列表完全独立开来,每一个列表的操作,都不会影响到另一个。\quad\quad12.[lambdax:i*xforiinrange(4)]🧡🧡这是一道非常经典的题目了。>>>defnum():...return[lambdax:i*xforiinrange(4)]...>>>[m(1)forminnum()][3,3,3,3]12345why?详细看链接:《Python面试题目:[lambdax:x*iforiinrange(4)]》\quad\quad13.打印九九乘法表>>>foriinrange(1,10):...forjinrange(1,i+1):...print(f"{i}*{j}={i*j}",end="")...print()...1*1=12*1=22*2=43*1=33*2=63*3=94*1=44*2=84*3=124*4=165*1=55*2=105*3=155*4=205*5=256*1=66*2=126*3=186*4=246*5=306*6=367*1=77*2=147*3=217*4=287*5=357*6=427*7=498*1=88*2=168*3=248*4=328*5=408*6=488*7=568*8=649*1=99*2=189*3=279*4=369*5=459*6=549*7=639*8=729*9=811234567891011121314知识点:print函数默认是会换行的,其有一个默认参数end。\quad\quad14.filter、map、reduce的作用filter函数用于过滤序列,它接收一个函数和一个序列,把函数作用在序列的每个元素上,然后根据返回值是True还是False决定保留还是丢弃该元素。>>>mylist=list(range(10))>>>list(filter(lambdax:x%2==1,mylist))[1,3,5,7,9]123map函数传入一个函数和一个序列,并把函数作用到序列的每个元素上,返回一个可迭代对象。>>>list(map(lambdax:x%2,mylist))[0,1,0,1,0,1,0,1,0,1]>>>list(map(lambdax:x*2,mylist))[0,2,4,6,8,10,12,14,16,18]1234reduce函数用于递归计算,同样需要传入一个函数和一个序列,并把函数和序列元素的计算结果与下一个元素进行计算。reduce()将一个数据集合(链表,元组等)中的所有数据进行下列操作:用传给reduce中的function函数(有两个参数)先对集合中的第1、2个元素进行操作,得到的结果再与第三个数据用function函数运算,最后得到一个结果。>>>fromfunctoolsimportreduce>>>reduce(lambdax,y:x+y,range(101))5050123reduce()的应用:一行代码搞定计算所有元素的积:reduce(lambdax,y:x*y,[1,2,3,4])1计算列表中所有元素的最大值:reduce(lambdax,y:xifx>yelsey,[1,2,3,4])1有一个列表:[3,5,8,1]对应的是3581的每一个数字,要从这个列表计算出原来的数,可以这样做:reduce(lambdax,y:x*10+y,[3,5,8,1])1可以看出,上面的三个函数与匿名函数相结合使用,可以写出强大简洁的代码。\quad\quad15.为什么不建议函数的默认参数传入可变对象例如:>>>deftest(L=[]):...L.append('test')...print(L)...>>>test()['test']>>>test()['test','test']12345678默认参数是一个列表,是可变对象[],Python在函数定义的时候,默认参数L的值就被计算出来了,是[],每次调用函数,如果L的值变了,那么下次调用时,默认参数的值就已经不再是[]了。\quad\quad16.面向对象中__new__和__init__区别(🧡🧡)__new__是在实例创建之前被调用的,因为它的任务就是创建实例然后返回该实例对象,是个静态方法。__init__是当实例对象创建完成后被调用的,然后设置对象属性的一些初始值,通常用在初始化一个类实例的时候,是一个实例方法。__new__至少要有一个参数cls,代表当前类,此参数在实例化时由Python解释器自动识别。__new__必须要有返回值,返回实例化出来的实例,这点在自己实现__new__时要特别注意,可以return父类(通过super(当前类名,cls))__new__出来的实例,或者直接是object的__new__出来的实例。__init__有一个参数self,就是这个__new__返回的实例,__init__在__new__的基础上可以完成一些其它初始化的动作,__init__不需要返回值。如果__new__创建的是当前类的实例,会自动调用__init__函数,通过return语句里面调用的__new__函数的第一个参数是**cls****来保证是当前类实例**,如果是其他类的类名,那么实际创建返回的就是其他类的实例,其实就不会调用当前类的__init__函数,也不会调用其他类的__init__函数。\quad\quad17.三元运算规则看下面的例子:如果a>b成立就输出a-b否则a+b。>>>>>>a,b=1,2>>>h=a-bifa>belsea+b>>>h31234\quad\quad18.生成随机数>>>importrandom>>>random.random()0.7571910055209727>>>random.randint(1,100)23>>>random.uniform(1,5)3.06407328311516871234567用np.random也可以!\quad\quad19.zip函数用法zip()函数将可迭代的对象作为参数,将对象中对应的元素打包成一个元组,然后返回由这些元组组成的列表。>>>list1=['zhangfei','guanyu','liubei','zhaoyun']>>>list2=[0,3,2,4]>>>list(zip(list1,list2))[('zhangfei',0),('guanyu',3),('liubei',2),('zhaoyun',4)]1234\quad\quad20.range和xrange的区别只有Python2中才有xrange()和range(),Python3中的range()其实就是Python2中xrange()。range([start,]stop[,step]),根据start与stop指定的范围以及step设定的步长,生成一个序列;xrange()生成一个生成器,可以很大的节约内存。\quad\quad21.with方法打开文件的作用打开文件在进行读写的时候可能会出现一些异常状况,如果按照常规的f.open()写法,我们需要try,except,finally,做异常判断,并且文件最终不管遇到什么情况,都要执行f.close()关闭文件,with方法帮我们实现了finally中f.close()。withopen("hello.txt","a")asf:f.write("helloworld!")12'运行运行\quad\quad22.字符串转列表>>>s="1,2,3,4,5,6,7,8,9">>>s.split(",")['1','2','3','4','5','6','7','8','9']123\quad\quad23.字符串转整数>>>s="1,2,3,4,5,6,7,8,9">>>list(map(lambdax:int(x),s.split(",")))[1,2,3,4,5,6,7,8,9]123\quad\quad24.删除列表中的重复值利用集合去重:>>>mylist=[1,2,3,4,5,5,6,7,4,3]>>>list(set(mylist))[1,2,3,4,5,6,7]123\quad\quad25.字符串单词统计统计字符串中字母个数:>>>fromcollectionsimportCounter>>>mystr='sdfsfsfsdfsd,were,hrhrgege.sdfwe!sfsdfs'>>>Counter(mystr)Counter({'s':9,'d':5,'f':7,',':2,'w':2,'e':5,'r':3,'h':2,'g':2,'.':1,'!':1})1234567891011121314统计字符串中单词个数>>>mystr2="hello,Nicetomeetyou!">>>len(mystr2.split(""))5123\quad\quad26.列表推导,求奇偶数>>>[xforxinrange(20)ifx%2==1][1,3,5,7,9,11,13,15,17,19]12\quad\quad27.一行代码展开列表>>>list1=[[1,2],[3,4],[5,6]]>>>[jforiinlist1forjini][1,2,3,4,5,6]123\quad\quad28.实现二分法查找函数二分查找算法也称折半查找,基本思想就是折半,对比大小后再折半查找,必须是有序序列才可以使用二分查找。非递归算法:defbinary_search(data,item):left=0right=len(data)-1whileleft0:mid=n//2ifdata[mid]==item:returnTrueelifdata[mid]>item:returnbinary_search(data[:mid],item)else:returnbinary_search(data[mid+1:],item)returnFalse1234567891011'运行运行\quad\quad29.合并两个元组到字典如:("zhangfei","guanyu"),(66,80)->{'zhangfei':66,'guanyu':80}。>>>a=("zhangfei","guanyu")>>>b=(66,80)>>>dict(zip(a,b)){'zhangfei':66,'guanyu':80}1234\quad\quad30.给出如下代码的输入,并简单解释例子1:>>>a=(1,2,3,[4,5,6,7],8)>>>a[3]=212报错:TypeError:‘tuple’objectdoesnotsupportitemassignment。原因:元组不能修改!tuple是不可变类型,不能改变tuple里的元素。例子2:>>>a=(1,2,3,[4,5,6,7],8)>>>a[3][2]=2>>>a(1,2,3,[4,5,2,7],8)1234list是可变类型,改变其元素是允许的。\quad\quad31.字典和json转换dict1={'zhangfei':1,"liubei":2,"guanyu":4,"zhaoyun":3}myjson=json.dumps(dict1)#字典转JSONmydict=json.loads(myjson)#JSON转字典123\quad\quad32.列表推导式、字典推导式和生成器列表推导式:返回一个列表。>>>td_list=[iforiinrange(10)]>>>td_list[0,1,2,3,4,5,6,7,8,9]>>>type(td_list)list12345生成器:>>>ge_list=(iforiinrange(20))>>>ge_listat0x000001C3C127AAC8>>>>type(ge_list)generator12345字典推导式:>>>dic={k:2forkin["a","b","c","d"]}>>>dic{'a':2,'b':2,'c':2,'d':2}>>>type(dic)dict12345\quad\quad33.简述read、readline、readlines的区别read()读取整个文件readline()读取下一行,使用生成器方法readlines()读取整个文件到一个迭代器以供我们遍历\quad\quad34.打乱一个列表>>>importrandom>>>list=list(range(1,10))>>>random.shuffle(list)>>>list[3,9,1,4,6,2,8,7,5]12345\quad\quad35.反转字符串>>>'luobodazahui'[::-1]'iuhazadoboul'12\quad\quad36.单下划线和双下划线的作用__foo__:一种约定,Python内部的名字,用来区别其他用户自定义的命名,以防冲突,就是例如__init__(),__del__(),__call__()些特殊方法。_foo:一种约定,用来指定变量私有。不能用frommoduleimport*导入,其他方面和公有变量一样访问。__foo:这个有真正的意义:解析器用_classname__foo来代替这个名字,以区别和其他类相同的命名,它无法直接像公有成员一样随便访问,通过对象名._类名__xxx这样的方式可以访问。\quad\quad37.新式类和旧式类在python里凡是继承了object的类,都是新式类Python3里只有新式类Python2里面继承object的是新式类,没有写父类的是经典类经典类目前在Python里基本没有应用\quad\quad38.Python面向对象中的继承有什么特点同时支持单继承与多继承,当只有一个父类时为单继承,当存在多个父类时为多继承;子类会继承父类所有的属性和方法,子类也可以覆盖父类同名的变量和方法;在继承中基类的构造(__init__())方法不会被自动调用,它需要在其派生类的构造中专门调用;在调用基类的方法时,需要加上基类的类名前缀,且需要带上self参数变量。区别于在类中调用普通函数时并不需要带上self参数。\quad\quad39.super函数的作用super()函数是用于调用父类(超类)的一个方法classA():deffuncA(self):print("thisisfuncA")classB(A):deffuncA_in_B(self):super(B,self).funcA()deffuncC(self):print("thisisfuncC")>>>ins=B()>>>ins.funcA_in_B()thisisfuncA>>>ins.funcC()thisisfuncC12345678910111213141516\quad\quad40.类中的各种函数主要分为实例方法、类方法和静态方法。实例方法定义:第一个参数必须是实例对象,该参数名一般约定为“self”,通过它来传递实例的属性和方法(也可以传类的属性和方法)。调用:只能由实例对象调用。类方法定义:使用装饰器@classmethod。第一个参数必须是当前类对象,该参数名一般约定为“cls”,通过它来传递类的属性和方法(不能传实例的属性和方法)。调用:实例对象和类对象都可以调用。静态方法定义:使用装饰器@staticmethod。参数随意,没有“self”和“cls”参数,但是方法体中不能使用类或实例的任何属性和方法。调用:实例对象和类对象都可以调用。静态方法是类中的函数,不需要实例。静态方法主要是用来存放逻辑性的代码,主要是一些逻辑属于类,但是和类本身没有交互。即在静态方法中,不会涉及到类中的方法和属性的操作。可以理解为将静态方法存在此类的名称空间中。类方法是将类本身作为对象进行操作的方法。他和静态方法的区别在于:不管这个方式是从实例调用还是从类调用,它都用第一个参数把类传递过来。\quad\quad41.如何判断是函数还是方法与类和实例无绑定关系的function都属于函数(function)与类和实例有绑定关系的function都属于方法(method)普通函数:deffunc1():pass>>>print(func1)1234类中的函数:classPeople(object):deffunc2(self):pass@staticmethoddeffunc3():pass@classmethoddeffunc4(cls):pass>>>people=People()>>>print(people.func2)>>>>print(people.func3)>>>print(people.func4)>12345678910111213141516171819202122\quad\quad42.isinstance的作用以及与type()的区别(🧡🧡)isinstance()函数来判断一个对象是否是一个已知的类型,类似type()。区别:type()不会认为子类是一种父类类型,不考虑继承关系;isinstance()会认为子类是一种父类类型,考虑继承关系。classA(object):passclassB(A):pass>>>a=A()>>>b=B()>>>print(isinstance(a,A))True>>>print(type(a)==A)True>>>print(isinstance(b,A))True>>>print(type(b)==A)False123456789101112131415161718\quad\quad43.单例模式与工厂模式单例模式:主要目的是确保某一个类只有一个实例存在;工厂模式:包涵一个超类,这个超类提供一个抽象化的接口来创建一个特定类型的对象,而不是决定哪个对象可以被创建。单例模式:这种模式涉及到一个单一的类,该类负责创建自己的对象,同时确保只有单个对象被创建。这个类提供了一种访问其唯一的对象的方式,可以直接访问,不需要实例化该类的对象。意图:保证一个类仅有一个实例,并提供一个访问它的全局访问点。主要解决:一个全局使用的类频繁地创建与销毁。举例:操作一个文件,应该用一个唯一的实例去操作。工厂模式:工厂类模式设计的核心是:让“生产”和“产品”解耦。工厂模式的主要解决的问题:将原来分布在各个地方的对象创建过程单独抽离出来,交给工厂类负责创建。其他地方想要使用对象直接找工厂(即调用工厂的方法)获取对象。优点:一个调用者想创建一个对象,只要知道其名称就可以了。扩展性高,如果想增加一个产品,只要扩展一个工厂类就可以。屏蔽产品的具体实现,调用者只关心产品的接口。\quad\quad44.查看目录下的所有文件>>>importos>>>print(os.listdir('.'))12\quad\quad45.计算由1到5组成的互不重复的三位数foriinrange(1,6):forjinrange(1,6):forkinrange(1,6):if(i!=j)andi!=kandj!=k:print(f"{i}{j}{k}")12345'运行运行\quad\quad46.去除字符串首尾空格>>>"helloworld".strip()'helloworld'12\quad\quad47.去除字符串中间的空格方法一:>>>"helloyouaregood".replace("","")'helloyouaregood'12方法二:>>>"".join("helloyouaregood".split(""))'helloyouaregood'12\quad\quad48.字符串格式化方式方法一:使用%操作符print("Thisisfor%s"%"Python")print("Thisisfor%s,and%s"%("Python","You"))12'运行运行方法二:str.format(在Python3中,引入了这个新的字符串格式化方法)print("Thisismy{}".format("chat"))print("Thisis{name},hopeyoucan{do}".format(name="zhouluob",do="like"))12'运行运行方法三:f-strings(在Python3-6中,引入了这个新的字符串格式化方法)name="luobodazahui"print(f"hello{name}")12'运行运行一个复杂些的例子:defmytest(name,age):returnf"hello{name},youare{age}yearsold!">>>people=mytest("luobo",20)>>>print(people)helloluobo,youare20yearsold!123456\quad\quad49.将"helloworld"转换为首字母大写"HelloWorld"title()函数:>>>str1="helloworld">>>str1.title()'HelloWorld'123不使用title()函数>>>str1="helloworld">>>"".join(list(map(lambdax:x.capitalize(),str1.split(""))))'HelloWorld'>>>"".join(list(map(lambdax:x[0].upper()+x[1:],str1.split(""))))'HelloWorld'123456\quad\quad50.一行代码转换列表中的整数为字符串如:[1,2,3]->[“1”,“2”,“3”]>>>list1=[1,2,3]>>>list(map(lambdax:str(x),list1))['1','2','3']123\quad\quad51.Python中的反射(🧡🧡)反射就是通过字符串的形式,导入模块;通过字符串的形式,去模块寻找指定函数,并执行。利用字符串的形式去对象(模块)中操作(查找/获取/删除/添加)成员,一种基于字符串的事件驱动!简单理解就是用来判断某个字符串是什么,是变量还是方法。例子:先定义一个类:classNewClass(object):def__init__(self,name,male):self.name=nameself.male=maledefmyname(self):print(f'Mynameis{self.name}')defmymale(self):print(f'Iama{self.male}')12345678910'运行运行>>>people=NewClass('luobo','boy')>>>print(hasattr(people,'name'))True>>>print(getattr(people,'name'))luobo>>>setattr(people,'male','girl')>>>print(getattr(people,'male'))girl12345678getattr,hasattr,setattr,delattr对模块的修改都在内存中进行,并不会影响文件中真实内容。详情请看博客:《Python进阶系列》十八:详解Python中的反射——通过字符串的形式操作对象\quad\quad52.metaclass元类(🧡🧡)类与实例:首先定义类以后,就可以根据这个类创建出实例,所以:先定义类,然后创建实例;类与元类:先定义元类,根据metaclass创建出类,所以:先定义metaclass,然后创建类。classMyMetaclass(type):def__new__(cls,class_name,class_parents,class_attr):class_attr['print']="thisismymetaclass'ssubclass%s"%class_namereturntype.__new__(cls,class_name,class_parents,class_attr)classMyNewclass(object,metaclass=MyMetaclass):pass>>>myinstance=MyNewclass()>>>myinstance.print"thisismymetaclass'ssubclassMyNewclass"1234567891011详细内容见博客:《Python进阶系列》十五:详解Python中的元类(metaclass)\quad\quad53.sort和sorted的区别不管是list.sort方法还是sorted函数,都有两个可选的关键字参数。reverse:如果被设定为True,被排序的序列里的元素会以降序输出。这个参数的默认值是False。key:一个只有一个参数的函数,这个函数会被用在序列里的每一个元素上,所产生的结果将是排序算法依赖的对比关键字。比如说,在对一些字符串排序时,可以用key=str.lower来实现忽略大小写的排序,或者是用key=len进行基于字符串长度的排序。这个参数的默认值是恒等函数,也就是默认用元素自己的值来排序。可选参数key还可以在内置函数min()和max()中起作用。另外,还有些标准库里的函数也接受这个参数,像itertools.groupby()和heapq.nlargest()等。sort()是可变对象列表(list)的方法。sort()会改变可变对象。>>>list1=[2,1,3]>>>print(list1.sort())None>>>list1[1,2,3]>>>dict1.sort()Traceback(mostrecentcalllast):File"",line1,inAttributeError:'dict'objecthasnoattribute'sort'123456789sorted()是产生一个新的对象。sorted(L)返回一个排序后的L,不改变原始的L,sorted()适用于任何可迭代容器。>>>dict1={'test1':1,'test2':2}>>>list1=[2,1,3]>>>print(sorted(dict1))['test1','test2']>>>print(sorted(list1))[1,2,3]123456\quad\quad54.Python中的GILGIL是Python的全局解释器锁,同一进程中假如有多个线程运行,一个线程在运行Python程序的时候会占用Python解释器(加了一把锁即GIL),使该进程内的其他线程无法运行,等该线程运行完后其他线程才能运行。如果线程运行过程中遇到耗时操作,则解释器锁解开,使其他线程运行。所以在多线程中,线程的运行仍是有先后顺序的,并不是同时进行。\quad\quad55.产生8位随机密码(🧡🧡)string模块用法:1、将大写的ASCII字符列表和数字组合起来>>>string.ascii_uppercase+string.digits'ABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789'122、string.printable输出被视为可打印符号的ASCII字符组成的字符串。>>>string.printable'0123456789abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ!"#$%&\'()*+,-./:;?@[\\]^_`{|}~\t\n\r\x0b\x0c'12string.printable[:-7]去除被视为空白符号的ASCII字符组成的字符串。使用python的random模块,使用其中的choice方法,从给定的字符序列中随机选择字符组合。>>>importrandom>>>importstring>>>"".join(random.choice(string.printable[:-7])foriinrange(8))123这就产生了8位随机密码。\quad\quad56.输出原始字符python提供了输出原始字符串“r”的方法。>>>print('hello\nworld')helloworld>>>print(b'hello\nworld')b'hello\nworld'>>>print(r'hello\nworld')hello\nworld1234567\quad\quad57.简述any()和all()方法all:如果存在0,None,False返回False,否则返回True;any:如果都是0,None,False时,返回False。例子:>>>all([1,2,3,0])False>>>all([1,2,3])True>>>any([1,2,3])True>>>any([0,None,False])False12345678\quad\quad58.反转整数首先判断是否是整数,再判断是否是一位数字,最后再判断是不是负数。defreverse_int(x):ifnotisinstance(x,int):returnFalseif-10>>reverse_int(-23837)-7383212\quad\quad59.函数式编程(🧡🧡)函数式编程是一种抽象程度很高的编程范式,纯粹的函数式编程语言编写的函数没有变量,因此,任意一个函数,只要输入是确定的,输出就是确定的,这种纯函数称之为没有副作用。而允许使用变量的程序设计语言,由于函数内部的变量状态不确定,同样的输入,可能得到不同的输出,因此,这种函数是有副作用的。由于Python允许使用变量,因此,Python不是纯函数式编程语言。函数式编程的一个特点就是,允许把函数本身作为参数传入另一个函数,还允许返回一个函数!函数作为返回值例子:defsum(*args):definner_sum():tmp=0foriinargs:tmp+=ireturntmpreturninner_sum>>>mysum=sum(2,4,6)>>>print(type(mysum))>>>mysum()1212345678910111213\quad\quad60.简述闭包(🧡🧡)如果在一个内部函数里,对在外部作用域(但不是在全局作用域)的变量进行引用,那么内部函数就被认为是闭包(closure)。闭包特点:必须有一个内嵌函数;内嵌函数必须引用外部函数中的变量;外部函数的返回值必须是内嵌函数。详细看链接:《Python面试题目:[lambdax:x*iforiinrange(4)]》\quad\quad61.简述装饰器(🧡🧡)装饰器是一种特殊的闭包,就是在闭包的基础上传递了一个函数,然后覆盖原来函数的执行入口,以后调用这个函数的时候,就可以额外实现一些功能了。一个打印log的例子:importtimedeflog(func):definner_log(*args,**kw):print("Call:{}".format(func.__name__))returnfunc(*args,**kw)returninner_log@logdeftimer():print(time.time())timer()#Call:timer#1560171403.5128365123456789101112131415本质上,decorator就是一个返回函数的高阶函数。详细看链接:《Python进阶系列》八:装饰器的用法\quad\quad62.协程的优点协程的优点:最大优势就是协程极高的执行效率。因为子程序切换不是线程切换,而是由程序自身控制,因此,没有线程切换的开销,和多线程比,线程数量越多,协程的性能优势就越明显。不需要多线程的锁机制,因为只有一个线程,也不存在同时写变量冲突,在协程中控制共享资源不加锁,只需要判断状态就好了,所以执行效率比多线程高很多。因为协程是一个线程执行,那怎么利用多核CPU呢?最简单的方法是多进程+协程,既充分利用多核,又充分发挥协程的高效率,可获得极高的性能。其他一些重要的点:协程并没有增加线程数量,只是在线程的基础之上通过分时复用的方式运行多个协程,而且协程的切换在用户态完成,切换的代价比线程从用户态到内核态的代价小很多。因此在协程调用阻塞IO操作的时候,操作系统会让线程进入阻塞状态,当前的协程和其它绑定在该线程之上的协程都会陷入阻塞而得不到调度,这往往是不能接受的。因此在协程中不能调用导致线程阻塞的操作。也就是说,协程只有和异步IO结合起来,才能发挥最大的威力。协程对计算密集型的任务没有太大的好处,计算密集型的任务本身不需要大量的线程切换,因为协程主要解决以往线程或者进程上下文切换的开销问题,所以协程主要对那些I/O密集型应用更好。协程只有和异步IO结合起来才能发挥出最大的威力。\quad\quad63.实现斐波那契数列斐波那契数列:又称黄金分割数列,指的是这样一个数列:1、1、2、3、5、8、13、21、34、……在数学上,斐波纳契数列以如下被以递归的方法定义:F(1)=1,F(2)=1,F(n)=F(n−1)+F(n−2)(n≥2,n∈N∗)F(1)=1,F(2)=1,F(n)=F(n-1)+F(n-2)(n\geq2,n\inN*)F(1)=1,F(2)=1,F(n)=F(n−1)+F(n−2)(n≥2,n∈N∗)生成器法:deffib(n):ifn==0:returnFalseifnotisinstance(n,int)or(abs(n)!=n):returnFalsea,b=0,1whilen:a,b=b,a+bn-=1yielda>>>fib(10)>>>[iforiinfib(10)][1,1,2,3,5,8,13,21,34,55]123456789101112131415递归法:deffib(n):ifn==0:returnFalseifnotisinstance(n,int)or(n>>fib(10)55>>>[fib(i)foriinrange(1,11)][1,1,2,3,5,8,13,21,34,55]12345678910111213\quad\quad64.正则切分字符串>>>importre>>>str1="helloworld:luobodazahui">>>re.split(r":|",str1)['hello','world','luobo','dazahui']1234\quad\quad65.yield用法yield是用来生成迭代器的语法,在函数中,如果包含了yield,那么这个函数就是一个迭代器。当代码执行至yield时,就会中断代码执行,直到程序调用next()函数时,才会在上次yield的地方继续执行。详情见:《Python中的迭代器和生成器》。\quad\quad67.冒泡排序defBubble(data,reversed):foriinrange(len(data)-1):forjinrange(len(data)-i-1):ifdata[j]>data[j+1]:data[j],data[j+1]=data[j+1],data[j]ifreversed:data.reverse()returndata>>>Bubble(list1,True)[11,9,8,5,3,2]>>>Bubble(list1,False)[2,3,5,8,9,11]12345678910111213\quad\quad68.快速排序思想:首先任意选取一个数据(通常选用数组的第一个数)作为关键数据,然后将所有比它小的数都放到它前面,所有比它大的数都放到它后面,这个过程称为一趟快速排序,之后再递归排序两边的数据。挑选基准值:从数列中挑出一个元素,称为"基准"(pivot)。分割:重新排序数列,所有比基准值小的元素摆放在基准前面,所有比基准值大的元素摆在基准后面(与基准值相等的数可以到任何一边)。在这个分割结束之后,对基准值的排序就已经完成。递归排序子序列:递归地将小于基准值元素的子序列和大于基准值元素的子序列排序。defpartition(arr,low,high):pivot=arr[low]whilelow=pivot:high-=1arr[low],arr[high]=arr[high],arr[low]whilelow>>list1=[8,5,1,3,2,10,11,4,12,20]>>>quickSort(list1,0,len(list1)-1)>>>list1[1,2,3,4,5,8,10,11,12,20]1234567891011121314151617181920212223\quad\quad70.requests简介该库是发起HTTP请求的强大类库,调用简单,功能强大。>>>importrequests>>>url="http://www.baidu.com">>>response=requests.get(url)#获得请求>>>response.encoding="utf-8"#改变其编码>>>html=response.text#获得网页内容>>>binary_content=response.content#获得二进制数据>>>raw=requests.get(url,stream=True)#获得原始响应内容>>>headers={'user-agent':'my-test/0.1.1'}#定制请求头>>>r=requests.get(url,headers=headers)>>>cookies={"cookie":"#yourcookie"}#cookie的使用>>>r=requests.get(url,cookies=cookies)1234567891011\quad\quad71.比较两个json数据是否相等方法一:json数据转换成字典;将两个字典按key排好序,然后使用zip()函数将两个字典对应的元素打包成元组。比较对应的元素的value是否相等;zip()函数用于将可迭代的对象作为参数,将对象中对应的元素打包成一个个元组。>>>file_text2='{"name":"john","age":22,"sex":"woman","address":"USA"}'>>>file_text1='{"name":"john","age":22,"sex":"man","address":"USA"}'>>>dict1=json.loads(file_text1)>>>dict2=json.loads(file_text2)>>>fors1,s2inzip(sorted(dict1),sorted(dict2)):ifstr(dict1[s1])!=str(dict2[s2]):print(s1+":"+dict1[s1]+"!="+s2+":"+dict2[s2])sex:man!=sex:woman12345678方法二:引入第三方模块jsonpatch。>>>importjsonpatch>>>src={'numbers':[1,3,4,8],'foo':'bar'}>>>dst={'foo':'bar','numbers':[1,3,8]}>>>patch=jsonpatch.JsonPatch.from_diff(src,dst)>>>print(patch)[{"op":"remove","path":"/numbers/2"}]123456说明:两个json对象,src要变成dst,需要移除numbers下索引是2的元素。>>>src={'numbers':[1,3,4,8],'foo':'bar'}>>>dst={'foo':'bar','numbers':[1,3,4,8]}>>>patch=jsonpatch.JsonPatch.from_diff(src,dst)>>>print(patch)[]12345若相等的话直接返回空列表。有了这个模块,判断json串是否相等不用遍历内部属性,直接判断patch长度即可。\quad\quad72.读取键盘输入defforinput():input_text=input()print("yourinputtextis:",input_text)>>>forinput()>?2yourinputtextis:21234567\quad\quad73.enumerate()的用法enumerate()是Python内置函数。enumerate()函数用于将一个可遍历的数据对象(如列表、元组或字符串)组合为一个索引序列,同时列出数据和数据下标,一般用在for循环当中。它允许我们遍历数据并自动计数,用法如下:forcounter,valueinenumerate(some_list):print(counter,value)12不只如此,enumerate()也接受一些可选参数,这使它更有用。>>>my_list=['apple','banana','grapes','pear']>>>forc,valueinenumerate(my_list,1):...print(c,value)...1apple2banana3grapes4pear12345678上面这个可选参数允许我们定制从哪个数字开始枚举。此外,还可以用来创建包含索引的元组列表,例如:>>>my_list=['apple','banana','grapes','pear']>>>counter_list=list(enumerate(my_list,1))>>>print(counter_list)[(1,'apple'),(2,'banana'),(3,'grapes'),(4,'pear')]1234\quad\quad74.pass语句pass是空语句,是为了保持程序结构的完整性。pass不做任何事情,一般用做占位语句。defforpass(n):ifn==1:passelse:print('not1')>>>forpass(1)1234567\quad\quad75.正则匹配邮箱>>>importre>>>email_list=["test01@163.com","test02@163.123",".test03g@qq.com","test04@gmail.com"]>>>foremailinemail_list:ret=re.match("[\w]{4,20}@(.*)\.com$",email)ifret:print("%s是符合规定的邮件地址,匹配后结果是:%s"%(email,ret.group()))else:print("%s不符合要求"%email)test01@163.com是符合规定的邮件地址,匹配后结果是:test01@163.comtest02@163.123不符合要求.test03g@qq.com不符合要求test04@gmail.com是符合规定的邮件地址,匹配后结果是:test04@gmail.com12345678910111213\quad\quad76.统计字符串中大写字母的数量>>>str2='werrQWSDdiWuW'>>>counter=0>>>foriinstr2:ifi.isupper():counter+=1>>>counter61234567\quad\quad77.json序列化时保留中文普通序列化:>>>importjson>>>dict1={'name':'萝卜','age':18}>>>dict1_new=json.dumps(dict1)>>>print(dict1_new){"name":"\u841d\u535c","age":18}12345保留中文:>>>importjson>>>dict1={'name':'萝卜','age':18}>>>dict1_new=json.dumps(dict1,ensure_ascii=False)>>>print(dict1_new){"name":"萝卜","age":18}12345\quad\quad78.简述继承一个类继承自另一个类,也可以说是一个孩子类/派生类/子类,继承自父类/基类/超类,同时获取所有的类成员(属性和方法)。继承使我们可以重用代码,并且还可以更方便地创建和维护代码。Python支持以下类型的继承:单继承:一个子类类继承自单个基类多重继承:一个子类继承自多个基类多级继承:一个子类继承自一个基类,而基类继承自另一个基类分层继承:多个子类继承自同一个基类混合继承:两种或两种以上继承类型的组合\quad\quad79.什么是猴子补丁(🧡🧡)猴子补丁是指在运行时动态修改类和模块。猴子补丁主要有以下几个用处:在运行时替换方法、属性等;在不修改第三方代码的情况下增加原来不支持的功能;在运行时为内存中的对象增加patch而不是在磁盘的源代码中增加。详细看链接:《Python进阶系列》十七:详解Python中的猴子补丁——允许在运行时更改对象的行为\quad\quad80.help()函数和dir()函数help()函数返回帮助文档和参数说明>>>help(dict)Helponclassdictinmodulebuiltins:classdict(object)|dict()->newemptydictionary|dict(mapping)->newdictionaryinitializedfromamappingobject's|(key,value)pairs|dict(iterable)->newdictionaryinitializedasifvia:|d={}|fork,viniterable:|d[k]=v|dict(**kwargs)->newdictionaryinitializedwiththename=valuepairs|inthekeywordargumentlist.Forexample:dict(one=1,two=2)||Methodsdefinedhere:......123456789101112131415dir()函数返回对象中的所有成员(任何类型)>>>dir(dict)['__class__','__contains__','__delattr__','__delitem__','__dir__','__doc__','__eq__','__format__','__ge__','__getattribute__',......123456789101112\quad\quad81.解释Python中的//,%和**运算符//运算符执行地板除法,返回结果的整数部分(向下取整)。%是取模符号,返回除法后的余数。**符号表示取幂。a**b返回a的b次方。\quad\quad82.主动抛出异常使用raise:deftest_raise(n):ifnotisinstance(n,int):raiseException("notainttype")else:print("good")>>>test_raise(8.9)Traceback(mostrecentcalllast):File"D:\Anaconda3\lib\site-packages\IPython\core\interactiveshell.py",line3331,inrun_codeexec(code_obj,self.user_global_ns,self.user_ns)File"",line1,intest_raise(8.9)File"",line3,intest_raiseraiseException("notainttype")Exception:notainttype123456789101112131415\quad\quad83.tuple和list转换>>>tuple1=(1,2,3,4)>>>list1=list(tuple1)>>>print(list1)>>>tuple2=tuple(list1)>>>print(tuple2)12345\quad\quad84.简述断言Python的断言就是检测一个条件,如果条件为真,它什么都不做;反之它触发一个带可选错误信息的AssertionError。deftestassert(n):assertn==2,"nisnot2"print("nis2")>>>testassert(2)nis2>>>testassert(3)Traceback(mostrecentcalllast):File"D:\Anaconda3\lib\site-packages\IPython\core\interactiveshell.py",line3331,inrun_codeexec(code_obj,self.user_global_ns,self.user_ns)File"",line1,intestassert(3)File"",line2,intestassertassertn==2,"nisnot2"AssertionError:nisnot2123456789101112131415\quad\quad85.什么是异步非阻塞同步异步指的是调用者与被调用者之间的关系。所谓同步,就是在发出一个功能调用时,在没有得到结果之前,该调用就不会返回,一旦调用返回,就得到了返回值;异步的概念和同步相对,调用在发出之后,这个调用就直接返回了,所以没有返回结果。当该异步功能完成后,被调用者可以通过状态、通知或回调来通知调用者。阻塞非阻塞是线程或进程之间的关系。阻塞调用是指调用结果返回之前,当前线程会被挂起(如遇到io操作)。调用线程只有在得到结果之后才会返回。函数只有在得到结果之后才会将阻塞的线程激活非阻塞和阻塞的概念相对应,非阻塞调用指在不能立刻得到结果之前也会立刻返回,同时该函数不会阻塞当前线程\quad\quad86.什么是负索引Python中的序列是有索引的,它由正数和负数组成。正的数字使用’0’作为第一个索引,‘1’作为第二个索引,以此类推。负数的索引从’-1’开始,表示序列中的最后一个索引,’-2’作为倒数第二个索引,依次类推。\quad\quad87.退出Python后,内存是否全部释放不是的,那些具有对象循环引用或者全局命名空间引用的变量,在Python退出时往往不会被释放,另外不会释放C库保留的部分内容。\quad\quad88.Flask和Django的异同Flask是“microframework”,主要用来编写小型应用程序,不过随着Python的普及,很多大型程序也在使用Flask。同时,在Flask中,我们必须使用外部库。Django适用于大型应用程序。它提供了灵活性,以及完整的程序框架和快速的项目生成方法。可以选择不同的数据库,URL结构,模板样式等。\quad\quad89.创建删除操作系统上的文件>>>f=open('test.txt','w')>>>f.close()>>>os.listdir()['.idea','test.txt','__pycache__']>>>os.remove('test.txt')>>>os.listdir()['.idea','__pycache__']1234567891011\quad\quad90.简述logging模块logging模块是Python内置的标准模块,主要用于输出运行日志,可以设置输出日志的等级、日志保存路径、日志文件回滚等;相比print,具备如下优点:可以通过设置不同的日志等级,在release版本中只输出重要信息,而不必显示大量的调试信息print将所有信息都输出到标准输出中,严重影响开发者从标准输出中查看其它数据;logging则可以由开发者决定将信息输出到什么地方,以及怎么输出。简单配置:>>>importlogging>>>logging.debug("debuglog")>>>logging.info("infolog")>>>logging.warning("warninglog")>>>logging.error("errorlog")>>>logging.critical("criticalog")123456默认情况下,只显示了大于等于WARNING级别的日志。logging.basicConfig()函数调整日志级别、输出格式等。详细看链接:《Python进阶系列》九:别再用print来打印了,试试logging模块\quad\quad91.统计字符串中字符出现次数>>>fromcollectionsimportCounter>>>str1="nihsasehndciswemeotpxc">>>print(Counter(str1))Counter({'s':3,'e':3,'n':2,'i':2,'h':2,'c':2,'a':1,'d':1,'w':1,'m':1,'o':1,'t':1,'p':1,'x':1})1234\quad\quad92.正则re.complie的作用re.compile是将正则表达式编译成一个对象,加快速度,并重复使用。\quad\quad93.tryexceptelsefinally的意义try..except..else没有捕获到异常,执行else语句try..except..finally不管是否捕获到异常,都执行finally语句\quad\quad94.反转列表第一种方法:使用切片>>>list1=list(range(10))>>>list1[::-1][9,8,7,6,5,4,3,2,1,0]123第二种方法:使用reverse()>>>list1=list(range(10))>>>list1.reverse()>>>list1[9,8,7,6,5,4,3,2,1,0]1234需要注意的是:这两种方法都可以反转列表,但内置函数reverse()会更改原始列表,而切片方法会创建一个新列表。内置函数reverse()比列表切片方法更快!\quad\quad95.字符串中数字替换使用re正则替换:>>>importre>>>str1='我是周萝卜,今年18岁'>>>re.sub(r"\d+","20",str1)'我是周萝卜,今年20岁'1234\quad\quad96.读取大文件(🧡🧡)现要处理一个大小为10G的文件,但是内存只有4G,如果在只修改get_lines函数而其他代码保持不变的情况下,应该如何实现?需要考虑的问题都有那些?defget_lines():withopen('file.txt','rb')asf:returnf.readlines()ifname=='main':foreinget_lines():process(e)#处理每一行数据1234567方法一:readlines()函数在文件过大时并不适用,应添加参数,限制读取的字节数,并使用生成器。defget_lines():l=[]withopen('file.txt','rb')asf:data=f.readlines(60000)l.append(data)yieldl123456'运行运行方法二:使用mmapfrommmapimportmmapdefget_lines(fp):withopen(fp,"r+")asf:m=mmap(f.fileno(),0)tmp=0fori,charinenumerate(m):ifchar==b"\n":yieldm[tmp:i+1].decode()tmp=i+1ifname=="main":foriinget_lines("fp_some_huge_file"):print(i)1234567891011121314详细看链接:《Python进阶系列》二十八:mmap模块(处理大文本)\quad\quad97.输入日期,判断这一天是这一年的第几天importdatetimedefdayofyear():year=input("请输入年份:")month=input("请输入月份:")day=input("请输入天:")date1=datetime.date(year=int(year),month=int(month),day=int(day))date2=datetime.date(year=int(year),month=1,day=1)return(date1-date2).days+1>>>dayofyear()请输入年份:>?2022请输入月份:>?5请输入天:>?23143123456789101112131415\quad\quad98.排序根据字典按值排序现有字典d={'a':24,'g':52,'i':12,'k':33}请按value值进行排序?>>>d={'a':24,'g':52,'i':12,'k':33}>>>d.items()dict_items([('a',24),('g',52),('i',12),('k',33)])>>>sorted(d.items(),key=lambdax:x[1])[('i',12),('a',24),('k',33),('g',52)]123456x[0]代表用key进行排序;x[1]代表用value进行排序。请按alist中元素的age由大到小排序>>>alist=[{'name':'a','age':20},{'name':'b','age':30},{'name':'c','age':25}]>>>sorted(alist,key=lambdax:x['age'],reverse=True)[{'name':'b','age':30},{'name':'c','age':25},{'name':'a','age':20}]123列表内,字典按照value大小排序>>>list1=[{'name':'guanyu','age':29},...{'name':'zhangfei','age':28},...{'name':'liubei','age':31}]>>>sorted(list1,key=lambdax:x['age'])[{'name':'zhangfei','age':28},{'name':'guanyu','age':29},{'name':'liubei','age':31}]>>>sorted(list1,key=lambdax:x['name'])[{'name':'guanyu','age':29},{'name':'liubei','age':31},{'name':'zhangfei','age':28}]1234567\quad\quad99.将字符串处理成字典>>>k="k:1|k1:2|k2:3|k3:4">>>dict1={}>>>foritemsink.split("|"):...key,value=items.split(":")...dict1[key]=value12345字典推导式:>>>{k:vforitemsink.split("|")fork,vin(items.split(":"),)}{'k':'1','k1':'2','k2':'3','k3':'4'}12\quad\quad100.下面代码的输出结果将是什么?list=['a','b','c','d','e']print(list[10:])12'运行运行代码将输出[],不会产生IndexError错误,就像所期望的那样,尝试用超出成员的个数的index来获取某个列表的成员。例如,尝试获取list[10]和之后的成员,会导致IndexError。然而,尝试获取列表的切片,开始的index超过了成员个数不会产生IndexError,而是仅仅返回一个空列表。这成为特别让人恶心的疑难杂症,因为运行的时候没有错误产生,导致Bug很难被追踪到。
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 会员注册

本版积分规则

QQ|手机版|心飞设计-版权所有:微度网络信息技术服务中心 ( 鲁ICP备17032091号-12 )|网站地图

GMT+8, 2025-1-10 13:58 , Processed in 0.590328 second(s), 25 queries .

Powered by Discuz! X3.5

© 2001-2025 Discuz! Team.

快速回复 返回顶部 返回列表