這篇文章帶給大家的內容是關於python基礎題目總結(附答案),有一定的參考價值,有需要的朋友可以參考一下,希望對你有幫助。
1、為什麼要學習Python?
人生苦短?人間不值得?想想自己的初心吧!
2、經由什麼途徑學習的Python?
官網、網路影片、學習網站、論壇、大牛的輔導
3、Python和Java、PHP、C、C#、C 等其他語言的對比?
(1)、python程式碼,簡介,明確,優雅,簡單易懂
(2)、開發效率高
(3)、可擴展性強
4 、簡述解釋型和編譯型程式語言?
解釋型:在執行程式時,電腦才一條一條的將程式碼解釋成機器語言給電腦來執行
編譯型:是把原始程式的每一語句都編譯成機器語言,並保存成二進位文件,這樣電腦運行該程式時可以直接以機器語言來運行此程序,運行速度很快。
5、Python解釋器種類以及特點?
Cpython,IPython,Jpython,pypy,Ironpython
Python是一門解釋器語言,程式碼想運行,必須透過解釋器執行,Python存在多種解釋器,分別基於不同語言開發,每個解釋器有不同的特點,但都能正常運行Python程式碼,以下是常用的五種Python解釋器:
CPython:當從Python官方網站下載並安裝Python2.7後,就直接獲得了一個官方版本的解釋器:Cpython,這個解釋器是用C語言開發的,所以叫CPython,在命名行下運行python,就是啟動CPython解釋器,CPython是使用最廣的Python解釋器。
IPython:IPython是基於CPython之上的一個互動式解釋器,也就是說,IPython只是在互動方式上有所增強,但是執行Python程式碼的功能和CPython是完全一樣的,好比很多國產瀏覽器雖然外觀不同,但核心其實是呼叫了IE。
PyPy:PyPy是另一個Python解釋器,它的目標是執行速度,PyPy採用JIT技術,對Python代進行動態編譯,所以可以顯著提高Python程式碼的執行速度。
Jython:Jython是運行在Java平台上的Python解釋器,可以直接把Python程式碼編譯成Java字節碼執行。
IronPython:IronPython和Jython類似,只不過IronPython是運行在微軟.Net平台上的Python解釋器,可以直接把Python程式碼編譯成.Net的字節碼。
在Python的解釋器中,使用廣泛的是CPython,對於Python的編譯,除了可以採用以上解釋器
進行編譯外,技術高超的開發者還可以按照自己的需求自行編寫Python解釋器來執行Python程式碼,十分的方便!
6、位元和位元組的關係?
一個位元組=8位元
7、b、B、KB、MB、GB 的關係?
1B(位元組) = 8b(位元)
1KB = 1024B
1MB = 1024KB
1GB = 1024MB
8、請至少列舉5個PEP8 規格
(1)、縮排:每一級4個縮排。連續跨行應該使用圓括號或大括號或使用懸掛縮排。
(2)、程式碼長度約束
一行列數:PEP8 規定最大為79列,如果拼接url很容易超限
一個函數:不可以超過30行;直觀來講就是完整顯示一個函數一個畫面就夠了,不需要上下拖曳
一個類別:不要超過200行程式碼,不要超過10個方法
一個模組:不要超過500行
(3 )、import
不要在一句import中引用多個函式庫
(4)、命名規範
(5)、註解
#總體原則,錯誤的註釋不如沒有註解。所以當一段程式碼改變時,第一件事就是要修改註解!
9、透過程式碼實現如下轉換:
答案: 二进制转换成十进制: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、請寫一個函數實作將IP位址轉換成一個整數。
如 10.3.9.12 轉換規則為:
10 00001010 3 00000011 9 00001001 12 00001100
再將上述二進位拼接起來計算十進位結果:00001010 00000011 00001001 00001100 = ?
答案:
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、python遞歸的最大層數?
一般電腦預設的最大遞迴深度在1000左右,python最大遞迴深度一般在4000左右,跟計算
機的效能有關係,這個數不是一個定數,可透過一下方式測試
import sys print(sys.getrecursionlimit()) print(sys.setrecursionlimit(10000))
12、求結果:
v1 = 1 or 3 -------------->1
v2 = 1 and 3---- ---------->3
v3 = 0 and 2 and 1-------->0
v4 = 0 and 2 or 1------ --->1
v5 = 0 and 2 or 1 or 4---->1
v6 = 0 or Flase and 1----->False
#13 、ascii、unicode、utf-8、gbk 區別?
ASCII碼:使用一個位元組編碼,所以它的範圍基本上是只有英文字母、數字和一些特殊符號 ,只有256個字元。
Unicode:能夠表示全世界所有的位元組
GBK:是只用來編碼漢字的,GBK全名為《漢字內碼擴充規範》,使用雙位元組編碼。
UTF-8:是針對Unicode的可變長度字元編碼,又稱萬國碼。
14、字節碼和機器碼的差別?
机器码:是电脑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检查
以上是python基礎題目總結(附答案)的詳細內容。更多資訊請關注PHP中文網其他相關文章!