1. Python 交换两个变量的值
答:在 Python 中交换两个对象的值通过下面的方式即可
a , b = b ,a
但是需要强调的是这并不是元组解包,通过 dis 模块可以发现,这是交换操作的字节码是 ROT_TWO,意思是在栈的顶端做两个值的互换操作。
2. 在读文件操作的时候会使用 read、readline 或者 readlines,简述它们各自的作用
答:.read() 每次读取整个文件,它通常用于将文件内容放到一个字符串变量中。如果希望一行一行的输出那么就可以使用 readline(),该方法会把文件的内容加载到内存,所以对于大文件的读取操作来说非常的消耗内存资源,此时就可以通过 readlines 方法,将文件的句柄生成一个生产器,然后去读就可以了。
可参考: 文献、菜鸟教程
3. json 序列化时,可以处理的数据类型有哪些?如何定制支持 datetime 类型?
答: 可以处理的数据类型是 str、int、list、tuple、dict、bool、None, 因为 datetime 类不支持 json 序列化,所以我们对它进行拓展。
详细知识参考:序列化
#自定义时间序列化
import json
from datetime import datetime, date#JSONEncoder 不知道怎么去把这个数据转换成 json 字符串的时候,它就会去调 default()函数,所以都是重写这个函数来处理它本身不支持的数据类型,
#default()函数默认是直接抛异常的。
class DateToJson(json.JSONEncoder):def default(self, obj):if isinstance(obj, datetime):return obj.strftime('%Y-%m-%d %H:%M:%S')elif isinstance(obj, date):return obj.strftime('%Y-%m-%d')else:return json.JSONEncoder.default(self, obj)d = {'name': 'cxa', 'data': datetime.now()}
print(json.dumps(d, cls=DateToJson))
4. json 序列化时,默认遇到中文会转换成 unicode,如果想要保留中文怎么办?
答:可以通过 json.dumps 的 ensure_ascii 参数解决,代码示例如下:
import json
a=json.dumps({“name”:“张三”},ensure_ascii=False)
print(a)
可以参考文献:json 中的ensure_ascii=False
5. 有两个磁盘文件 A 和 B,各存放一行字母,要求把这两个文件中的信息合并(按字母顺序排列),输出到一个新文件 C 中。
答:
#文件 A.txt 内容为 ASDCF
#文件 B.txt 内容为 EFGGTG
with open("A.txt") as f1:f1_txt = f1.readline()
with open("B.txt") as f2:f2_txt = f2.readline()
f3_txt = f1_txt + f2_txtf3_list = sorted(f3_txt)with open("C.txt", "a+") as f:f.write("".join(f3_list))
输出的文件 C 的内容为 ACDEFFGGGST
6. 如果当前的日期为 20190530,要求写一个函数输出 N 天后的日期,(比如 N 为 2,则输出 20190601)。
答:这个题目考察的是 datetime 里的 timedelta 方法的使用,参数可选、默认值都为 0:datetime.timedelta(days=0, seconds=0, microseconds=0, milliseconds=0, minutes=0, hours=0, weeks=0) 通过这个参数可以指定不同的日期类型进行加减操作,这里我们需要改的是 days,代码如下
import datetimedef datetime_operate(n: int):now = datetime.datetime.now() # 获取当前时间_new_date = now + datetime.timedelta(days=n) # 获取指定天数后的新日期new_date = _new_date.strftime("%Y%m%d") # 转换为指定的输出格式return new_dateif __name__ == '__main__':print(datetime_operate(4))
参考文献:Python timedelta模块 时间增减用法
参考二
7. 写一个函数,接收整数参数 n,返回一个函数,函数的功能是把函数的参数和 n 相乘并把结果返回。
答:这个题目考查了闭包的使用。闭包请参考:python中的闭包
伪代码示例如下:
def 外层函数(参数):def 内层函数():print("内层函数执行", 参数)return 内层函数内层函数的引用 = 外层函数("传入参数")
内层函数的引用()
代码示例如下,返回函数之类型是函数对象。
def mul_operate(num):def g(val):return num * valreturn gm = mul_operate(8)
print(m(5))
返回值为:40
8. 下面代码会存在什么问题,如何改进?
def strappend(num):str='first'for i in range(num):str+=str(i)return str
答: 首先不应该使用 Python 的内置函数 str 作为变量名,将其改为 s,另外在Python中str 是个不可变对象,每次迭代都会生成新的存储空间,num 越大,创建的 str 对象就会越多,内存消耗越大。
使用 yield 改成生成器即可, 还有一点就是命名规范的位置,函数名添加_分割比较好,完整的代码如下:
def str_append(num):s = 'first'for i in range(num):s += str(i)yield sif __name__ == '__main__':for i in str_append(3):print(i)
输出结果:
first0
first01
first012
9. 一行代码输出 1-100 之间的所有偶数。
答:可以通过列表生成式,然后使用与操作如果如 1 与之后结果为 0 则表明为偶数,等于 1 则为奇数。
方法1
print([i for i in range(1, 101) if i & 0x1 == 0])
方法2:测试发现方法二效率更高
print(list(range(2, 101, 2)))
10. with 语句的作用
with 语句适用于对资源进行访问的场合,确保不管使用过程中是否发生异常都会执行必要的“清理”操作,释放资源,比如文件使用后自动关闭、线程中锁的自动获取和释放等。
Python之with语法原理
#一般访问文件资源时我们会这样处理:
f = open('c:\test.txt', 'r')
data = f.read()
f.close()
这样写没有错,但是容易犯两个毛病:
- 如果在读写时出现异常而忘了异常处理。
- 忘了关闭文件句柄
#以下的加强版本的写法:f = open('c:\test.txt', 'r')
try:data = f.read()
finally:f.close()
以上的写法就可以避免因读取文件时异常的发生而没有关闭问题的处理了。代码长了一些。但使用 with 有更优雅的写法:
with open(r'c:\test.txt', 'r') as f:data = f.read()
11. Python 字典和 json 字符串相互转化方法
答:
在 Python 中使用 dumps 方法 将 dict 对象转为 Json 对象,使用 loads 方法可以将 Json 对象转为 dict 对象。
import jsondic = {'a': 123, 'b': "456", 'c': "liming"}
# dumps:字典对象转换成json对象
json_str = json.dumps(dic)
print(json_str)
# loads:json对象转换成字典对象
dic2 = json.loads(json_str)
print(dic2)
输出结果:
{"a": 123, "b": "456", "c": "liming"}
{'a': 123, 'b': '456', 'c': 'liming'}
我们再来看一个特殊的例子
import jsondic = {'a':123, 'b':"456", 'c':"liming"}
# 转换成json格式
dic_ = str(dic).replace("'", "\"")
print(dic_)
# loads:json对象转换成字典对象
dic_str = json.loads(dic_)
print(dic_str)
输出结果:
{'a': 123, 'b': '456', 'c': 'liming'}
首先 json.loads(jsonstr) 这里面的参数只能是 jsonstr 格式的字符串。
当我们使用 str 将字典 dic 转化为字符串以后,得到的结果为:"{‘a’: 123, ‘b’: ‘456’, ‘c’: ‘liming’}"。
如果直接使用 json.loads(str(dic)) 你会发现出现错误,原因是单引号的字符串不符合Json的标准格式。
所以再次使用了 replace("’", “”")从而得到字典,其实这个例子主要目的是告诉大家 Json 的标准格式是不支持单引号型字符串的,否则会出现以下错误:
json.decoder.JSONDecodeError: Expecting property name enclosed in double quotes: line 1 column 2 (char 1)