----------------------8月4日----------------------------------------------------------------
1. python中a==b和a is b的卻別
a==b是比較運算符,變量a b的值相等則返回Ture否則返回False
a is b 是同一運算符,a,b的數值相等未必返回Ture,Python為了優化效率內置了小整數對象池和簡單字符串對象池,小整數對象池包括[-5, 256]這之中的數相同時,指的是一個對象。簡單字符串也如此。
2.打印5次“hello world”字符串
print(“world”*5)
3.dic中取出對應的值
①dic["key"]
②dic.values()。(取出所有的鍵,dic.keys())
③for k,v in dic.items(): print(k)
④ dic.get("key","沒有找到該鍵“)
⑤dic.pop("key","沒有找到該鍵")獲取該鍵對應的值,並且刪除字典中的這一鍵值對,如果該鍵不存在,則返回第二個參數(默認值)
-----------------------------------------------------------------------------------------------
**python中的那些容器可以存放不同數據結構?
list、tuple、set、dict
**如何創建Python中的不同數據類型?
lis=[]
tuple=()
set={}
dict={}
bul=None
**__init__.py功能?
①標識該目錄為python模塊包
②當用 import 導入該目錄時,會執行 __init__.py 里面的代碼,該文件就是一個正常的python代碼文件。因此可以將初始化代碼放入該文件中
**用過Python哪些裝飾器
裝飾器:為原函數擴展信工鞥你,用新功能待提就功能
作用,再不改變原油代碼基礎上,實現功能上的擴展
操作:講一個函數當做變量存入到新的函數中,用到閉包函數(內層函數引用外層函數值,外層函數返回內層函數)的方法
閉包函數,將原函數替換為新的函數
@符號的作用
1.把@符號下面的函數當做參數傳遞給裝飾器
2.可以把函數進行返回,讓新函數代替舊函數,以實現功能上的擴展
def kuozhan2(func):
def newfunc():
print('擴展腳本1')
func()
print('擴展腳本2')
return newfunc
@kuozhan2
def fun():
print('舊方法')
裝飾器嵌套
@kuozhan3
@kuozhan4
def func():
print('舊方法')
用裝飾器修飾帶有參數的函數
擴展新的功能要和原函數的功能在參數和返回值上保持一致
def kuozhan5(func):
def newfunc(who,where):
XXX
kuozhan5()
return newfunc
@kuozhan5
def func(who, where):
print("{who}在{where}買車",format(who,where))
func('張三',‘4s點’)
**Python中哪些數據類型的是可變參數,哪些是不可變參數
int、String、touple---不可變
dic、list---可變
1. mro是什么
method resolution Order,方法解析順序,方法調用時需要對當前類和基類進行搜索以確定方法艘在的位置,而搜索的順序就是 方法解析順序
2. 什么是c3算法
為了解決原來基於深度優先算法不滿足本地優先級和單調性的問題,
本地優先級:聲明時父類的順序,C(A,B)
3. 面向對象中帶雙下划線的特殊方法
__setattr__:添加/修改屬性時會觸發
__delattr__:刪除屬性時觸發
4. 雙下划線和單下划線的區別
單:保護變量。只有類對象和子類對象能訪問到這些變量
雙:私有成員,只有類對象能訪問,子類對象不能訪問
5.上下文context你知道嗎?(with的用法,如果類需要支持with語句,應該如何書寫?)
基本格式 with context_expression [as target(s)]: with - body 這里context_expression要返回一個上下文管理器對象, 該對象並不賦值給as中的target(s),如果制定了as子句的話,會將上下文管理器的__enter__()和__exit__()兩個方法context_manager.__enter__():進入上下文管理器的運行時上下文,在語句執行前調用,。with語句將該方法返回值賦值給as子句中的target,
6. 實現一個Singleton單例類,要求遵循基本語言編程規范(用盡量多的方式)
通過函數返回一個對象、裝飾器實現、__new__
希望某一個對象僅在程序中出現一次,之后所有調用使用同一個對象
__new__
class RedisClient:
_instance = None
@classmethod
def __new__(cls, *args, **kwargs):
if not cls._instance:
cls._instance = redis.StrictRedis(**REDIS_CONFIG, bd=0)
return cls._instance
if __name__ == '__main__':
r=RedisClient()
單例模式的優點核應用?
1.節省空間,全局內只有一個實例
2.數據庫配置、數據庫連接池
3.網站計數器
7. json序列化時,默認遇到中文會換成unicode,想保留中文怎么辦?
json.dump({"ddf":"你好“”}, ensure_ascii = Flase)
8. 用python匹配HTMLtag的時候,<.*>和<.*?>有什么區別?
<.*>貪婪匹配,匹配所有
<.*?>非貪婪匹配,匹配到第一個就停了
9.如何判斷一個郵箱合法
import re
if re.match(r'^[a-zA-Z0-9_-]+@[a-zA-Z0-9_-]+(\.[a-zA-Z0-9_-]+)+$', email):
print('right')
else:
print('wrong')
10. 用列表生成式寫一個0-100的列表
a = [i for i in range(100)]
11, 用列表生成式寫一個取0-100的技術
b= [i for i in range(100) if i%2 != 0]
c = [i for i in range(1,100,2)]
range可以設置步長
切片:字符串也有下標,【開始的下標:長度】
s = “hello world”
a = s[0:5]
切片加步長,每隔2個切一個[0:100:2]
d = [i for i in range(100)[::2]]
12.將類表中重復的元素過濾
lis = [1,2,2,3,3,5]
list(set(lis))
counter = {}定義一個計數器,用來保存元素在列表中出現的次數
for i in lis:
if
13.列表和元組的去表
li = []
tu = (1,2,3,4)#元組的元素不可變
14. 迭代器與生產器的區別
x = [1,2,3,4,5]
y = range(1,6)
list保存完整的值
generator不保存值
是什么:可以邊迭代邊計算,占用內存小
為什么要用:list中值都會存在內存中,當有大量數據時,且僅適用list中部分值,那么不適用的值就浪費了,生成器解決了這個問題
創建生成器:①將[1,2,3]改為(1,2,3)②當函數中使用了yield關鍵字,那么這個函數是一個generator,調用函數就是創建了一個生成器對象。
原理:生成器有一個next()方法,可以重復調用next()對象向生成器中取值,並且yield在return后會記住當前位置,並下次調用時從yield下一條語句開始執行
15.進程與線程的區別
線程是程序運行的最小單位
進程是操作系統管理的最小單元
進程可能包括好幾個線程
16.說一下python中的多線程特點
一般編程語言中多線程可以利用CPU的多核心
python的多線程有GLI全局鎖,不能真正意義上多核心
10.python怎么利用多核心
可以利用多進程實現