python面试8---操作类题目

1.Python 交换两个变量的值

a, b = b, a

2.在读文件操作的时候会使用 read、readline 或者 readlines,简述它们各自的作用
read()是读取自定义大小,若不传参数,则读取所有文档所有内容
readline是读取一行
readlines是读取所有行,返回一个列表,列表中的元素为每行数据

3.json 序列化时,可以处理的数据类型有哪些?如何定制支持 datetime 类型?
字符串、数字(整数和浮点数)、字典、列表、布尔值、None。使用strftime将datetime格式化为标准字符串类型即可

4.json 序列化时,默认遇到中文会转换成 unicode,如果想要保留中文怎么办?
使用json.dumps函数时,添加参数ensure_ascii=False,如果想显示的更美观,可以添加indent=2参数,会在每个key值前添加两个空格。

5.有两个磁盘文件 A 和 B,各存放一行字母,要求把这两个文件中的信息合并(按字母顺序排列),输出到一个新文件 C 中。

1.读取A,B文件中的内容
2.将字符串转换成列表,然后排序,之后在转换成字符串
string = "string"
list1 = list(string)
list1.sort()
string = "".join(list1)
print(string)
3.写入C中

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 datetime

def datetime_operate(n: int):
    now = datetime.datetime.now()  # 获取当前时间
    print(now)
    _new_date = now + datetime.timedelta(days=n)  # 获取指定天数后的新日期
    new_date = _new_date.strftime("%Y-%m-%d %H:%M:%S")  # 转换为指定的输出格式
    return new_date
    
if __name__ == '__main__':
    print(datetime_operate(4))

7.写一个函数,接收整数参数 n,返回一个函数,函数的功能是把函数的参数和 n 相乘并把结果返回

def mul_operate(num):
    def g(val):
        return num * val

    return g

m = mul_operate(8)
print(m(5))

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 s

if __name__ == '__main__':
    for i in str_append(3):
        print(i)

9.一行代码输出 1-100 之间的所有偶数

print([i for i in range(1, 101) if i % 2 == 0])

10.一行代码输出 1-100 之间的所有偶数之和

print(sum(map(lambda x: x, [i for i in range(1, 101) if i % 2 == 0])))

11.with 语句的作用,写一段代码
文件使用后自动关闭、线程中锁的自动获取和释放等

with open("file_name", 'w') as f:
    pass

12.python 字典和 json 字符串相互转化方法

dict-->json: json.dumps(dict)
json-->dict: json.loads(json)

13.请写一个 Python 逻辑,计算一个文件中的大写字母数量

with open(file_name, 'r') as f:
    count = 0 
    for i in f.read():
        if i.isupper():
            count += 1
    print('大写字母数量为%d'%count)

14.请写一段 Python连接 Mongo 数据库,然后的查询代码

from pymongo import MongoClient
client = MongoClient(host='127.0.0.1',port=27017)
collection = client[db名][集合名]

t = collection.find_one({"name":"test10005"})
t = collection.find({"name":"test10005"})

15.说一说 Redis 的基本类型
Redis 支持五种数据类型: string(字符串) 、 hash(哈希)、list(列表) 、 set(集合) 及 zset(sorted set: 有序集合)

16.请写一段 Python连接 Redis 数据库的代码

1.连接并且操作
r = redis.Redis(host='192.168.220.144', port=6379)
r.set('name', 'John')
print(r.get('name'))  # b'John'

2.连接池
pool = redis.ConnectionPool(host='192.168.220.144', port=6379)
r = redis.Redis(connection_pool=pool)
r.set('age', 22)
print(r.get('age'))  # b'22'

3.管道
pool = redis.ConnectionPool(host='192.168.220.144', port=6379, db=2)
r = redis.Redis(connection_pool=pool)
pipe = r.pipeline(transaction=True)
pipe.set('name', 'John')
pipe.set('age', 22) 
pipe.execute()

17.请写一段 Python连接Mysql数据库的代码

conn = pymysql.connect(host='localhost', port=3306, user='root', passwd='1234', database='user', charset='utf8')  # 声明mysql连接对象
cs1 = conn.cursor()
cs1 .execute(sql语句字符串)  # 执行sql语句
cs1.close()
conn.close()  # 关闭链接

18.了解Redis的事务么
简单理解,可以认为 redis 事务是一些列 redis 命令的集合,并且有如下两个特点: 1.事务是一个单独的隔离操作:事务中的所有命令都会序列化、按顺序地执行。事务在执行的过程中,不会被其他客户端发送来的命令请求所打断。 2.事务是一个原子操作:事务中的命令要么全部被执行,要么全部都不执行。 一般来说,事务有四个性质称为ACID,分别是原子性,一致性,隔离性和持久性。 一个事务从开始到执行会经历以下三个阶段:开始事务、命令入队、执行事务

19.了解数据库的三范式么
经过研究和对使用中问题的总结,对于设计数据库提出了一些规范,这些规范被称为范式 一般需要遵守下面3范式即可: 第一范式(1NF):强调的是列的原子性,即列不能够再分成其他几列。 第二范式(2NF):首先是 1NF,另外包含两部分内容,一是表必须有一个主键;二是没有包含在主键中的列必须完全依赖于主键,而不能只依赖于主键的一部分。 第三范式(3NF):首先是 2NF,另外非主键列必须直接依赖于主键,不能存在传递依赖。即不能存在:非主键列 A 依赖于非主键列 B,非主键列 B 依赖于主键的情况。

20.了解分布式锁么
分布式锁是控制分布式系统之间的同步访问共享资源的一种方式。
对于分布式锁的目标,我们必须首先明确三点:
①任何一个时间点必须只能够有一个客户端拥有锁。
②不能够有死锁,也就是最终客户端都能够获得锁,尽管可能会经历失败。
③错误容忍性要好,只要有大部分的Redis实例存活,客户端就应该能够获得锁。 分布式锁的条件 互斥性:分布式锁需要保证在不同节点的不同线程的互斥 可重入性:同一个节点上的同一个线程如果获取了锁之后,能够再次获取这个锁。 锁超时:支持超时释放锁,防止死锁 高效,高可用:加锁和解锁需要高效,同时也需要保证高可用防止分布式锁失效,可以增加降级。 支持阻塞和非阻塞:可以实现超时获取失败,tryLock(long timeOut) 支持公平锁和非公平锁
分布式锁的实现方案 1、数据库实现(乐观锁) 2、基于zookeeper的实现 3、基于Redis的实现(推荐)

21.用 Python 实现一个 Reids 的分布式锁的功能

SETNX lock.foo <current Unix time + lock timeout + 1>

22.写一段 Python 使用 Mongo 数据库创建索引的代码

import pymongo
db_configs = {
    'type': 'mongo',
    'host': '地址',
    'port': '端口',
    'user': 'spider_data',
    'passwd': '密码',
    'db_name': 'spider_data'
}


class Mongo():
    def __init__(self, db=db_configs["db_name"], username=db_configs["user"],
                 password=db_configs["passwd"]):
        self.client = pymongo.MongoClient(f'mongodb://{db_configs["host"]}:{db_configs["port"]}')
        self.username = username
        self.password = password
        if self.username and self.password:
            self.db1 = self.client[db].authenticate(self.username, self.password)
        self.db1 = self.client[db]

    def add_index(self):
        """
          通过create_index添加索引
        """
        self.db1.test.create_index([('name', pymongo.ASCENDING)], unique=True)

    def get_index(self):
        """
          查看索引列表
        """
        indexlist=self.db1.test.list_indexes()
        for index in indexlist:
            print(index)

if __name__ == '__main__':
    m = Mongo()
    m.add_index()
    print(m.get_index())
  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值