Heim > Artikel > Backend-Entwicklung > Zusammenfassung der grundlegenden Fragen zu Python (mit Antworten)
Dieser Artikel enthält eine Zusammenfassung grundlegender Python-Fragen (mit Antworten). Freunde in Not können darauf verweisen.
1. Warum Python lernen?
Das Leben ist zu kurz? Ist diese Welt es nicht wert? Denken Sie über Ihre ursprüngliche Absicht nach!
2. Wie hast du Python gelernt?
Offizielle Website, Online-Videos, Lernwebsites, Foren, Anleitung von Experten
3. Vergleich zwischen Python und anderen Sprachen wie Java, PHP, C, C#, C++ und so weiter ?
(1), Python-Code, kurz, klar, elegant, einfach und leicht verständlich
(2), hohe Entwicklungseffizienz
(3), starke Skalierbarkeit
4 , interpretierte und kompilierte Programmiersprachen kurz beschreiben?
Interpretierter Typ: Beim Ausführen des Programms interpretiert der Computer den Code einzeln in Maschinensprache, damit der Computer ihn ausführen kann.
Kompilierter Typ: Jede Anweisung des Quellprogramms wird in Maschinensprache kompiliert Speichern Sie es als Binärdatei, damit der Computer, wenn er das Programm ausführt, das Programm direkt in Maschinensprache ausführen kann und es sehr schnell ausgeführt wird.
5. Arten und Eigenschaften von Python-Interpretern?
Cpython, IPython, Jpython, Pypy, Ironpython
Um den Code auszuführen, muss er über den Interpreter ausgeführt werden. Es gibt mehrere Interpreter für Python Entwicklung, jeder Interpreter hat unterschiedliche Eigenschaften, aber alle können Python-Code normal ausführen. Die folgenden fünf häufig verwendeten Python-Interpreter sind:
CPython: Nach dem Herunterladen und Installieren von Python2.7 von der offiziellen Python-Website. Sie erhalten direkt eine offizielle Version des Interpreters: Cpython. Dieser Interpreter ist in der C-Sprache entwickelt und wird daher als CPython-Interpreter bezeichnet.
IPython: IPython ist ein interaktiver Interpreter, der auf CPython basiert. Das heißt, IPython wird nur im interaktiven Modus erweitert, aber die Funktion zum Ausführen von Python-Code ist genau die gleiche wie bei vielen Obwohl Das Erscheinungsbild inländischer Browser ist unterschiedlich, der Kern ruft tatsächlich den IE auf.
PyPy: PyPy ist ein weiterer Python-Interpreter. Sein Ziel ist die Ausführungsgeschwindigkeit. PyPy nutzt die JIT-Technologie, um Python-Code dynamisch zu kompilieren, sodass die Ausführungsgeschwindigkeit von Python-Code erheblich verbessert werden kann.
Jython: Jython ist ein Python-Interpreter, der auf der Java-Plattform läuft. Er kann Python-Code zur Ausführung direkt in Java-Bytecode kompilieren.
IronPython: IronPython ähnelt Jython, außer dass IronPython ein Python-Interpreter ist, der auf der Microsoft .Net-Plattform läuft und Python-Code direkt in .Net-Bytecode kompilieren kann.
Unter den Python-Interpretern wird CPython häufig für die Python-Kompilierung verwendet. Zusätzlich zur Verwendung des oben genannten Interpreters
können hochqualifizierte Entwickler auch nach ihren eigenen Bedürfnissen kompilieren Ihr eigener Python-Interpreter zum Ausführen von Python-Code, was sehr praktisch ist!
6. Welche Beziehung besteht zwischen Bits und Bytes?
Ein Byte = 8 Bits
Welche Beziehung besteht zwischen 7, b, B, KB, MB und GB?
1B (Byte) = 8b (Bit)
1KB = 1024B
1MB = 1024KB
1GB = 1024MB
8. Bitte listen Sie mindestens 5 PEP8-Spezifikationen auf
(1), Einrückung: 4 Einrückungen pro Ebene. Bei zeilenübergreifenden Fortsetzungen sollten Klammern oder geschweifte Klammern oder hängende Einzüge verwendet werden.
(2), Codelängenbeschränkungen
Anzahl der Zeilen und Spalten in einer Zeile: PEP8 schreibt ein Maximum von 79 Spalten vor. Wenn die URL gespleißt ist, kann das Limit leicht überschritten werden
A Funktion: darf 30 Zeilen nicht überschreiten; intuitiv reicht es aus, eine Funktion vollständig auf einem Bildschirm anzuzeigen, ohne sie nach oben und unten zu ziehen.
Eine Klasse: nicht mehr als 200 Zeilen Code, nicht mehr als 10 Methoden
Ein Modul: nicht mehr als 500 Zeilen
(3 ), Import
Verweisen Sie nicht auf mehrere Bibliotheken in einem Importsatz
(4), Benennung Konventionen
(5), Kommentare
Allgemeine Grundsätze: Ein falscher Kommentar ist schlimmer als gar kein Kommentar. Wenn sich also ein Teil des Codes ändert, müssen zunächst die Kommentare geändert werden!
9. Implementieren Sie die folgende Konvertierung durch Code:
答案: 二进制转换成十进制:v = “0b1111011” print(int('0b1111011',2)) 十进制转换成二进制:v = 18 print(bin(18)) 八进制转换成十进制:v = “011” print(int('011',8)) 十进制转换成八进制:v = 30 print(oct(30)) 十六进制转换成十进制:v = “0x12” print(int('0x12',16)) 十进制转换成十六进制:v = 87 print(hex(87))
10. Bitte schreiben Sie eine Funktion, um die IP-Adresse in eine Ganzzahl umzuwandeln.
Zum Beispiel lautet die Konvertierungsregel in 10.3.9.12:
10 00001010 3 00000011 9 00001001 12 00001100
Verketten Sie dann die obigen Binärzahlen, um das Dezimalergebnis zu berechnen: 00001010 00000011 00001001 00001100 =?
Antwort:
def func(x): lis = x.strip().split('.') li = [bin(int(i)) for i in lis] li2 = [i.replace('0b',(10-len(i))*'0') for i in li] return int(''.join(li2),2) ret = func('10.3.9.12') print(ret)
11. Die maximale Anzahl von Ebenen der Python-Rekursion?
Die standardmäßige maximale Rekursionstiefe eines allgemeinen Computers liegt bei etwa 1000. Die maximale Rekursionstiefe von Python liegt im Allgemeinen bei etwa 4000. Sie hängt von der Leistung des Computers ab
Diese Zahl ist keine feste Zahl und kann auf folgende Weise getestet werden
import sys print(sys.getrecursionlimit()) print(sys.setrecursionlimit(10000))
12. Finden Sie das Ergebnis:
v1 = 1 oder 3 -------------->1
v2 = 1 und 3---- ---------->3
v3 = 0 und 2 und 1-------->0
v4 = 0 und 2 oder 1------ --->1
v5 = 0 und 2 oder 1 oder 4---->1
v6 = 0 oder Flase und 1---- ->Falsch
13 , ASCII, Unicode, UTF-8, GBK Unterschied?
ASCII-Code: verwendet eine Ein-Byte-Kodierung, daher umfasst sein Bereich im Wesentlichen nur englische Buchstaben, Zahlen und einige Sonderzeichen, also nur 256 Zeichen.
Unicode: Kann alle Bytes der Welt darstellen
GBK: Wird nur zum Codieren chinesischer Zeichen verwendet. Der vollständige Name von GBK lautet „Chinese Character Internal Code Extension Specification“ und verwendet Doppelbyte-Codierung.
UTF-8: Es handelt sich um eine Zeichenkodierung variabler Länge für Unicode, auch bekannt als Universal Code.
14. Was ist der Unterschied zwischen Bytecode und Maschinencode?
机器码:是电脑CPU直接读取运行的机器指令,运行速度最快,但是非常晦涩难懂
字节码:是一种中间状态(中间码)的二进制代码(文件)。需要直译器转译后才能成为机器码。
15、三元运算规则以及应用场景?
规则:为真时的结果 if 判定条件 else 为假时的结果`
应用场景:在赋值变量的时候,可以直接加判断,然后赋值`
16、列举 Python2和Python3的区别?
1、默认编码:2-->ascii,3-->utf-8
2、print的区别:python2中print是一个语句,不论想输出什么,直接放到print关键字后面即可。python3里,print()是一个函数,像其他函数一样,print()需要你将要输出的东西作为参数传给它。
3、input的区别:
python2有两个全局函数,用在命令行请求用户输入。第一个叫input(),它等待用户输入一个python表达式(然后返回结果)。
第二个叫做raw_input(),用户输入什么他就返回什么。python3 通过input替代了他们。
4、字符串:python2中有两种字符串类型:Unicode字符串和非Unicode字符串。Python3中只有一种类型:Unicode字符串。
5、xrange():
python2里,有两种方法获得一定范围内的数字:range(),返回一个列表,还有xrange(),返回一个迭代器。
python3 里,range()返回迭代器,xrange()不再存在。
17、用一行代码实现数值交换:
a = 1 b = 2
答案:a = 1
b = 2 a,b = b,a
18、Python3和Python2中 int 和 long的区别?
python2有非浮点数准备的int和long类型。int类型最大
值不能超过sys.maxint,而且这个最大值是平台相关的。
可以通过在数字的末尾附上一个L来定义长整型,显然,它比int类型表示的数字范围更大。在python3里,
只有一种整数类型int,大多数情况下,和python2中的长整型类似。
19、xrange和range的区别?
python2里,有两种方法获得一定范围内的数字:range(),返回一个列表,还有xrange(),返回一个迭代器。
python3 里,range()返回迭代器,xrange()不再存在。
20、文件操作时:xreadlines和readlines的区别?
readlines返回一个list,xreadlines方法返回一个生成器
21、列举布尔值为False的常见值?
0, [] , () , {} , '' , False , None
22、字符串、列表、元组、字典每个常用的5个方法?
字符串:repleace,strip,split,reverse,upper,lower,join.....
列表:append,pop,insert,remove,sort,count,index.....
元组:index,count,__len__(),__dir__()
字典:get,keys,values,pop,popitems,clear,update,items.....
23、lambda表达式格式以及应用场景?
表达式格式:lambda后面跟一个或多个参数,紧跟一个冒号,以后是一个表达式。冒号前是参数,冒号后是返回值。例如:lambda x : 2x
应用场景:经常与一些内置函数相结合使用,比如说map(),filter(),sorted(),reduce()等
24、pass的作用?
1、空语句 do nothing
2、保证格式完整
3、保证语义完整
25、arg和*kwarg作用?
万能参数,解决了函数参数不固定的问题
*arg:会把位置参数转化为tuple
**kwarg:会把关键字参数转化为dict
26、is和==的区别?
is:判断内存地址是否相等
==:判断数值是否相等
27、简述Python的深浅拷贝以及应用场景?
copy():浅copy,浅拷贝指仅仅拷贝数据集合的第一层数据
deepcopy():深copy,深拷贝指拷贝数据集合的所有层
28、Python垃圾回收机制?
python采用的是引用计数机制为主,标记-清除和分代收集(隔代回收、分代回收)两种机制为辅的策略
计数机制
Python的GC模块主要运用了引用计数来跟踪和回收垃圾。在引用计数的基础上,还可以通过“标记-清除”
解决容器对象可能产生的循环引用的问题。通过分代回收以空间换取时间进一步提高垃圾回收的效率。
标记-清除:
标记-清除的出现打破了循环引用,也就是它只关注那些可能会产生循环引用的对象
缺点:该机制所带来的额外操作和需要回收的内存块成正比。
隔代回收
原理:将系统中的所有内存块根据其存活时间划分为不同的集合,每一个集合就成为一个“代”,
垃圾收集的频率随着“代”的存活时间的增大而减小。也就是说,活得越长的对象,就越不可能是垃圾,
就应该减少对它的垃圾收集频率。那么如何来衡量这个存活时间:通常是利用几次垃圾收集动作来衡量,
如果一个对象经过的垃圾收集次数越多,可以得出:该对象存活时间就越长。
29、python的可变类型和不可变类型?
不可变类型(数字、字符串、元组、不可变集合)
可变类型(列表、字典、可变集合)
30、求结果:
v = dict.fromkeys(['k1','k2'],[]) v['k1'].append(666) print(v) v['k1'] = 777 print(v)
答案:{'k1':[666],'k2':[666]} {'k1':777,'k2':[666]} 解析:formkeys()默认参数为可变数据类型时有坑
31、求结果:
def num(): return [lambda x: i*x for i in range(4)] print([m(2) for m in num()]) 答案:[6, 6, 6, 6] 解析: 问题的本质在与python中的属性查找规则,LEGB(local,enclousing,global,bulitin), 在上面的例子中,i就是在闭包作用域(enclousing),而Python的闭包是 迟绑定 , 这意味着闭包中用到的变量的值,是在内部函数被调用时查询得到的 所以:[lambda x: i*x for i in range(4)]打印出来是含有四个内存地址的列表,每个内存地址中的i 在在本内存中都没有被定义,而是通过闭包作用域中的i值,当for循环执行结束后,i的值等于3,所以 再执行[m(2) for m in num()]时,每个内存地址中的i值等于3,当x等于2时,打印出来的结果都是6, 从而得到结果[6, 6, 6, 6]。
32、列举常见的内置函数?
map,filter,zip,len,bin,oct,hex,int,float,bool,sum,min,max,str,list,tuple,dict,range,next,hash,help,id.....
33、filter、map、reduce的作用?
filter(function,iterable)过滤函数
map(function,iterable)循环函数
reduce(function, iterable)累积函数
34、一行代码实现9*9乘法表。
lis = ['%s%s=%s'%(i,j,ij) for i in range(1,10) for j in range(i,10)]
35、如何安装第三方模块?以及用过哪些第三方模块?
pip3 imstall 模块名
django,Matplotlib,Tornado,PyGame
36、至少列举8个常用模块都有那些?
os,sys,time,random,re,hashlib,logging,json,pickle....
37、re的match和search区别?
match:从字符串的开头位置匹配,必须以此为开头
search:从开头开始查,找到符合的就返回结果
38、什么是正则的贪婪匹配?
正则表达式一般趋向于最大长度匹配
39、求结果:
a. [ i % 2 for i in range(10) ] ===>[0,1,0,1,0,1,0,1,0,1]
b. ( i % 2 for i in range(10) )===>返回一个生成器的内存地址
40、求结果:
a. 1 or 2 =========>1
b. 1 and 2 ========>2
c. 1 e74700f0fad84c14ec8341c65953be86false
d. 1 58633b6706f4579aa07aa9fef9094fa8ture
41、def func(a,b=[]) 这种写法有什么坑?
def func(a,b=[]):
b.append(a) print(b)
函数的第二个默认参数是一个list,当第一次执行的时候实例化了一个list,
第二次执行还是用第一次执行的时候实例化的地址存储,以后每次实例化都是
42、如何实现 "1,2,3" 变成 ['1','2','3'] ?
a = "1,2,3" li = a.split(',')
43、如何实现[‘1’,’2’,’3’]变成[1,2,3] ?
li = ['1','2','3'] lis = list(map(lambda x:int(x) li))
44、比较: a = [1,2,3] 和 b = [(1),(2),(3) ] 以及 b = [(1,),(2,),(3,) ] 的区别?
a = [1,2,3]正常的列表
b = [(1),(2),(3)] 虽然列表的每个元素加上了括号,但是当括号内只有一个元素并且没有逗号时,其数据类型是元素本身的数据类型
b = [(1,),(2,),(3,)]列表中的元素类型都是元组类型
45、如何用一行代码生成[1,4,9,16,25,36,49,64,81,100] ?
li = [x*x for x in range(1,11)]
46、一行代码实现删除列表中重复的值 ?
li = [1, 1, 1, 23, 3, 4, 4] new_li = list(set(li)) new_li.sort(key=li.index)
47、如何在函数中设置一个全局变量 ?
使用python的内置语法 globals 全局变量
48、logging模块的作用?以及应用场景?
logging模块的作用:
1、程序调试
2、了解软件程序运行情况,是否正常
3、软件程序运行故障分析与问题定位
应用场景:网站的运维工作,程序实时监控
49、请用代码简答实现stack 。
def Stack(object):
def __init__(self): self.stack = [] def push(self,value): # 进栈 self.stack.append(value) def pop(self): # 出栈 if self.stack: self.stack.pop() else: raise LookupError('stack is empty!') def is_empty(self): # 查看stack是否为空 reture bool(self.stack) def top(self): # 取出stack中最新的值 return self.stack[-1]
50、常用字符串格式化哪几种?
1、%s %d
2、format格式化输出
3、print(f'内容{变量名}')
51、简述 生成器、迭代器、可迭代对象 以及应用场景?
生成器:在 Python 中,一边循环一边计算的机制,称为 生成器(generator),
通过next()取值,两种表现形式1、将列表生成式的[]改为()2、含有yield关键字的函数 应用场景:优化代码,节省内存
迭代器:是访问集合元素的一种方式。迭代器同时实现了__iter__和__next__方法
可迭代对象:只要实现了__iter__方法的对象就是可迭代对象
52、用Python实现一个二分查找的函数。
lis = [0, 1, 3, 4, 5, 6, 7, 9, 10, 11,12,16,17]
def two_find(x, lis, start=0, end=None):
if end == None:end = len(lis) - 1 num = (end - start) // 2 + start if end > start: if lis[num] > x: return two_find(x, lis, start=start, end=num) elif lis[num] 5fa6d34985dc0989b0c4dd7549f0a6a6>> import json >>> class ComplexEncoder(json.JSONEncoder): ... def default(self, obj): ... if isinstance(obj, complex): ... return [obj.real, obj.imag] ... return json.JSONEncoder.default(self, obj) ... >>> dumps(2 + 1j, cls=ComplexEncoder) '[2.0, 1.0]' >>> ComplexEncoder().encode(2 + 1j) '[2.0, 1.0]' >>> list(ComplexEncoder().iterencode(2 + 1j)) ['[', '2.0', ', ', '1.0', ']']
import json import datetime ret = datetime.datetime.now() class CJsonEncoder(json.JSONEncoder): def default(self, obj): if isinstance(obj, datetime.date): return obj.strftime('%Y-%m-%d %H:%M:%S') else: return json.JSONEncoder.default(self, obj) print(json.dumps(ret,cls=CJsonEncoder))
76、json序列化时,默认遇到中文会转换成unicode,如果想要保留中文怎么办?
在序列化是将json.dumps中的默认参数ensure_ascii改为False就可以保留中文了
json.dumps(obj,ensure_ascii=False)
77、什么是断言?应用场景?
assert 条件,'自定义错误提示(可有可无)' 例:assert 1 == 0,'这是一个低级的错误'
合约式设计是断言的经典应用,在一个正确的程序里,所有的前置条件和后置条件都将得到处理。
78、使用代码实现查看列举目录下的所有文件。
方法一:递归处理
import os url = r'C:\Users\Mr.Wang\PycharmProjects\untitled\前段学习' def check_file(url,li = []): if os.path.isdir(url): file_list = os.listdir(url) for ret in file_list: base_url = os.path.join(url,ret) if os.path.isfile(base_url): li.append(ret) else: check_file(base_url) return li else:return os.path.basename(url)
方法二:堆栈的思想处理
import os url = r'C:\Users\Mr.Wang\PycharmProjects\untitled\python基础' lis = [url] while lis: url = lis.pop() ret_list = os.listdir(url) for name in ret_list: abs_path = os.path.join(url,name) if os.path.isdir(abs_path): lis.append(abs_path) else:print(name)
79、简述 yield和yield from关键字。
yield 是一个类似 return 的关键字,只是这个函数返回的是个生成器当你调用这个函数的时候,
函数内部的代码并不立马执行 ,这个函数只是返回一个生成器对象,当你使用for进行迭代的时候,
函数中的代码才会执行
yield from 的主要功能是打开双向通道,把最外层的调用方与最内层的子生成器连接起来,
这样二者可以直接发送和产出值,还可以直接传入异常,而不用在位于中间的协程中添加大量处理异常的样板代码。
有了这个结构,协程可以通过以前不可能的方式委托职责。
80、代码实现六位随机验证码
import random s = '' for i in range(6): num = random.randint(0,9) alpha1 = chr(random.randint(65,90)) alpha2 = chr(random.randint(97,122)) ret = random.choice([num,alpha1,alpha2]) s += str(ret) print(s)
81、代码实现随机发红包功能
import random def red_packge(money,num): li = random.sample(range(1,money*100),num-1) li.extend([0,money*100]) li.sort() return [(li[index+1]-li[index])/100 for index in range(num)] ret = red_packge(100,10) print(ret) --------------------------生成器版------------------------------------------- import random def red_packge(money,num): li = random.sample(range(1,money*100),num-1) li.extend([0,money*100]) li.sort() for index in range(num): yield (li[index+1]-li[index])/100 ret = red_packge(100,10) print(ret)
82、请尽可能列举python列表的成员方法,并给出列表操作的答案:
(1) a=[1, 2, 3, 4, 5], a[::2]=? a[-2:]=? a[::2]=[1,3,5], a[-2:] = [4,5] (2)一行代码实现对列表a中的偶数位置的元素进行加3后求和? sum([i+3 for i in a[::2]]) (3)将列表a的元素顺序打乱,再对a进行排序得到列表b,然后把a和b按元素顺序构造一个字典d。 import random random.shuffle(a) b=a.sort() d={} for i in range(len(a)):d[a[i]] = b[i]
83、Python自省
自省就是面向对象的语言所写的程序在运行时,就能知道对象的类型。也就是程序运行时能够获得对象的类型。比如type(),dir(),getattr(),hasattr(),isinstance()。
84、Python是如何进行内存管理的?
从三个方面来说,一对象的引用计数机制,二垃圾回收机制,三内存池机制
一、对象的引用计数机制
Python内部使用引用计数,来保持追踪内存中的对象,所有对象都有引用计数。
引用计数增加的情况:
1,一个对象分配一个新名称
2,将其放入一个容器中(如列表、元组或字典)
引用计数减少的情况:
1,使用del语句对对象别名显示的销毁
2,引用超出作用域或被重新赋值
sys.getrefcount( )函数可以获得对象的当前引用计数
多数情况下,引用计数比你猜测得要大得多。对于不可变数据(如数字和字符串),解释器会在程序的不同部分共享内存,以便节约内存。
二、垃圾回收
1,当一个对象的引用计数归零时,它将被垃圾收集机制处理掉。
2,当两个对象a和b相互引用时,del语句可以减少a和b的引用计数,并销毁用于引用底层对象的名称。然而由于每个对象都包含一个对其他对象的应用,因此引用计数不会归零,对象也不会销毁。(从而导致内存泄露)。为解决这一问题,解释器会定期执行一个循环检测器,搜索不可访问对象的循环并删除它们。
三、内存池机制
Python提供了对内存的垃圾收集机制,但是它将不用的内存放到内存池而不是返回给操作系统。
1,Pymalloc机制。为了加速Python的执行效率,Python引入了一个内存池机制,用于管理对小块内存的申请和释放。
2,Python中所有小于256个字节的对象都使用pymalloc实现的分配器,而大的对象则使用系统的malloc。
3,对于Python对象,如整数,浮点数和List,都有其独立的私有内存池,对象间不共享他们的内存池。也就是说如果你分配又释放了大量的整数,用于缓存这些整数的内存就不能再分配给浮点数。
85、介绍一下except的用法和作用?
try…except…except…else…
-- 执行try下的语句,如果引发异常,则执行过程会跳到except语句。对每个except分支顺序尝试执行,如果引发的异常与except中的异常组匹配,执行相应的语句。如果所有的except都不匹配,则异常会传递到下一个调用本代码的最高层try代码中。
-- try下的语句正常执行,则执行else块代码。如果发生异常,就不会执行
-- 如果存在finally语句,最后总是会执行。
86、如何用Python来进行查询和替换一个文本字符串?
可以使用re模块中的sub()函数或者subn()函数来进行查询和替换,比replace的功能更强大!!!
格式:sub(replacement, string[,count=0])(replacement是被替换成的文本,string是需要被替换的文本,count是一个可选参数,指最大被替换的数量)
import re p=re.compile("blue|white|red") print(p.sub('colour','blue socks and red shoes')) print(p.sub('colour','blue socks and red shoes',count=1))
subn()方法执行的效果跟sub()一样,不过它会返回一个二维数组,包括替换后的新的字符串和总共替换的数量
87、有没有一个工具可以帮助查找python的bug和进行静态的代码分析?
PyChecker是一个python代码的静态分析工具,它可以帮助查找python代码的bug, 会对代码的复杂度和格式提出警告
Pylint是另外一个工具可以进行codingstandard检查
Das obige ist der detaillierte Inhalt vonZusammenfassung der grundlegenden Fragen zu Python (mit Antworten). Für weitere Informationen folgen Sie bitte anderen verwandten Artikeln auf der PHP chinesischen Website!