原文出自:https://www.cnblogs.com/bigtreei/p/9127672.htm
1、为什么学习Python?
# 因为python相对其他语言非常优雅简洁,有着丰富的第三方库,我感觉很强大、很方便; # 还有就是,我感觉python简单易学,生态圈庞大,例如:web开发、爬虫、人工智能等,而且未来发展趋势也很不错。
2、通过什么途径学习的Python?
# 在系里社团通过学长了解到python 根据个人情况而定…………
3、Python和Java、PHP、C、C#、C++等其他语言的对比?
# Python、PHP是解释型语言,代码运行期间逐行翻译成目标机器码,下次执行时逐行解释 # 而C、Java是编译型语言,编译后再执行。
4、简述解释型和编译型编程语言?
# 解释型:边解释边执行(python、PHP) # 编译型:编译后再执行(c、Java、C#)
5、Python解释器种类以及特点?
# CPython:C语言开发的,官方推荐,最常用 # IPython:基于CPython之上的交互式解释器,只是在交互上有增强 # JPython:Java写的解释器 # Pypy:Python写的解释器,目前执行速度最快的解释器,采用JIT技术,对Python进行动态编译 # IronPython:C#写的解释器
6、位和字节的关系?
#1字节=8位 #1byte=8bit (数据存储以字节(Byte)为单位)
7、b、B、KB、MB、GB 的关系?
1B=8bit 1KB=1024B 1MB=1024KB 1G=1024MB 1T=1024G
8、请至少列举5个 PEP8 规范(越多越好)。
#1、空格使用 a 各种右括号前不要加空格。 b 逗号、冒号、分号前不要加空格。 c 函数的左括号前不要加空格。如Func(1)。 d 序列的左括号前不要加空格。如list[2]。 e 操作符左右各加一个空格,不要为了对齐增加空格。 f 函数默认参数使用的赋值符左右省略空格。 g 不要将多句语句写在同一行,尽管使用‘;’允许。 8 if/for/while语句中,即使执行语句只有一句,也必须另起一行。 #2、代码编排 a 缩进,4个空格,而不是tab键 b 每行长度79,换行可使用反斜杠,最好使用圆括号。 c 类与类之间空两行 d 方法之间空一行
9、通过代码实现如下转换:
二进制转换成十进制:v = “0b1111011” 十进制转换成二进制:v = 18 八进制转换成十进制:v = “011” 十进制转换成八进制:v = 30 十六进制转换成十进制:v = “0x12” 十进制转换成十六进制:v = 87 ################################ v = 0b1111011 print(int(v)) v = 18 print(bin(v)) v = '011' print(int(v)) v = 30 print(oct(v)) v = 0x12 print(int(v)) v = 87 print(hex(v))
10、请编写一个函数实现将IP地址转换成一个整数。
如 10.3.9.12 转换规则为: 10 00001010 3 00000011 9 00001001 12 00001100 再将以上二进制拼接起来计算十进制结果:00001010 00000011 00001001 00001100 = ?
11、python递归的最大层数?
Python中默认的递归层数约为998左右(会报错) 和计算机性能有关系,我的最大数字在3210 - 3220之间浮动
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 ######################## and:前后为真才为真 or:有一为真就为真 优先级:()>not>and>or 同等优先级下,从左向右
13、ascii、unicode、utf-8、gbk 区别?
#Ascii: 1个字节 支持英文 #unicode :所有字符(无论中文、英文等)1个字符:4个字节 #gbk : 1个字符,英文1个字节,中文2个字节。 #utf-8 :英文1个字节,欧洲字符:2个字节, 亚洲: 3个字节。
14、字节码和机器码的区别?
- C代码被编译成机器码(二进制),在机器上直接执行。 - Cpython编译你的python源代码,生成字节码。 - 机器码快的多,字节码更易迁移,也安全。
15、三元运算规则以及应用场景?
# 三元运算符就是在赋值变量的时候,可以直接加判断,然后赋值 a = 1 b = 2 c = a if a > 1 else b # 如果a大于1的话,c=a,否则c=b
16、列举 Python2和Python3的区别?
'Print': py2--print; py3--print()函数 '编码': py2默认是ascii码; py3默认是utf-8 '字符串': py2中分ascii(8位)、unicode(16位); py3中所有字符串都是unicode字符串 'True和False': py2中是两个全局变量(1和0)可以重新赋值; py3中为两个关键字,不可重新赋值 '迭代': py2:xrange; py3:range 'Nonlocal': py3专有的(声明为非局部变量) '经典类&新式类': py2:经典类和新式类并存; py3:新式类都默认继承object 'yield': py2:yield py3:yield/yield from '文件操作': py2:readliens()读取文件的所有行,返回一个列表,包含所有行的结束符 xreadliens()返回一个生成器,循环取值 py3: 只有readlines()
17、用一行代码实现数值交换:
a = 1 b = 2 ########### a, b = b, a print(a, b)
18、Python3和Python2中 int 和 long的区别?
py3中没有long整型,统一使用int,大小和py2的long类似。 py2中int最大不能超过sys.maxint,根据不同平台大小不同; 在int类型数字后加L定义成长整型,范围比int更大。
19、xrange和range的区别?
#range产生的是一个列表,xrange产生的是生成器。 #数据较大时xrange比range好。 #Range一下把数据都返回,xrange通过yield每次返回一个。
20、文件操作时:xreadlines和readlines的区别?
# Readlines:读取文件的所有行,返回一个列表,包含所有行的结束符 # Xreadlines:返回一个生成器,循环使用和readlines基本一致 。(py2有,py3没有)
21、列举布尔值为False的常见值?
# []、{}、None、’’、()、0、False
22、字符串、列表、元组、字典每个常用的5个方法?
23、lambda表达式格式以及应用场景?
# 格式: 匿名函数:res = lambda x:i*x print(res(2)) # 应用场景: Filter(),map(),reduce(),sorted()函数中经常用到,它们都需要函数形参数; 一般定义调用一次。 (reduce()对参数序列中元素进行累积)
24、pass的作用?
# Pass一般用于站位语句,保持代码的完整性,不会做任何操作。
25、*arg和**kwarg作用
# 他们是一种动态传参,一般不确定需要传入几个参数时,可以使用其定义参数,然后从中取参 '*args':按照位置传参,将传入参数打包成一个‘元组’(打印参数为元组-- tuple) '**kwargs':按照关键字传参,将传入参数打包成一个‘字典’(打印参数为字典-- dict)
26、is和==的区别
==:判断某些值是否一样,比较的是值 is:比较的是内存地址(引用的内存地址不一样,唯一标识:id)
27、简述Python的深浅拷贝以及应用场景?
#浅拷贝: 不管多么复杂的数据结构,只copy对象最外层本身,该对象引用的其他对象不copy, 内存里两个变量的地址是一样的,一个改变另一个也改变。 #深拷贝: 完全复制原变量的所有数据,内存中生成一套完全一样的内容;只是值一样,内存地址不一样,一方修改另一方不受影响
28、Python垃圾回收机制?
29、Python的可变类型和不可变类型?
# 可变类型:列表、字典、集合 # 不可变类型:数字、字符串、元祖 (可变与否指内存中那块内容value)
30、求结果:
v = dict.fromkeys(['k1', 'k2'], []) # 内存中k1和k2都指向同一个[](内存地址相同),只要指向的[]发生变化,k1和k2都要改变(保持一致) v['k1'].append(666) print(v) # {'k1': [666], 'k2': [666]} v['k1'] = 777 print(v) # {'k1': 777, 'k2': [666]}
31、求结果:
def num(): return [lambda x: i * x for i in range(4)] #返回一个列表,里面是四个函数对象 i=3 print([m(2) for m in num()])
32、列举常见的内置函数?
33、filter、map、reduce的作用?
# map:遍历序列,为每一个序列进行操作,获取一个新的序列 # reduce:对于序列里面的所有内容进行累计操作 # filter:对序列里面的元素进行筛选,最终获取符合条件的序列。
34、一行代码实现9*9乘法表
print('\n'.join([' '.join(['%s*%s=%2s' % (j, i, i * j) for j in range(1, i + 1)]) for i in range(1, 10)]))
35、如何安装第三方模块?以及用过哪些第三方模块?
# a、可以在pycharm的settings里面手动下载添加第三方模块 # b、可以在cmd终端下用pip insatll 安装 # 用过的第三方模块:requests、pymysql、DBUtils等
36、至少列举8个常用模块都有那些?
re:正则 os:提供了一种方便的使用操作系统函数的方法。 sys:可供访问由解释器使用或维护的变量和与解释器进行交互的函数。 random:随机数 json:序列化 time:时间
37、re的match和search区别?
# match:从字符串起始位置开始匹配,如果没有就返回None # serch:从字符串的起始位置开始匹配,匹配到第一个符合的就不会再去匹配了
38、什么是正则的贪婪匹配?
# 匹配一个字符串没有节制,能匹配多少就匹配多少,直到匹配完为止
39、求结果: a. [ i % 2 for i in range(10) ] b. ( i % 2 for i in range(10) )
# a结果是一个列表生成式,结果是一个列表(i % 2为生成的元素): [0, 1, 0, 1, 0, 1, 0, 1, 0, 1] # b结果是一个生成器
40、求结果: a. 1 or 2 b. 1 and 2 c. 1 < (2==2) d. 1 < 2 == 2
a=1 or 2 #1 b=1 and 2 #2 c=1 < (2==2) #False d=1 < 2 == 2 #True
41、def func(a,b=[]) 这种写法有什么坑?
# 函数传参为列表陷阱,列表是可变数据类型,可能会在过程中修改里面的值
42、如何实现 “1,2,3” 变成 [‘1’,’2’,’3’] ?
a = '1,2,3' a=a.replace(',','') res = [i for i in a] print(res)
43、如何实现[‘1’,’2’,’3’]变成[1,2,3] ?
l = ['1','2','3'] res = [int(i) for i in l] print(res)
44、比较: a = [1,2,3] 和 b = [(1),(2),(3) ] 以及 b = [(1,),(2,),(3,) ] 的区别?
前两个列表内是int 最后一个列表内是元组
45、如何用一行代码生成[1,4,9,16,25,36,49,64,81,100] ?
l = [i*i for i in range(1,11)] print(l)
46、一行代码实现删除列表中重复的值 ?
l = [1,1,1,2,2,3,3,3,4,4] print(list(set(l))) # [1, 2, 3, 4]
47、如何在函数中设置一个全局变量 ?
通过global指定变量,该变量会变成全局变量
48、logging模块的作用?以及应用场景?
# 作用: 管理我们程序的执行日志,省去用print记录操作日志的操作,并且可以将标准输入输出保存到日志文件 # 场景: 爬虫爬取数据时,对爬取进行日志记录,方便分析、排错。
49、请用代码简单实现stack 。
class Stack(object): # 初始化栈 def __init__(self): self.items = [] # 判断栈是否为空 def is_empty(self): return self.items == [] # 返回栈顶 def peek(self): return self.items[len(self.items) - 1] # 返回栈大小 def size(self): return len(self.items) # 压栈 def push(self, item): self.items.append(item) # 出栈 def pop(self): return self.items.pop()
50、常用字符串格式化哪几种?
# %占位符 s = 'I am %s' %'zhugaochao' print(s) #I am zhugaochao # format格式化输出 i = "i am {}".format('zhugaochao') print(i) #i am zhugaochao
51、简述 生成器、迭代器、可迭代对象 以及应用场景?
52、用Python实现一个二分查找的函数。
li = [1, 2, 3, 4, 5, 6, 7, 8, 9, 10] def search(zhi,li,start=0,end=None): end = len(li) if end is None else end zj = (end - start) // 2+start if start<=end: if zhi>li[zj]: return search(3,li,start=zj+1,end=end) elif zhi<li[zj]: return search(3,li,start=start,end=zj-1) else: return zj return '找不到这个值' print(search(2,li))
53、谈谈你对闭包的理解?
# 闭包函数就是内部的函数调用外部函数的变量,常用于装饰器。 # 判断闭包函数的方法:__closure__,输出的__closure__有cell元素说明是闭包函数 # 闭包的意义与应用:延迟计算:
54、os和sys模块的作用?
# os模块负责程序与操作系统的交互,提供了访问操作系统底层的接口; # sys模块负责程序与python解释器的交互,提供了一系列的函数和变量,用于操控python运行环境
55、如何生成一个随机数?
import random print(random.random()) print(random.randint(1, 10))
56、如何使用python删除一个文件?
import os os.remove('文件名以及路径')
57、谈谈你对面向对象的理解?
#封装: 其实就是将很多数据封装到一个对象中,类似于把很多东西放到一个箱子中, 如:一个函数如果好多参数,起始就可以把参数封装到一个对象再传递。 #继承: 如果多个类中都有共同的方法,那么为了避免反复编写,就可以将方法提取到基类中实现, 让所有派生类去继承即可。 #多态: 指基类的同一个方法在不同派生类中有着不同功能。python天生支持多态。
58、Python面向对象中的继承有什么特点?
#Python3的继承机制 # 子类在调用某个方法或变量的时候,首先在自己内部查找,如果没有找到,则开始根据继承机制在父类里查找。 # 根据父类定义中的顺序,以深度优先的方式逐一查找父类! 继承参数的书写有先后顺序,写在前面的被优先继承。
59、面向对象深度优先和广度优先是什么?
# Python的类可以继承多个类,Python的类如果继承了多个类,那么其寻找方法的方式有两种 当类是经典类时,多继承情况下,会按照深度优先方式查找 当类是新式类时,多继承情况下,会按照广度优先方式查找 简单点说就是:经典类是纵向查找,新式类是横向查找 经典类和新式类的区别就是,在声明类的时候,新式类需要加上object关键字。在python3中默认全是新式类
60、面向对象中super的作用?
主要在子类继承父类的所有属性和方法时来使用
61、是否使用过functools中的函数?其作用是什么?
在装饰器中,会用到;functools.wraps()主要在装饰器中用来装饰函数 Stark上下文管理源码中,走到视图阶段时有用到functools中的偏函数,request = LocalProxy(partial(_lookup_req_object, 'request'))
62、列举面向对象中带爽下划线的特殊方法,如:__new__、__init__
# __getattr__ CBV django配置文件 wtforms中的Form()示例化中 将"_fields中的数据封装到From类中" # __mro__ wtform中 FormMeta中继承类的优先级 # __dict__ 是用来存储对象属性的一个字典,其键为属性名,值为属性的值 # __new__ 实例化但是没有给当前对象 wtforms,字段实例化时返回:不是StringField,而是UnboundField est frawork many=Turn 中的序列化 # __call__ flask 请求的入口app.run() 字段生成标签时:字段.__str__ => 字段.__call__ => 插件.__call__ # __iter__ 循环对象是,自定义__iter__ wtforms中BaseForm中循环所有字段时定义了__iter__ # -metaclass 作用:用于指定当前类使用哪个类来创建 场景:在类创建之前定制操作 示例:wtforms中,对字段进行排序。
63、如何判断是函数还是方法
# 看他的调用者是谁,如果是类,需要传入参数self,这时就是一个函数; # 如果调用者是对象,不需要传入参数值self,这时是一个方法。 (FunctionType/MethodType)
64、静态方法和类方法区别?
Classmethod必须有一个指向类对象的引用作为第一个参数; @classmethod def class_func(cls): """ 定义类方法,至少有一个cls参数 """ print('类方法') --------------------------------------------------------- Staticmethod可以没有任何参数。 @staticmethod def static_func(): """ 定义静态方法 ,无默认参数""" print('静态方法')
65、列举面向对象中的特殊成员以及应用场景
1. __doc__:表示类的描述信息。 2.__module__:表示当前操作的对象在那个模块; 3.__class__:表示当前操作的对象的类是什么。 4.__init__:构造方法,通过类创建对象时,自动触发执行。 5.__call__:对象后面加括号,触发执行。 6.__dict__:类或对象中的所有成员。 7.__str__:如果一个类中定义了__str__方法,那么在打印对象时,默认输出该方法的返回值。 class Foo: def __str__(self): return 'aaa' obj = Foo() print(obj) # 输出:aaa 8.__getitem__、__setitem__、__delitem__:用于索引操作,如字典。以上分别表示获取、设置、删除数据。 9.__iter__:用于迭代器,之所以列表、字典、元组可以进行for循环,是因为类型内部定义了 __iter__。
66、1、2、3、4、5 能组成多少个互不相同且无重复的三位数
import itertools print(len(list(itertools.permutations('12345',3)))) #60个
67、什么是反射?以及应用场景?
反射就是以字符串的方式导入模块,以字符串的方式执行函数 # 应用场景: rest framework里面的CBV
68、metaclass作用?以及应用场景?
类的metaclass 默认是type。我们也可以指定类的metaclass值。 参考:点击查看
69、用尽量多的方法实现单例模式。
70、装饰器的写法以及应用场景。
import functools def wrapper(func): @functools.wraps(func) def inner(*args, **kwargs): print('我是装饰器') return func return inner @wrapper def index(): print('我是被装饰函数') return None index() # 应用场景 - 高阶函数 - 闭包 - 装饰器 - functools.wraps(func)
71、异常处理写法以及如何主动抛出异常(应用场景)
while True: try: x = int(input("Please enter a number: ")) break except ValueError: print("Oops! That was no valid number. Try again ") # raise主动抛出一个异常 参考:点击查看
72、什么是面向对象的mro
MRO:方法解析顺序 它定义了 Python 中多继承存在的情况下,解释器查找继承关系的具体顺序
73、isinstance作用以及应用场景?
# 来判断一个对象是否是一个已知的类型。 # 使用isinstance函数还可以来判断'类实例变量'属于哪一个类产生的。
74、写代码并实现:
Given an array of integers, return indices of the two numbers such that they add up to a specific target.You may assume that each input would have exactly one solution, and you may not use the same element twice.Example: Given nums = [2, 7, 11, 15], target = 9, Because nums[0] + nums[1] = 2 + 7 = 9, return [0, 1]
75、json序列化时,可以处理的数据类型有哪些?如何定制支持datetime类型?
# 可序列化数据类型: 字典、列表、数字、字符串、元组;如果是元组,自动转成列表(再转回去的话也是列表) # 自定义时间序列化转换器 import json from json import JSONEncoder from datetime import datetime class ComplexEncoder(JSONEncoder): def default(self, obj): if isinstance(obj, datetime): return obj.strftime('%Y-%m-%d %H:%M:%S') else: return super(ComplexEncoder,self).default(obj) d = { 'name':'alex','data':datetime.now()} print(json.dumps(d,cls=ComplexEncoder)) # {"name": "alex", "data": "2018-05-18 19:52:05"}
76、json序列化时,默认遇到中文会转换成unicode,如果想要保留中文怎么办?
import json a=json.dumps({"xxx":"你好"},ensure_ascii=False) print(a) #{"xxx": "你好"}
77、什么是断言?应用场景?
#条件成立则继续往下,否则抛出异常; #一般用于:满足某个条件之后,才能执行,否则应该抛出异常。 '应用场景':rest framework中GenericAPIView类里,要设置queryset,否则断言错误
78、有用过with statement吗?它的好处是什么?
with语句适用于对资源进行访问的场合,确保不管使用过程中是否发生异常都会执行必要的“清理”操作,
释放资源,比如文件使用后自动关闭、线程中锁的自动获取和释放等。
79、使用代码实现查看列举目录下的所有文件。
import os path = os.listdir('.') #查看列举目录下的所有文件。 # path = os.listdir(os.getcwd()) print(path)
80、简述 yield和yield from关键字。
1、yield使用 1)函数中使用yield,可以使函数变成生成器。一个函数如果是生成一个数组,就必须把数据存储在内存中,如果使用生成器,则在调用的时候才生成数据,可以节省内存。 2)生成器方法调用时,不会立即执行。需要调用next()或者使用for循环来执行。 2、yield from的使用 1)为了让生成器(带yield函数),能简易的在其他函数中直接调用,就产生了yield from。 参考:点击查看