【測試工程師】Python面試題


----------------------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怎么利用多核心

可以利用多進程實現

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM