Python面试题总结(8)--操作类
1. 請(qǐng)寫(xiě)一個(gè) Python 邏輯,計(jì)算一個(gè)文件中的大寫(xiě)字母數(shù)量
答:讀取‘A.txt’中的大寫(xiě)字母數(shù)量
運(yùn)行結(jié)果為4。
2.了解數(shù)據(jù)庫(kù)的三范式么?
答: 經(jīng)過(guò)研究和對(duì)使用中問(wèn)題的總結(jié),對(duì)于設(shè)計(jì)數(shù)據(jù)庫(kù)提出了一些規(guī)范,這些規(guī)范被稱(chēng)為范式,一般需要遵守下面3范式即可::
第一范式(1NF):強(qiáng)調(diào)的是列的原子性,即列不能夠再分成其他幾列。
第二范式(2NF):首先是 1NF,另外包含兩部分內(nèi)容,一是表必須有一個(gè)主鍵;二是沒(méi)有包含在主鍵中的列必須完全依賴(lài)于主鍵,而不能只依賴(lài)于主鍵的一部分。
第三范式(3NF):首先是 2NF,另外非主鍵列必須直接依賴(lài)于主鍵,不能存在傳遞依賴(lài)。即不能存在:非主鍵列 A 依賴(lài)于非主鍵列 B,非主鍵列 B 依賴(lài)于主鍵的情況。
數(shù)據(jù)庫(kù)三大范式和五大約束
3.了解分布式鎖么
答: 分布式鎖是控制分布式系統(tǒng)之間的同步訪問(wèn)共享資源的一種方式。 對(duì)于分布式鎖的目標(biāo),我們必須首先明確三點(diǎn):
任何一個(gè)時(shí)間點(diǎn)必須只能夠有一個(gè)客戶(hù)端擁有鎖。
不能夠有死鎖,也就是最終客戶(hù)端都能夠獲得鎖,盡管可能會(huì)經(jīng)歷失敗。
錯(cuò)誤容忍性要好,只要有大部分的Redis實(shí)例存活,客戶(hù)端就應(yīng)該能夠獲得鎖。
分布式鎖的條件:
互斥性:分布式鎖需要保證在不同節(jié)點(diǎn)的不同線程的互斥
可重入性:同一個(gè)節(jié)點(diǎn)上的同一個(gè)線程如果獲取了鎖之后,能夠再次獲取這個(gè)鎖。
鎖超時(shí):支持超時(shí)釋放鎖,防止死鎖 高效,
高可用:加鎖和解鎖需要高效,同時(shí)也需要保證高可用防止分布式鎖失效,可以增加降級(jí)。
支持阻塞和非阻塞:可以實(shí)現(xiàn)超時(shí)獲取失敗,tryLock(long timeOut) 支持公平鎖和非公平鎖
分布式鎖的實(shí)現(xiàn)方案 1、數(shù)據(jù)庫(kù)實(shí)現(xiàn)(樂(lè)觀鎖) 2、基于zookeeper的實(shí)現(xiàn) 3、基于Redis的實(shí)現(xiàn)(推薦)
添加鏈接描述
添加鏈接描述
4.用 Python 實(shí)現(xiàn)一個(gè) Reids 的分布式鎖的功能
答:REDIS分布式鎖實(shí)現(xiàn)的方式:SETNX + GETSET,NX是Not eXists的縮寫(xiě),如SETNX命令就應(yīng)該理解為:SET if Not eXists。 多個(gè)進(jìn)程執(zhí)行以下Redis命令:
SETNX lock.foo <current Unix time + lock timeout + 1>
如果 SETNX 返回1,說(shuō)明該進(jìn)程獲得鎖,SETNX將鍵 lock.foo 的值設(shè)置為鎖的超時(shí)時(shí)間(當(dāng)前時(shí)間 + 鎖的有效時(shí)間)。 如果 SETNX 返回0,說(shuō)明其他進(jìn)程已經(jīng)獲得了鎖,進(jìn)程不能進(jìn)入臨界區(qū)。進(jìn)程可以在一個(gè)循環(huán)中不斷地嘗試 SETNX 操作,以獲得鎖。
5. 請(qǐng)寫(xiě)一段 Python連接Mongo數(shù)據(jù)庫(kù),并查詢(xún)代碼。
答:
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 = usernameself.password = passwordif self.username and self.password:self.db1 = self.client[db].authenticate(self.username, self.password)self.db1 = self.client[db]def find_data(self):# 獲取狀態(tài)為0的數(shù)據(jù)data = self.db1.test.find({"status": 0})gen = (item for item in data)return genif __name__ == '__main__':m = Mongo()print(m.find_data())6.寫(xiě)一段 Python 使用 mongo 數(shù)據(jù)庫(kù)創(chuàng)建索引的代碼:
答:
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 = usernameself.password = passwordif self.username and self.password:self.db1 = self.client[db].authenticate(self.username, self.password)self.db1 = self.client[db]def add_index(self):"""通過(guò)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())7.說(shuō)一說(shuō)Redis的基本類(lèi)型
答: Redis 支持五種數(shù)據(jù)類(lèi)型: string(字符串) 、 hash(哈希)、list(列表) 、 set(集合) 及 zset(sorted set: 有序集合)。
8.了解Redis的事務(wù)么
答: 簡(jiǎn)單理解,可以認(rèn)為 redis 事務(wù)是一些列 redis 命令的集合,并且有如下兩個(gè)特點(diǎn): 1.事務(wù)是一個(gè)單獨(dú)的隔離操作:事務(wù)中的所有命令都會(huì)序列化、按順序地執(zhí)行。事務(wù)在執(zhí)行的過(guò)程中,不會(huì)被其他客戶(hù)端發(fā)送來(lái)的命令請(qǐng)求所打斷。 2.事務(wù)是一個(gè)原子操作:事務(wù)中的命令要么全部被執(zhí)行,要么全部都不執(zhí)行。 一般來(lái)說(shuō),事務(wù)有四個(gè)性質(zhì)稱(chēng)為ACID,分別是原子性,一致性,隔離性和持久性。 一個(gè)事務(wù)從開(kāi)始到執(zhí)行會(huì)經(jīng)歷以下三個(gè)階段:
開(kāi)始事務(wù)
命令入隊(duì)
執(zhí)行事務(wù) 代碼示例:
9. 請(qǐng)寫(xiě)一段 Python連接Redis數(shù)據(jù)庫(kù)的代碼。
答:
from redis import StrictRedis, ConnectionPool redis_url="redis://:xxxx@112.27.10.168:6379/15" pool = ConnectionPool.from_url(redis_url, decode_responses=True) r= StrictRedis(connection_pool=pool)10. 請(qǐng)寫(xiě)一段 Python連接Mysql數(shù)據(jù)庫(kù)的代碼。
答:
# 導(dǎo)入pymysql模塊 import pymysql # 連接database conn = pymysql.connect(host=“你的數(shù)據(jù)庫(kù)地址”, user=“用戶(hù)名”,password=“密碼”,database=“數(shù)據(jù)庫(kù)名”,charset=“utf8”) # 得到一個(gè)可以執(zhí)行SQL語(yǔ)句的光標(biāo)對(duì)象 cursor = conn.cursor() # 定義要執(zhí)行的SQL語(yǔ)句 sql = """ CREATE TABLE USER1 ( id INT auto_increment PRIMARY KEY , name CHAR(10) NOT NULL UNIQUE, age TINYINT NOT NULL )ENGINE=innodb DEFAULT CHARSET=utf8; """ # 執(zhí)行SQL語(yǔ)句 cursor.execute(sql) # 關(guān)閉光標(biāo)對(duì)象 cursor.close() # 關(guān)閉數(shù)據(jù)庫(kù)連接 conn.close()推薦文獻(xiàn):Python連接MySQL數(shù)據(jù)庫(kù)之pymysql模塊使用
謝謝作者分享!
總結(jié)
以上是生活随笔為你收集整理的Python面试题总结(8)--操作类的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問(wèn)題。
- 上一篇: SQL Server 2012 下载和安
- 下一篇: Tomcat发布项目时,更改浏览器地址栏