Home  >  Article  >  Backend Development  >  Summary of python basic questions (with answers)

Summary of python basic questions (with answers)

不言
不言forward
2018-12-13 11:15:3610323browse

This article brings you a summary of basic Python questions (with answers). It has certain reference value. Friends in need can refer to it. I hope it will be helpful to you.

1. Why learn Python?

Life is too short? Is this world not worth it? Think about your original intention!

2. How did you learn Python?

Official website, online videos, learning websites, forums, guidance from experts

3. Comparison between Python and Java, PHP, C, C#, C and other languages?

(1), python code, brief, clear, elegant, simple and easy to understand
(2), high development efficiency
(3), strong scalability

4 , briefly describe interpreted and compiled programming languages?

Interpretation type: When executing the program, the computer interprets the code into machine language one by one for the computer to execute
Compilation type: Each statement of the source program is compiled into machine language, and Save it as a binary file, so that when the computer runs the program, it can run the program directly in machine language, and it runs very quickly.

5. Types and characteristics of Python interpreters?

Cpython, IPython, Jpython, pypy, Ironpython

Python is an interpreter language. To run the code, it must be executed through the interpreter. There are multiple interpreters for Python, based on different languages. Development, each interpreter has different characteristics, but they can all run Python code normally. The following are the five commonly used Python interpreters:

CPython: After downloading and installing Python2.7 from the official Python website , you directly get an official version of the interpreter: Cpython. This interpreter is developed in C language, so it is called CPython. Running python under the named line is to start the CPython interpreter. CPython is the most widely used Python interpreter. .

IPython: IPython is an interactive interpreter based on CPython. In other words, IPython is only enhanced in the interactive mode, but the function of executing Python code is exactly the same as that of CPython, such as many Although the appearance of domestic browsers is different, the core actually calls IE.

PyPy: PyPy is another Python interpreter. Its goal is execution speed. PyPy uses JIT technology to dynamically compile Python code, so it can significantly improve the execution speed of Python code.

Jython: Jython is a Python interpreter running on the Java platform. It can directly compile Python code into Java bytecode for execution.

IronPython: IronPython is similar to Jython, except that IronPython is a Python interpreter running on the Microsoft .Net platform and can directly compile Python code into .Net bytecode.

Among Python interpreters, CPython is widely used. For Python compilation, in addition to using the above interpreter
for compilation, highly skilled developers can also compile according to their own You need to write your own Python interpreter to execute Python code, which is very convenient!

6. What is the relationship between bits and bytes?

One byte = 8 bits

What is the relationship between 7, b, B, KB, MB and GB?

1B (byte) = 8b (bit)
1KB = 1024B
1MB = 1024KB
1GB = 1024MB

8. Please list at least 5 PEP8 specifications

(1). Indentation: 4 indents per level. Continuations across lines should use parentheses or braces or use hanging indents.
(2) Code length constraint

Number of rows and columns in a row: PEP8 stipulates a maximum of 79 columns. If the URL is spliced, it is easy to exceed the limit.
A function: cannot exceed 30 rows; intuitively speaking, this is It is enough to completely display a function on one screen, without dragging up and down.
One class: no more than 200 lines of code, no more than 10 methods
One module: no more than 500 lines

(3 ), import

Do not reference multiple libraries in one import sentence

(4), naming convention
(5), comments

General principles, A wrong comment is worse than no comment at all. So when a piece of code changes, the first thing to do is to modify the comments!

9. Implement the following conversion through 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. Please write a function to convert the IP address into an integer.

For example, the conversion rule for 10.3.9.12 is:

    10            00001010
     3            00000011
     9            00001001
    12            00001100

Then concatenate the above binary numbers to calculate the decimal result: 00001010 00000011 00001001 00001100 =?

Answer:

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. The maximum number of levels of python recursion?

Generally, the default maximum recursion depth of a computer is around 1000. The maximum recursion depth of Python is generally around 4000. It is related to the performance of the computer
. This number is not a fixed number and can be tested in the following way

import sys
print(sys.getrecursionlimit())
print(sys.setrecursionlimit(10000))

12. Find the result:

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 difference?

ASCII code: uses one byte encoding, so its range is basically only English letters, numbers and some special symbols, only 256 characters.
Unicode: Can represent all bytes in the world
GBK: It is only used to encode Chinese characters. The full name of GBK is "Chinese Character Internal Code Extension Specification" and uses double-byte encoding.
UTF-8: It is a variable-length character encoding for Unicode, also known as Universal Code.

14. What is the difference between bytecode and machine code?

机器码:是电脑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检查

The above is the detailed content of Summary of python basic questions (with answers). For more information, please follow other related articles on the PHP Chinese website!

Statement:
This article is reproduced at:segmentfault.com. If there is any infringement, please contact admin@php.cn delete