python基础面试题

原文出自: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 = ?
  answer

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个方法?

  show

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垃圾回收机制?

  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、简述 生成器、迭代器、可迭代对象 以及应用场景?

  show

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、用尽量多的方法实现单例模式。

  show

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]
  show

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。 

参考:点击查看
复制代码

转载于:https://www.cnblogs.com/gogoyanyan/p/10427203.html

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值