Python面試題總結(8)--操作類

1. 請寫一個 Python 邏輯,計算一個文件中的大寫字母數量

答:讀取‘A.txt’中的大寫字母數量
在這里插入圖片描述

with open('A.txt') as f:"""計算一個文件中的大寫字母數量"""count = 0for i in f.read():if i.isupper():count += 1
print(count)

運行結果為4。

2.了解數據庫的三范式么?

答: 經過研究和對使用中問題的總結,對于設計數據庫提出了一些規范,這些規范被稱為范式,一般需要遵守下面3范式即可::

第一范式(1NF):強調的是列的原子性,即列不能夠再分成其他幾列。

第二范式(2NF):首先是 1NF,另外包含兩部分內容,一是表必須有一個主鍵;二是沒有包含在主鍵中的列必須完全依賴于主鍵,而不能只依賴于主鍵的一部分。

第三范式(3NF):首先是 2NF,另外非主鍵列必須直接依賴于主鍵,不能存在傳遞依賴。即不能存在:非主鍵列 A 依賴于非主鍵列 B,非主鍵列 B 依賴于主鍵的情況。

數據庫三大范式和五大約束

3.了解分布式鎖么

答: 分布式鎖是控制分布式系統之間的同步訪問共享資源的一種方式。 對于分布式鎖的目標,我們必須首先明確三點:

任何一個時間點必須只能夠有一個客戶端擁有鎖。
不能夠有死鎖,也就是最終客戶端都能夠獲得鎖,盡管可能會經歷失敗。
錯誤容忍性要好,只要有大部分的Redis實例存活,客戶端就應該能夠獲得鎖。

分布式鎖的條件:
互斥性:分布式鎖需要保證在不同節點的不同線程的互斥
可重入性:同一個節點上的同一個線程如果獲取了鎖之后,能夠再次獲取這個鎖。
鎖超時:支持超時釋放鎖,防止死鎖 高效,
高可用:加鎖和解鎖需要高效,同時也需要保證高可用防止分布式鎖失效,可以增加降級。
支持阻塞和非阻塞:可以實現超時獲取失敗,tryLock(long timeOut) 支持公平鎖和非公平鎖
分布式鎖的實現方案 1、數據庫實現(樂觀鎖) 2、基于zookeeper的實現 3、基于Redis的實現(推薦)
添加鏈接描述
添加鏈接描述

4.用 Python 實現一個 Reids 的分布式鎖的功能

答:REDIS分布式鎖實現的方式:SETNX + GETSET,NX是Not eXists的縮寫,如SETNX命令就應該理解為:SET if Not eXists。 多個進程執行以下Redis命令:

SETNX lock.foo <current Unix time + lock timeout + 1>
如果 SETNX 返回1,說明該進程獲得鎖,SETNX將鍵 lock.foo 的值設置為鎖的超時時間(當前時間 + 鎖的有效時間)。 如果 SETNX 返回0,說明其他進程已經獲得了鎖,進程不能進入臨界區。進程可以在一個循環中不斷地嘗試 SETNX 操作,以獲得鎖。


//鎖定的方法-偽代碼
publicbooleanlock(){connection.setAutoCommit(false)for(){result =select* from user where id = 100 for update;if(result){//結果不為空,//則說明獲取到了鎖return true; }//沒有獲取到鎖,繼續獲取sleep(1000); }return false;}//釋放鎖-偽代碼connection.commit();
import time
import redis
from conf.config import REDIS_HOST, REDIS_PORT, REDIS_PASSWORDclass RedisLock:def __init__(self):self.conn = redis.Redis(host=REDIS_HOST, port=REDIS_PORT, password=REDIS_PASSWORD, db=1)self._lock = 0self.lock_key = ""@staticmethoddef my_float(timestamp):"""Args:timestamp:Returns:float或者0如果取出的是None,說明原本鎖并沒人用,getset已經寫入,返回0,可以繼續操作。"""if timestamp:return float(timestamp)else:#防止取出的值為None,轉換float報錯return 0@staticmethoddef get_lock(cls, key, timeout=10):cls.lock_key = f"{key}_dynamic_lock"while cls._lock != 1:timestamp = time.time() + timeout + 1cls._lock = cls.conn.setnx(cls.lock_key, timestamp)# if 條件中,可能在運行到or之后被釋放,也可能在and之后被釋放# 將導致 get到一個None,float失敗。if cls._lock == 1 or (time.time() > cls.my_float(cls.conn.get(cls.lock_key)) andtime.time() > cls.my_float(cls.conn.getset(cls.lock_key, timestamp))):breakelse:time.sleep(0.3)@staticmethoddef release(cls):if cls.conn.get(cls.lock_key) and time.time() < cls.conn.get(cls.lock_key):cls.conn.delete(cls.lock_key)def redis_lock_deco(cls):def _deco(func):def __deco(*args, **kwargs):cls.get_lock(cls, args[1])try:return func(*args, **kwargs)finally:cls.release(cls)return __decoreturn _deco@redis_lock_deco(RedisLock())
def my_func():print("myfunc() called.")time.sleep(20)if __name__ == "__main__":my_func()

5. 請寫一段 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 = 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):# 獲取狀態為0的數據data = self.db1.test.find({"status": 0})gen = (item for item in data)return genif __name__ == '__main__':m = Mongo()print(m.find_data())

6.寫一段 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 = 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):"""通過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.說一說Redis的基本類型

答: Redis 支持五種數據類型: string(字符串) 、 hash(哈希)、list(列表) 、 set(集合) 及 zset(sorted set: 有序集合)。

8.了解Redis的事務么

答: 簡單理解,可以認為 redis 事務是一些列 redis 命令的集合,并且有如下兩個特點: 1.事務是一個單獨的隔離操作:事務中的所有命令都會序列化、按順序地執行。事務在執行的過程中,不會被其他客戶端發送來的命令請求所打斷。 2.事務是一個原子操作:事務中的命令要么全部被執行,要么全部都不執行。 一般來說,事務有四個性質稱為ACID,分別是原子性,一致性,隔離性和持久性。 一個事務從開始到執行會經歷以下三個階段:

開始事務
命令入隊
執行事務 代碼示例:

import redis
import sys
def run():   try:conn=redis.StrictRedis('192.168.80.41')# Python中redis事務是通過pipeline的封裝實現的pipe=conn.pipeline()pipe.sadd('s001','a')sys.exit()#在事務還沒有提交前退出,所以事務不會被執行。pipe.sadd('s001','b')pipe.execute()passexcept Exception as err:print(err)pass
if __name__=="__main__":run()

9. 請寫一段 Python連接Redis數據庫的代碼。

答:


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. 請寫一段 Python連接Mysql數據庫的代碼。

答:


# 導入pymysql模塊
import pymysql
# 連接database
conn = pymysql.connect(host=“你的數據庫地址”, user=“用戶名”,password=“密碼”,database=“數據庫名”,charset=“utf8”)
# 得到一個可以執行SQL語句的光標對象
cursor = conn.cursor()
# 定義要執行的SQL語句
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;
"""
# 執行SQL語句
cursor.execute(sql)
# 關閉光標對象
cursor.close()
# 關閉數據庫連接
conn.close()

推薦文獻:Python連接MySQL數據庫之pymysql模塊使用
謝謝作者分享!

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/news/452544.shtml
繁體地址,請注明出處:http://hk.pswp.cn/news/452544.shtml
英文地址,請注明出處:http://en.pswp.cn/news/452544.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

聯合主鍵

一個數據庫表只能有一個主鍵&#xff0c;不允許兩個主鍵。但是允許兩個字段聯合起來設置為主鍵&#xff0c;這叫聯合主鍵。

node之post提交上傳

post文件上傳 multer 中間件 在node中 express為了性能考慮采用按需加載的方式&#xff0c;引入各種中間件來完成需求&#xff0c; 平時解析post上傳數據時候&#xff0c;是用body-parse。但這個中間件有缺點&#xff0c;只能解析post的文本內容&#xff0c;&#xff08;applic…

要有自己的核心競爭力,應對時代變遷

在之前的PC時代和互聯網時代&#xff0c;人們都有一些顧慮&#xff0c;覺得智能化新技術的到來和采用將會導致就業人數急劇減少。 但實際上&#xff0c;無論是PC還是互聯網這樣新技術的到來&#xff0c;其實都對就業有極大的促進作用&#xff0c;其中最明顯的例子&#xff0c;…

ul、li列表簡單實用代碼實例

利用ul和li可以實現列表效果&#xff0c;下面就是一個簡單的演示。 代碼如下: 010203040506070809101112131415161718192021222324252627282930313233<!DOCTYPE html><html> <head> <meta charset" utf-8"> <meta name"author"…

Flask--讀取配置參數的方式

文章目錄方法1. 使用配置文件方法2. 使用對象配置參數方法3. 直接操作config的字典對象項目實例方法1. 使用配置文件 首先將配置參數寫在文件中&#xff0c;例如&#xff1a;config.cfg 然后導入: app Flask("__name__") app.config.from_pyfile("config.cf…

g開頭的C語言編程軟件,C語言函數大全(g開頭)

函數名: gcvt功 能: 把浮點數轉換成字符串用 法: char *gcvt(double value, int ndigit, char *buf);程序例:#include#includeint main(void){char str[25];double num;int sig 5; /* significant digits *//* a regular number */num 9.876;gcvt(num, sig, str);printf(&quo…

什么是總體設計

總體設計的基本目的就是回答“概括地說&#xff0c;系統應該如何實現”這個問題&#xff0c;因此&#xff0c;總體設計又稱為概要設計或初步設計。總體設計階段的另一項重要任務是設計軟件的結構&#xff0c;也就是要確定系統中每個程序是由哪些模塊組成的&#xff0c;以及這些…

程序員成熟的標志《程序員成長路線圖:從入門到優秀》

對好書進行整理&#xff0c;把好內容共享。 我見證過許多的程序員的成長&#xff0c;他們很多人在進入成熟期之后&#xff0c;技術上相對較高&#xff0c;一般項目開發起來比較自信&#xff0c;沒有什么太大的困難&#xff0c;有的職位上也有所提升&#xff0c;成了項目經理、…

Diango博客--1.Django的接客之道

文章目錄0.思路引導1.實現最簡單的HelloWorld2.實現最簡單的HelloWorld(使用Templates)0.思路引導 django 的開發流程&#xff1a; 即首先配置 URL&#xff0c;把 URL 和相應的視圖函數綁定&#xff0c;一般寫在 urls.py 文件里&#xff0c;然后在工程的 urls.py 文件引入。 …

c語言is int number,C語言中NSInteger,NSNumber以及Int的區別

NSInteger和NSNumber首先:NSInteger,NSNumber并沒有什么關系,更不要想當然的以為二者還有什么繼承關系,甚至還有人問NSInteger是不是NSNumber的子類?答案當然是NO!!!NSInteger只是一個基本的數據類型,而NSNumber是OC的對象,并且NSNumber繼承自NSValue,NSValue又繼承自NSObject…

Git的GUI工具sourcetree的使用

一、Git的學習這部分學習廖雪峰的git教程&#xff0c;參加以下鏈接&#xff1a;https://www.liaoxuefeng.com/wiki/0013739516305929606dd18361248578c67b8067c8c017b0001、首先是git的基本概念&#xff0c;如下圖所示&#xff1a;整個git管理主要分為工作區、版本庫&#xff0…

YY一下,扎克伯格做了一個什么樣的AI家居助手?

對于這款令小扎太太抓狂的AI家居助手&#xff0c;難道就沒人好奇嗎&#xff1f; 據說&#xff0c;扎克伯格每年都要給自己定個目標&#xff0c;而他也即將完成今年的目標——打造一個AI家居助手。 當初&#xff0c;在定下這個目標時&#xff0c;小扎為我們簡單描述了一下&…

Diango博客--2.博客從“裸奔”到“有皮膚”

文章目錄0.思路引導1.更改視圖函數&#xff0c;從數據庫中獲取數據2.網上下載模板&#xff0c;添加靜態文件3.修改模板Templates中css、js文件的加載路徑4.修改模板&#xff0c;引入模板變量&#xff0c;獲取數據庫數據0.思路引導 前文的Hello World 級別的視圖函數特別簡單&a…

抽象

人類在認識復雜現象的過程中使用的最強有力的思維工具是抽象。人們在實踐中認識到&#xff0c;在現實世界中一定事物、狀態或過程之間總存在著某些相似的方面(共性)。把這些相似的方面集中和概括起來&#xff0c;暫時忽略它們之間的差異&#xff0c;這就是抽象。或者說抽象就是…

程序員的成長從開竅開始系列 一、如何擺脫低級錯誤的困擾

最近&#xff0c;有兩位Google Maps API的初學者向我請教他們按照最簡單例子寫的程序為什么不能正常的運行。 其中一位用GTalk跟我交流&#xff0c;我仔細了看了他的代碼&#xff0c;沒看出問題&#xff0c;把代碼保存在本地&#xff0c;打開Firefox的錯誤控制臺&#xff0c;用…

脈沖時間寬度c語言,什么是脈沖寬度_脈沖寬度是什么意思

脈沖寬度是個很廣泛的詞&#xff0c;在不同的領域&#xff0c;脈沖寬度有不同的含義。脈沖寬度從學術角度講就是電流或者電壓隨時間有規律變化的時間寬度&#xff0c;平時研究主要是方波&#xff0c;三角波&#xff0c;鋸齒波&#xff0c;正弦函數波等等&#xff0c;這些波形變…

HDU - 5919 Sequence II

題意&#xff1a; 給定長度為n的序列和q次詢問。每次詢問給出一個區間&#xff08;L&#xff0c;R&#xff09;&#xff0c;求出區間內每個數第一次出現位置的中位數&#xff0c;強制在線。 題解&#xff1a; 用主席樹從右向左的插入點。對于當前點i&#xff0c;如果a[i]出現過…

Django博客--3.創作后臺開啟

文章目錄0.創建admin后臺管理員賬號1.在 admin 后臺注冊模型2.漢化應用的標題3.漢化應用下各個模塊的名稱4.漢化應用下各個模塊的屬性的名稱5.文章列表顯示更加詳細的信息6.簡化新增文章的表單7.自動設置文章作者為當前用戶8.設定創建時間為當前時間9.設定修改建時間為保存時的…

逐步求精

逐步求精定義為為了能集中精力解決主要問題而盡量推遲對問題細節的考慮。 逐步求精最初是由NiklausWirth提出的一種自頂向下的設計策略。按照這種設計策略&#xff0c;程序的體系結構是通過逐步精化處理過程的層次而設計出來的。通過逐步分解對功能的宏觀陳述而開發出層次結構…

raid-6磁盤陣列損壞導致數據丟失的恢復過程(圖文教程)

一、故障描述機房突然斷電導致整個存儲癱瘓&#xff0c;加電后存儲依然無法使用。經過用戶方工程師診斷后認為是斷電導致存儲陣列損壞。整個存儲是由12塊日立硬盤&#xff08;3T SAS硬盤&#xff09;組成的RAID-6磁盤陣列&#xff0c;被分成一個卷&#xff0c;分配給幾臺Vmware…