您现在的位置是:首页 > 正文

Python经典面试题

2024-04-01 00:30:38阅读 3

一、Python后端面试题

在这里插入图片描述

1、用你觉得最Python的方式来实现a、b元素交换

a,b=b,a

2、Python实现—个单例模式

  • 单例模式确保某一个类只有一个实例存在

  • 当你希望在整个系统中,某个类只能出现一个实例时,就可以使用单例对象

  • 方法:是否是第一次创建对象,如果是首次创建对象,则调用父类__new__()方法创建对象并返回

    ​ 如果不是第一创建对象,直接返回第一次创建的对象即可

class Shopping:
      instance = None #记录创建的对象,None说明是第一次创建对象
      def __new__(cls, *args, **kwargs):
          #第一次调用new方法,创建对象并记录
          #第2-n次调用new方式时,不创建对象,而是直接放回记录的对象
  
          #判断是否是第一次创建对象
          if cls.instance==None:
              cls.instance = object.__new__(cls)
          return cls.instance
  
  shop1 = Shopping()
  shop2 = Shopping()
  print(shop1,shop2)

3、简要谈谈你对Python函数式编程的了解

核心关注是解决问题的步骤,将解决问题的每个步骤封装成函数,通过函数的逐步调用,得到问题的处理结果,主要实现方式是函数式编程

4、Python中单个下划线和双下划线都有什么意义?

1、单下划线如:_name
意思是:不能通过from modules import * 导入,如需导入需要:from modules import _name
2、对象前面加双下划线如:__name
意思是:生命对象为私有

5、简要谈谈你对MysQL和Redis的了解

Redis基于内存,读写速度快,也可做持久化,但是内存空间有限,当数据量超过内存空间时,需扩充内存,但内存价格贵。

MySQL基于磁盘,读写速度没有Redis快,但是不受空间容量限制,性价比高。

大多数的应用场景是MySQL(主)+Redis(辅),MySQL做为主存储,Redis用于缓存,加快访问速度。需要高性能的地方使Redis,不需要高性能的地方使用MySQL。存储数据在MySQL和Redis之间做同步

6,列举一些在Linux下常用的命令

1.展示目录列表命令ls(list)
pwd:显示目前的目录
2.切换目录命令cd
3.目录的创建(mkdir)和删除(rmdir)命令
4.文件的创建(touch)和删除(rm)命令
5.文件打包或解压命令tar
6.cp (复制文件或目录)
7.rm (移除文件或目录)
8.mv (移动文件与目录,或修改名称)
9.cat 由第一行开始显示文件内容
tac 从最后一行开始显示,可以看出 tac 是 cat 的倒著写!
nl 显示的时候,顺道输出行号!
more 一页一页的显示文件内容
less 与 more 类似,但是比 more 更好的是,他可以往前翻页!
head 只看头几行
tail 只看尾巴几行

7、列举一些你常用的git命令或操作

1、git init
使用我们指定目录作为Git仓库
2、git add filename
可以使用add… 继续添加任务文件
3、git commit -m “Adding files”
我们将它们提交到仓库
4、我们先从服务器克隆一个库并上传。
git clone ssh://example.com/~/www/project.git
5、现在我们修改之后可以进行推送到服务器。
git push ssh://example.com/~/www/project.git
6、从非默认位置更新到指定的url
git pull http://git.example.com/project.git
7、git status
查看git状态

8、一只青蛙一次可以跳上1级台阶,也可以跳上2级。求该青蛙跳上一个n级的台阶总共有都多种跳法

解法一,用递归

"""
1   1  f(1)=1
2   2  f(2)=2
3   f(2)+f(1)=2+1=3
4   f(3)+f(2)=3+2=5
...
n  f(n-1)+f(n-2)
1 2 3 5 8 13...
"""


def jump(n):
    if n == 1 or n == 2:
        return n
    return jump(n - 1) + jump(n - 2)


# print(jump(35))

def jump2(n):
    a, b = 1, 2
    for i in range(n - 1):
        a, b = b, a + b
    print(a)


# jump2(5)

9、用Python实现二分查找算法

二分查找又称折半查找,它是一种效率较高的查找方法

算法思想: 首先,将表中间位置记录的关键字与查找关键字比较,如果两者相等,则查找成功;否则利用中间位置记录将表分成前、后两个子表,如果中间位置记录的关键字大于查找关键字,则进一步查找前一子表,否则进一步查找后一子表重复以上过程,直到找到满足条件的记录,使查找成功,或直到子表不存在为止,此时查找不成功

优缺点: 折半查找法的优点是比较次数少,查找速度快,平均性能好;其缺点是要求待查表为有序表,且插入删除困难,因此,折半查找方法适用于不经常变动而查找频繁的有序列表

在这里插入图片描述

def binary_chop(alist, data):
    """
    递归解决二分查找
    :param alist:
    :return:
    """
    n = len(alist)
    if n < 1:
        return False
    mid = n // 2  # 
    if alist[mid] > data:
        return binary_chop(alist[0:mid], data)
    elif alist[mid] < data:
        return binary_chop(alist[mid + 1:], data)
    else:
        return True

10、给定一个整数数组 nums 和一个目标值 target,请你在该数组中找出和为目标值的那两个整数,并返回他们的数组下标

你可以假设每种输入只会对应一个答案。但是,数组中同一个元素不能使用两遍

示例:

给定 nums = [2, 7, 11, 15], target = 9
因为 nums[0] + nums[1] = 2 + 7 = 9
所以返回 [0, 1]

题解:

参考了大神们的解法,通过哈希来求解,这里通过字典来模拟哈希查询的过程

个人理解这种办法相较于方法一其实就是字典记录了 num1 和 num2 的值和位置,而省了再查找 num2 索引的步骤

方法一:

def twoSum(nums, target):
    hashmap={}
    for ind,num in enumerate(nums):
        hashmap[num] = ind
    for i,num in enumerate(nums):
        j = hashmap.get(target - num)
        if j is not None and i!=j:
            return [i,j]

方法二:

不需要 mun2 不需要在整个 dict 中去查找。可以在 num1 之前的 dict 中查找,因此就只需要一次循环可解决

def twoSum(nums, target):
    hashmap={}
    for i,num in enumerate(nums):
        if hashmap.get(target - num) is not None:
            return [i,hashmap.get(target - num)]
        hashmap[num] = i #这句不能放在if语句之前,解决list中有重复值或target-num=num的情况

二、Python爬虫经典面试题

—、linux基础

1、在linux环境下:

(1)怎么查看系统磁盘、目录的大小

查看系统挂载了多少磁盘,和磁盘的大小,使用fdisk -l 命令
查看挂载磁盘情况,可以使用df -hl命令
查看文件、目录大小,可以使用 du -sh /root 命令

(2)怎么查看系统的内存使用情况

使用top命令,该命令用于实时显示进程的动态
使用free查看系统内存使用情况

2、如何将linux系统上用户 zeus下,所有进程名包含字符串“csb_”的进程杀死?(请给出思路或代码)

使用killall -9 csb_ 命令

二、python 语言基础

1.简单描述python之禅,列出你认为的python和 java的差异点(3~5条)

(1)优美胜于丑陋(Python 以编写优美的代码为目标)
(2)简洁胜于复杂(优美的代码应当是简洁的,不要有复杂的内部实现)
(3)复杂胜于凌乱(如果复杂不可避免,那代码间也不能有难懂的关系,要保持接口简洁)

2.写一个简单,安全的的多线程下载器下载html,基于requests 包(伪代码)

暂时无法找到解答

三、web和存储

1.session、cookie、localstorage的不同?

cookie与session的区别

  • Cookie数据存放在客户端,Session数据放在服务器端

  • Cookie的安全性一般,他人可通过分析存放在本地的Cookie并进行Cookie欺骗。在安全性第一的前提下,选择Session更优。重要交互信息比如权限等就要放在Session中,一般的信息记录放Cookie中

  • 单个Cookie保存的数据不能超过4K,很多浏览器都限制一个站点最多保存20个Cookie,而Session原则上没有限制

  • Session会在一定时间内保存在服务器上。当访问增多,会比较占用你服务器的性能考虑到减轻服务器性能方面,应当使用Cookie。

  • Session 的运行依赖Session ID,而 Session ID 是存在 Cookie 中的,也就是说,如果浏览器禁用了 Cookie,Session 也会失效(但是可以通过其它方式实现,比如在 url 中传递 Session ID,也就是地址重写)

localStorage简介

localStorage 是 HTML5 提供的一个 API,他本质上是一个hash(哈希表),是一个存在于浏览器上的 hash(哈希表)

localStorage 是一个保存于客户端的哈希表,可以用来保存本地的一些数据。并且不会因为刷新而释放,所以,可以使用 localStorage 来实现变量的持久化存储

localStorage的特点

  • localStorage 与 HTTP 没有任何关系,所以在HTTP请求时不会带上 localStorage 的值
  • 只有相同域名的页面才能互相读取 localStorage,同源策略与 cookie 一致
  • 不同的浏览器,对每个域名 localStorage 的最大存储量的规定不一样,超出存储量会被拒绝。最大存5M 超过5M的数据就会丢失。而 Chrome 10MB 左右
  • 常用来记录一些不敏感的信息
  • localStorage 理论上永久有效,除非用户清理缓存

2.浏览器从输入URL,到页面加载完成的过程中都发生了什么事情?

  • 当用户在浏览器的地址栏中输入一个 URL 并按回车键之后,浏览器会向 http 服务器 发送 http 请求。http 请求主要分为“Get”和“Post”两种方法。
  • 当我们在浏览器输入 URL :http://www.baidu.com 的时候,浏览器发送一个 Request 请求去获取 http://www.baidu.com 的 html 文件,服务器把 Response 文件对象发送回给 浏览器。
  • 浏览器分析 Response 中的 HTML,发现其中引用了很多其他文件,比如 Images 文 件,CSS 文件,JS 文件。浏览器会自动再次发送 Request 去获取图片,CSS 文件,或者 JS 文件。
  • 当所有的文件都下载成功后,网页会根据 HTML 语法结构,完整的显示出来了。

3.请列举出 redis常见的存储结构有哪些?

  • Redis支持五中数据类型:String(字符串),Hash(哈希),List(列表),Set(集合)及zset(sortedset:有序集合)

4.实现一个视频内容搜索项目,规划技术实现过程及风险(可从前后端,逻辑分成等方面来讲)
需求:抖音视频内容和文本作为内容+搜索引擎web客户端
量级:日更100W视频文件,每个文件大小约2M,客户端同时在线用户100人

暂时无法找到解答

三、Python爬虫机试

第一部分:

1、正则匹配中的贪婪匹配是什么意思?(5分)

  • 默认的匹配就是贪婪匹配,也就是尽可能多的去匹配

2、Html中ID,li 都是什么元素的子节点?< h2 >是什么标签? (5分)

  • ul无序列表,标题元素

3、请说明http协议中,get请求和post请求的区别。(5分)

(1) get和post请求都是客户端与服务器之间得交互,请求——应答模式的协议

(2) get是从服务器上获取数据,post是向服务器传送数据,一般用于更新资源信息
(3)get请求时通过URL直接请求数据,数据信息可以在URL中直接看到,比如浏览器访问;而post请求是放在请求头中的,我们是无法直接看到的

(4)get提交有数据大小的限制,一般是不超过2KB,而POST理论上默认是没有限制

(5)get请求因为数据参数是暴露在URL中的,所以安全性比较低,如密码不能暴露的就不能用get请求;post请求中,请求信息是放在请求头的,安全性较高,可以使用

4、网络爬虫在抓取页面时可能会碰到什么问题导致无法抓取页面,如何解决。(5分)

  • 通过客户端标识来判断。

  • 解决办法:封装user-agent请求头。

5、进程与线程的区别与关系。(5分)

(1)一个线程只能属于一个进程,而一个进程可以有多个线程,但至少有一个线程。线程是操作系统可识别的最小执行和调度单位。

(2)资源分配给进程,同一进程的所有线程共享该进程的所有资源。 同一进程中的多个线程共享代码段(代码和常量),数据段(全局变量和静态变量),扩展段(堆存储)。但是每个线程拥有自己的栈段,栈段又叫运行时段,用来存放所有局部变量和临时变量。

(3)处理机分给线程,即真正在处理机上运行的是线程。

(4)线程在执行过程中,需要协作同步。不同进程的线程间要利用消息通信的办法实现同步。

6、列举至少3种以上你知道的数据库名称。它们分别属于关系型还是非关系型数据库?(15分)

  • 关系型数据库主要有:

  • Oracle、DB2、Microsoft SQL Server、Microsoft Access、MySQL等等。

  • 非关系型数据库主要有:

  • NoSql、Cloudant、MongoDb、redis、HBase等等

7、使用shell、Python、Perl、Ruby等其中的一种语言编写脚本计算1叠加到100的结果。(15分)

##第一种bai方法du
a = 0
for i in range(0,100):
a += (i+1);
print a
##第二种方zhi法dao
sum(range(1,101))
##第三种方法
sum([ x for x in range(0,101)])

8、使用任意语言对以下数组进行增量排序。说明算法的时间复杂度。(15分)a=[52,11,10,6,-1,2.2,8,8,15]

# 冒泡排序

def bubble_sort(alist):
    for j in range(len(alist) - 1, 0, -1):
        # j 表示每次遍历需要比较的次数,是逐渐减小的
        for i in range(j):
            if alist[i] > alist[i + 1]:
                alist[i], alist[i + 1] = alist[i + 1], alist[i]
                
                
li = [54, 26, 93, 17, 77, 31, 44, 55, 20]
bubble_sort(li)
print(li)

9、使用xpath或正则表达式或JavaScript截取下面内容h3中的链接地址。(15分)

< html >< body >
< div id=”2” class=”result c-container” data-click=”{“rsv_dbr”:”0”,”p5”:2}”
Tpl=”se_com_default”srcid=”1599”>
< h3 class=”t”>
< a target=”_blank”
href=”http://www.baidu.com/link?url=uS0o4bUeQXJr4n3vbMyzO6PxdVuF99KFx41
BnRPL0L1aPHNCZ7UaAoK4eieWloseiOLL74wwJp7wdWyTojRG1K&wd=&eqid=
ada858db0000f79d0000000359c8b941”data-click=”{‘F’:’778317EA’,
‘F1’:’9D73F1E4’, ’F2’:’4CA6DE6B’,’F3’:’54E5343F’, ‘T’:’1506323850’,
‘y’:’EFEC3DDE’}’’>XXX< /a >=
< /h3 >
< /body >
< html >

10、使用Python,java,JavaScript或其他语言完成json字符串格式化(15分)

输入
{“name”:”Google”,”location”:{“street”:”1600 Amphitheatre
Parkway”,”city”:”Mountain
View”,”state”:”California”,”country”:”US”},”employees”:[{“name”:”Michael”,”divisi
on”:”Engineering”},{“name”:”Laura”,”division”:”HR”},{“name”:”Elise”,”division”:”
Marketing”}]}

输出
{
“employees”:[
{
“division”:”Engineering”,
“name”:”Michael”
},
{
“divsion”:”HR”,
“name”:”Laura”
},
{
“division”:”Marketing”,
“name”:”Elise”
}
],
“location”:{
“country”:”US”,
“state”:”California”,
“city”:”Mountain View”,
“street”:”1600 Amphitheatre Parkway”
},
“name”:”Google”
}

第二部分:

https://www.ixigua.com/i6704446868685849092

目标:破解上述页面上的视频地址,可以直接下载视频的地址。

完成度要求:

1、传入视频详情页面地址,输出页面上视频下载地址。

2、整个代码打包,有requirement.txt文件,可运行。

网站文章

  • VS2019实用调试技巧

    VS2019实用调试技巧

    Debug 通常称为调试版本,它包含调试信息,并且不作任何优化,便于程序员调试程序。 Release 称为发布版本,编译器对我们写的代码进行了各种优化,使得程序在代码大小和运行速度上都是最优的,以便用户很好地使用,Release版本不能调试。

    2024-04-01 00:30:13
  • dependency walker工具简介及使用

    dependency walker工具简介及使用

    dependency walker工具简介及使用

    2024-04-01 00:30:06
  • django中使用celery做异步任务、定时任务

    django中使用celery做异步任务、定时任务

    一、celery架构图 生产者消费者模型 调度方法 二、配置使用 celery很容易集成到Django框架中,当然如果想要实现定时任务的话还需要安装django-celery-beta插件,后面会说明...

    2024-04-01 00:29:58
  • 蜂鸟E203开发环境准备工作

    蜂鸟E203开发环境准备工作

    蜂鸟E203开发环境准备工作WindowsWindows工具“NucleiStudio”的快速上手Windows工具“Eclipse”的快速上手Linux安装VMware,安装Ubuntu18.04u...

    2024-04-01 00:29:36
  • Android 共存debug release版, 并设置不同名字

    一部手机上同时安装app的debug版和release版,并显示不同名字 build.gradle buildTypes { debug { applicationIdSuffix &quot;.debug&quot; resValue &quot;string&quot;, &quot;app_name&quot;, &quot;@string/app_name_debug&quot; ...

    2024-04-01 00:29:28
  • 神经网络向量化实现

    神经网络向量化实现

    矢量化编程 当使用学习算法时,一段更快的代码通常意味着项目进展更快。例如,如果你的学习算法需要花费20分钟运行完成,这意味着你每个小时能“尝试”3个新主意。但是假如你的程序需要20个小时来运行,这意味着你一天只能“尝试”一个新主意,因为你需要花费这么长时间来等待程序的反馈。对于后者,假如你可以提升代码的效率让其只需要运行10个小时,那么你的效率差不多提升一倍。 矢量化编

    2024-04-01 00:29:21
  • 动态数据源切换 AbstractRoutingDataSource

    动态数据源切换 AbstractRoutingDataSource

    2024-04-01 00:28:57
  • 解决WebStorm中无法拉取自己项目的问题

    解决WebStorm中无法拉取自己项目的问题

    1.打开webstorm,然后点击(file->setting->github)2.输入自己的账号和密码这里如果电脑本地不是自己的账号,会报错解决方案:打开控制面板->用户账户->管理您的凭据,修改git用户名和密码3.配置你的git4.拉取git项目代码...

    2024-04-01 00:28:50
  • 山东师范大学2024年的计算机毕设题目大全50例

    最近要准备毕业设计了,不会选题,希望可以帮忙给一些毕业设计题目,我整整花了一周把之前做的答辩通过的毕业设计成品进行整理如下列表。

    2024-04-01 00:28:42
  • Windows10安装visual studio 2013

    https://wenku.baidu.com/view/6f1ba49955270722192ef7a8.html

    2024-04-01 00:28:37