Python经典面试题

一、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文件,可运行。

  • 2
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
Python基础面试中,常见的一些问包括:Python解释器、列表去重和变量身份标识。当面试官问到Python解释器问时,你可以通过反问来展示自己对不同Python解释器版本的了解。例如,你可以问面试官是否指的是官方的CPython解释器。在列表去重问中,可以使用以下代码来实现列表去重功能: ```python def dedup(items): no_dup_items = [] seen = set() for item in items: if item not in seen: no_dup_items.append(item) seen.add(item) return no_dup_items ``` 这段代码会遍历给定的列表,并将不重复的元素添加到`no_dup_items`列表中。 此外,还有一些可能会涉及到Python解释器的问。例如,下面的代码段展示了一个关于变量身份标识的问: ```python a, b, c, d = 1, 1, 1000, 1000 print(a is b, c is d) def foo(): e = 1000 f = 1000 print(e is f, e is d) g = 1 print(g is a) foo() ``` 这个问旨在考察面试者对官方的Python解释器的了解程度。对于这段代码,结果会输出`True False True`。这是因为在CPython解释器中,小整数[-5, 256]会被缓存,而大整数不会被缓存。 以上就是一些Python基础面试的示例答案。在面试准备中,建议你研究一些常见的Python面试和相关的资料,以便更好地应对面试的考察。<span class="em">1</span><span class="em">2</span><span class="em">3</span> #### 引用[.reference_title] - *1* *2* *3* [Python面试基础篇 - 50道经典面试(附答案及多种解答)](https://blog.csdn.net/m0_68507761/article/details/125336802)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v93^chatsearchT3_2"}}] [.reference_item style="max-width: 100%"] [ .reference_list ]

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值