python近期遇到的一些面试问题(三)

整理一下最近被问到的一些高频率的面试问题。总结一下方便日后复习巩固用,同时希望可以帮助一些朋友们。

前两期点这↓

python近期遇到的一些面试问题(一)

python近期遇到的一些面试问题(二)

1.请写一个邮箱的正则表达式

电子邮件地址有统一的标准格式:用户名@服务器域名。用户名表示邮件信箱、注册名或信件接收者的用户标识,@符号后是你使用的邮件服务器的域名。@可以读成“at”,也就是“在”的意思。整个电子邮件地址可理解为网络中某台服务器上的某个用户的地址。

答案

1.用户名,可以自己选择。由字母a~z(不区分大小写)、数字0~9、点、减号或下划线组成;只能以数字或字母开头和结尾

2.与你使用的网站有关,代表邮箱服务商。例如网易的有@163.com新浪有@vip.sina.com等

网上看到了各种各样的版本,都不确定用哪个,于是自己简单的总结了一个。大家有更好的欢迎留言。

r"^[a-zA-Z0-9]+[a-zA-Z0-9_.+-]+@[a-zA-Z0-9-]+\.[a-zA-Z0-9-.]+$"

下面解释上面的表达式

1.首先强调一点关于\w的含义,\w匹配英文字母和俄语字母或数字或下划线或汉字

2.注意[]和[]的区别,[]表示字符集合,[]表示已[]内的任意字符集开始,[]表示

3.[a-zA-Z0-9]+:这里注意[]和[]的,第一个表示已什么开头,第二个[]的^表示不等于[]内。

所以这段表示以英文字母和数字开头,后面紧跟的+,限定其个数>=1个。

4.[a-zA-Z0-9_.+-]+:表示匹配英文字母和数字开头以及_.+-,的任意一个字符,并限定其个数>=1个。

为了考虑@前面可能出现.+-(但是不在开头出现)。

5.@就是邮箱必备符号了

6.@[a-zA-Z0-9-]+.:前面的不用说了,后面的.表示.转义了,也是必备符号。

7.

[a-zA-Z0-9-.]+$

:dollar符表示以什么结束,这里表示以英文字和数字或-. 1个或多个结尾。

来个例子验证一波:

import re
plt=re.compile(r"^[a-zA-Z0-9]+[a-zA-Z0-9_.+-]+@[a-zA-Z0-9-]+\.[a-zA-Z0-9-.]+$")
b=plt.findall('adas+fefe.we@qq.com.cn')
print(b)

网上找了个验证邮件地址的通用正则表达式(符合 RFC 5322 标准)

(?:[a-z0-9!#$%&'*+/=?^_`{|}~-]+(?:\.[a-z0-9!#$%&'*+/=?^_`{|}~-]+)*|"(?:[\x01-\x08\x0b\x0c\x0e-\x1f\x21\x23-\x5b\x5d-\x7f]|\\[\x01-\x09\x0b\x0c\x0e-\x7f])*")@(?:(?:[a-z0-9](?:[a-z0-9-]*[a-z0-9])?\.)+[a-z0-9](?:[a-z0-9-]*[a-z0-9])?|\[(?:(?:25[0-5]|2[0-4][0-9]|[01]?[0-9][0-9]?)\.){3}(?:25[0-5]|2[0-4][0-9]|[01]?[0-9][0-9]?|[a-z0-9-]*[a-z0-9]:(?:[\x01-\x08\x0b\x0c\x0e-\x1f\x21-\x5a\x53-\x7f]|\\[\x01-\x09\x0b\x0c\x0e-\x7f])+)\])

2.以下两段代码运行之后结果是否相同?为什么?

第一段

l=[]
for i in range(10):
l.append({'num':i})
print(l)

第二段

l=[]
a={'num':0}
for i in range(10):
a['num']=i
l.append(a)
print(l)

答案

首先分析第一段,{'num':i}的循环里面,每一次循环都产生一个新的字典类型,所以这个比较简单结果是

[{'num': 0}, {'num': 1}, {'num': 2}, {'num': 3}, {'num': 4}, {'num': 5}, {'num': 6}, {'num': 7}, {'num': 8}, {'num': 9}]

第二段情况就有些特殊了,a={'num':0}表示把映射类型字典的引用给了a,循环a['num']=i的时候,a的引用地址不变,所以取了最后一次循环的值。

[{'num': 9}, {'num': 9}, {'num': 9}, {'num': 9}, {'num': 9}, {'num': 9}, {'num': 9}, {'num': 9}, {'num': 9}, {'num': 9}]

3.请写出下列代码的输出的内容:

def test1():
for i in range(2):
print('+'+str(i))
yield str(i)
for a in test1():
print('-'+a)
for a in list(test1()):
print('-'+a)

答案

首先我们分析test1()打印的是什么,
```

```
可以看到是生成器一枚。
第一个for循环
```
+0 -0 +1 -1
```
第二个for循环,首先我们看list(test1())就知道了,首先需要执行完生成器里的循环获取然后转出list即[0,1]。
然后在循环这个list所以结果是。
```
+0 +1 -0 -1
```
###4.请写出下面代码输出的内存:
a=zip(('a','b','c'),(1,2,3,4))
print(dict(a))

答案

zip() 函数用于将可迭代的对象作为参数,将对象中对应的元素打包成一个个元组,然后返回由这些元组组成的列表。

如果各个迭代器的元素个数不一致,则返回列表长度与最短的对象相同,利用 * 号操作符,可以将元组解压为列表。

zip 方法在 Python 2 和 Python 3 中的不同:在 Python 3.x 中为了减少内存,zip() 返回的是一个对象。

所以这里按照最短的元素组成的字典输出是。

{'a':1,'b':2,'c':3}

5.请实现下面对象的序列号和反序列化。

class User():
name='user1'
age=30

答案

我们把变量从内存中变成可存储或传输的过程称之为序列化
反过来,把变量内容从序列化的对象重新读到内存里称之为反序列化
另外我们使用的模块是pickle
#####1、只能在python中使用,只支持python的基本数据类型。
#####2、可以处理复杂的序列化语法。(例如自定义的类的方法,游戏的存档等)
#####3、序列化的时候,只是序列化了整个序列对象,而不是内存地址。
pickle.dumps()方法把任意对象序列化成一个bytes.所以我们首先需要创建一个对象即u=User()
然后我们再把这个对象序列化。即
```
bytes=pickle.dumps(u)
```
然后是反序列化:
用pickle.loads()方法反序列化出对象.即
```
object=pickle.loads(bytes)
```
###6.写出下面代码的输出内容:
```
for n in filter(lambda n:n%5,[n for n in range(100) if n%5==0]):
print(n)
else:
print('12345')
```

答案

首先我们知道filter的用法
filter(function, iterable)
其中还
function -- 判断函数。
iterable -- 可迭代对象。
返回 True 或 False
但是这个题比较坑 n%5和n%5==0的区别 ,n%5是n除以5求其余数。n%5==0是n的5整除。
lambda n:n%5这个返回的是个数字而不是一个布尔类型不符合filter的要求,所以输出12345。
要达到筛选效果我们可以这样改.
```
for n in filter(lambda n:n%5==0,[n for n in range(100) if n%5==0]):
print(n)
```
但是如果我们这样改呢,
```
for i in filter(lambda n:n%5==0,[n for n in range(100) if n%5==0]):
print(n)
```
结果就比较有意思了,大家可以考虑下为什么。

python近期遇到的一些面试问题(三)的更多相关文章

  1. python近期遇到的一些面试问题(一)

    整理一下最近被问到的一些高频率的面试问题.总结一下方便日后复习巩固用,同时希望可以帮助一些朋友们. 1.python的基本数据类型 主要核心类型分为两类不可变类型:数字(int float bool ...

  2. python近期遇到的一些面试问题(二)

    1. 解释什么是栈溢出,在什么情况下可能出现. 栈溢出是由于C语言系列没有内置检查机制来确保复制到缓冲区的数据不得大于缓冲区的大小,因此当这个数据足够大的时候,将会溢出缓冲区的范围.在Python中, ...

  3. python服务端工程师就业面试指导☝☝☝

    python服务端工程师就业面试指导 由Python专业面试官打造的课,少之又少,专业代表着经验,代表着对考察点的通透理解,更代表着对你负责 第1章 Python工程师offer直通车(视频+教辅文档 ...

  4. Python服务端工程师就业面试指导✍✍✍

    Python服务端工程师就业面试指导  整个课程都看完了,这个课程的分享可以往下看,下面有链接,之前做java开发也做了一些年头,也分享下自己看这个视频的感受,单论单个知识点课程本身没问题,大家看的时 ...

  5. Python服务端工程师就业面试指导

    Python服务端工程师就业面试指导 整个课程都看完了,这个课程的分享可以往下看,下面有链接,之前做java开发也做了一些年头,也分享下自己看这个视频的感受,单论单个知识点课程本身没问题,大家看的时候 ...

  6. 运用Python语言编写获取Linux基本系统信息(三):Python与数据库编程,把获取的信息存入数据库

    运用Python语言编写获取Linux基本系统信息(三):Python与数据库编程 有关前两篇的链接: 运用Python语言编写获取Linux基本系统信息(一):获得Linux版本.内核.当前时间 运 ...

  7. python并发编程之asyncio协程(三)

    协程实现了在单线程下的并发,每个协程共享线程的几乎所有的资源,除了协程自己私有的上下文栈:协程的切换属于程序级别的切换,对于操作系统来说是无感知的,因此切换速度更快.开销更小.效率更高,在有多IO操作 ...

  8. python设计模式之装饰器详解(三)

    python的装饰器使用是python语言一个非常重要的部分,装饰器是程序设计模式中装饰模式的具体化,python提供了特殊的语法糖可以非常方便的实现装饰模式. 系列文章 python设计模式之单例模 ...

  9. Python操作redis字符串(String)详解 (三)

    # -*- coding: utf-8 -*- import redis #这个redis不能用,请根据自己的需要修改 r =redis.Redis(host=") 1.SET 命令用于设置 ...

随机推荐

  1. POJ 3276 Face The Right Way(前缀和优化)

    题意:有长度为N的01串,有一个操作可以选择连续K个数字取反,求最小的操作数和最小的K使得最后变成全1串.(N<=5000) 由于K是不定的,无法高斯消元. 考虑枚举K,求出最小的操作数. 显然 ...

  2. Ubuntu 18.04开发环境部署流程

    部署流程 安装系统 安装Eclipse和jre 配置系统 安装辅助工具 安装系统 用安装盘安装即可. 一般boot 1G,swap按内存大小,home 20G,根剩余. 安装Eclipse和jre 解 ...

  3. P3629 [APIO2010]巡逻

    题目描述 在一个地区中有 n 个村庄,编号为 1, 2, ..., n.有 n – 1 条道路连接着这些村 庄,每条道路刚好连接两个村庄,从任何一个村庄,都可以通过这些道路到达其 他任一个村庄.每条道 ...

  4. C#中string[]数组和list<string>泛型的相互转换 【转】

    http://www.cnblogs.com/szjdw/archive/2012/03/09/2387885.html 1,从System.String[]转到List<System.Stri ...

  5. 3.3 无连接运输:UDP

    3.3 无连接运输:UDP 简介: UDP提供不可靠的服务,它只做了运输层能做的最少工作,除了分解/复用以及少量的差错检测之外,几乎对IP没增加什么东西. 为什么应用开发人员宁愿再UDP之上构建应用, ...

  6. Zookeeper(四)Hadoop HA高可用集群搭建

    一.高可就集群搭建 1.集群规划 2.集群服务器准备 (1) 修改主机名(2) 修改 IP 地址(3) 添加主机名和 IP 映射(4) 同步服务器时间(5) 关闭防火墙(6) 配置免密登录(7) 安装 ...

  7. [转]从头开始 GAN

    1 前言 GAN的火爆想必大家都很清楚了,各种GAN像雨后春笋一样冒出来,大家也都可以名正言顺的说脏话了[微笑脸].虽然目前GAN的酷炫应用还集中在图像生成上,但是GAN也已经拓展到NLP,Robot ...

  8. poj1204 Word Puzzles

    Word Puzzles Time Limit: 5000MS   Memory Limit: 65536K Total Submissions: 12090   Accepted: 4547   S ...

  9. wx.request 获取不到post传递的值

    微信小程序的wx.request请求,method设为POST并向后台传递数据,但从后台返回的信息来看后台并没有获得传递的数据 wx.request({              url: 'url' ...

  10. linux shell学习二

    参考:http://www.cnblogs.com/waitig/p/5531463.html Shell注释 Shell中的注释以“#”号开头,所有以“#”号开头的代码都会被解释器所忽略. 比如下面 ...