Python面試重點(基礎篇)


1.簡述列舉了解的編程語言及語言間的區別?

 

Python是一門動態的解釋型的強類型定義語言

解釋性語言是指它常用的執行機制是使用一個“解釋器”來執行,解釋器對於程序是一句一句“翻譯”成機器語言來執行,例如shell腳本語言。

編譯型語言是指它常用的執行機制是使用一個“編譯器”來編譯成機器語言,然后你就可以直接運行(執行)這個編譯成的“可執行文件”。例如C語言

2.列舉Python2和Python3的區別?

    1、print

            在python2中,print被視為一個語句而不是一個函數,python3中,print()被視為一個函數

        2、整數的除法

            在python2中,鍵入的任何不帶小數的數字,將被視為整數的編程類型。比如5/2=2,解決方法:5.0/2.0=2.5

            在python3中,整數除法變得更直觀 5/2=2.5

         3、Unicode

            Python 2 默認使用 ASCII 字母表;Python 3 默認使用 Unicode

       4. Python2中存在老式類和新式類的區別,Python3統一采用新式類。新式類聲明要求繼承object,必須用新式類應用多重繼承。

3.看代碼寫結果

v1 = 1 or 2     v1=1

v2 = 3 and 7 or 9 and 0   v2 = 7

4.比較以下值有什么不同?

v1 = [1,2,3]
v2 = [(1),(2),(3)]
v3 = [(1,),(2,),(3,)]

v3中的元素是元組

5.用一行代碼實現數值交換。

a = 1
b = 2

a,b=b,a

6.Python中單引號、雙引號、三引號的區別?

單引號和雙引號用法區別不大,雙引號里可以嵌套單引號,三引號可以用來注釋

7.is和==的區別?

is表示判斷兩邊內存地址是否相同,==表示判斷兩邊值是否相等

8.python里如何實現tuple和list的轉化?

#list to tuple
lis=[1,2,3,4,5,6]
x=tuple(lis)
print(type(x),x)

#tuple to list
tup=(1,2,3,4,5,6)
y=list(tup)
print(type(y),y)

9.如何實現字符串 name='老男孩'的反轉?

print(name[::-1])

10.兩個set如何獲取交集、並集、差集?

  
     x=set('sixbobo')

  y=set('googlebb'

  交集 print(x&y)

  取並集 print(x|y)

  取差集 print(x-y)

11.那些情況下, y != x - (x-y)會成立?

非空集合且不為子父關系的兩個集合

12.Python中如何拷貝一個對象?

   賦值(=)

lst1 = [1, 2, 3]
lst2 = lst1[:]
lst1.append(4)
print(lst2)

13.簡述 賦值、淺拷貝、深拷貝的區別?

對象的賦值就是簡單的引用

淺拷貝會創建新的對象

深拷貝只是一種形式,copy模塊中的deepcoopy()函數,深拷貝拷貝了對象的所有元素,包括多層嵌套的元素

賦值   : 將變量和值在內存中形成映射指向關系
淺拷貝 : 只拷貝第一級里所有的元素 copy.copy
深拷貝 : 為所有層級的元素都單獨開辟新空間 copy.deepcopy() (地址:原不可變數據只是暫時的指向,可變的數據獨立開辟新空間)

14.pass的作用?

pass 不做任何事情,一般用做占位語句。

15.閱讀代碼寫結果。

import copy
a = [1,2,4,5,['b','c']]
b = a
c = copy.copy(a)
d = copy.deepcopy(a)

a.append(5)
a[4].append('d')

print(b)
print(c)
print(a)

[1, 2, 4, 5, ['b', 'c', 'd'], 5]

[1, 2, 4, 5, ['b', 'c', 'd']]

[1, 2, 4, 5, ['b', 'c', 'd'], 5]

16.用Python實現9 * 9 乘法表。

 

 

 

17.用Python顯示一個斐波那契數列。

 

# 方法一
lst = [1, 1]
for i in range(10):
lst.append(lst[-1] + lst[-2])
print(lst)

# 方法二
a, b = 0, 1
for i in range(10):
print(b)
a, b = b, a + b


# 方法三
def fib(n):
if n <= 2:
return 1
# 上一個值 + 上上個值
return fib(n - 1) + fib(n - 2)


print(fib(6))

 

 18.如何刪除列表中重復的值?

先將列表轉換為set,在轉換回來 

list(set(lst))

19.一個大小為100G的文件etl_log.txt, 要讀取文件中的內容, 寫出具體過程代碼?

with open("./data/log.txt",encoding='utf8') as f:
    for line in f:
        print(line)

20.a = dict(zip(("a","b","c","d","e"),(1,2,3,4,5))) 請問a是什么?

字典,a = {'a': 1, 'b': 2, 'c': 3, 'd': 4, 'e': 5}

21.lambda關鍵字的作用?

lambda 匿名函數: 用一句話表達只有返回值的無名函數
lambda 參數: 返回值

22.*arg**kwarg作用?

# *arg   普通收集參數 :   收集多余的沒人要的普通實參
# **kwarg 關鍵字收集參數: 收集多余的沒人要的關鍵字實參

23.如何在函數中設置一個全局變量 ?

  

def func():
global a
a = 90


func()
print(a)

24.filter、map、reduce的作用?

filter主要作用是過濾掉序列中不符合函數條件的元素,當序列中要刪、減元素時,可以使用filter函數。

map主要作用是求一個序列或者多個序列進行函數映射之后的值。

reduce是對一個序列進行壓縮運算,得到一個值。

filter => 過濾數據
iterable : 可迭代對象(range ,容器類型數據 , 迭代器)
filter(func,iterable) => 返回迭代器

lst = [1,2,3,4,5]
it = filter(lambda x : True if x % 2 == 0 else False , lst )
print(list(it))

"""

# map -> 處理(映射)數據
map(func, iterable) = > 返回迭代器

lst = [1, 2, 3]
it = map(lambda x: x * 3, lst)
print(list(it))

# reduce -> 計算數據
from functools import reduce

# reduce(func,iterable) => 最后計算的值
# [5,4,8,8] => 5488
lst = [5, 4, 8, 8]
res = reduce(lambda x, y: x * 10 + y, lst)
print(res, type(res))

25.什么是匿名函數?匿名函數有什么作用?

關鍵字lambda表示匿名函數,因為函數沒有名字,不必擔心函數名沖突

lambda 匿名函數: 用一句話表達只有返回值的無名函數
lambda 參數: 返回值

26.Python遞歸的最大層數?

998

27.什么是迭代器?什么是可迭代對象?

具有__iter__() 和 __next__()這兩個方法的是迭代器
# 具有__iter__()方法就是可迭代對象

28.什么是生成器?

有yield的就是生成器

生成器的本質就是迭代器, 可以自定義迭代的邏輯
創建方式兩種:
(1)
生成器表達式(推導式)(i for i in range(3))
(2)
生成器函數(含有yield關鍵字)

29.什么是裝飾器及應用場景?

裝飾器就是用來修飾某個函數,在不改變原來方法代碼的前提下,額外的附加其他的功能和屬性

只要是你不想改變原來的代碼,又想添加額外的功能,都可以使用裝飾器來完成。

裝飾器的本質就是閉包
# 在不修改原有代碼的前提下,額外增加新功能就是裝飾器
# 應用:登錄認證,property類,框架(django,flask,@app.route("/",methdos=["GET","POST"]))

30.什么是反射及應用場景?

通過字符串去操作類對象 或者 模塊中的屬性方法
hasattr
getattr
setattr
delattr

31.寫一個普通的裝飾器。

 

 32.寫一個帶參數的裝飾器。

def outer(n):
def wrapper(func):
def inner1(*args, **kwargs):
res = func(*args, **kwargs)
print("我是大王")
return res

def inner2(*args, **kwargs):
res = func(*args, **kwargs)
print("大王叫我來巡山")
return res

if n == "alex":
return inner1
else:
return inner2

return wrapper


@outer("alex123") # outer("alex123") => wrapper =>@wrapper
def func():
print("i am fine 3q")


func()

33.求結果

【6,6,6,6】

"""
def出現的位置是函數的定義處
函數() 出現的位置是函數的調用處
(1)調用的時候,才會把函數中的代碼,從上到下執行一遍,否則不執行
(2)里面的func是一個閉包函數,延長了當前變量i的生命周期,最后一次i的值3,所以再去調用時候拿的3
"""

34.def(a, b=[])這種寫法有什么陷阱?

第一次實例化了一個列表以后每次都用第一次的

"""
默認參數:
如果調用時,用戶給實參了,那么使用用戶的
如果調用時,用戶沒給實參,那么使用默認的(早已存在內存中的這個列表)

默認值會提前在內存中駐留,在使用時,才能調取,在定義函數的時候就提前開辟了空間
"""

35.

[1, 3]

[10, 20, 2]

[1, 3]

36.

[1]
[10, 20, 2]
[1, 3]

37.請編寫一個函數實現將IP地址轉換成一個整數。

# ljust   原字符串居左,填充符號
# rjust 原字符串居右,填充符號
# 方法一
ip = "10.3.9.12"
strvar = ""
for i in ip.split("."):
bin_str = str(bin(int(i)))[2:]
# 總長度是8 原字符串居右
strvar += bin_str.rjust(8, "0")
print(strvar)

# 把二進制字符串轉換成十進制,默認轉換時,是十進制
print(int(strvar, 2))

# 方法二
ip = "10.3.9.12"
strvar = ""
for i in ip.split("."):
# format 將整型轉化成二進制,不夠8位的拿0補位
strvar += format(int(i), "08b")
print(int(strvar, 2))

38.請查找一個目錄下的所有文件(可能存在文件嵌套)。

 

# 方法一 (遞歸寫法)
import os
def getallsize(pathvar):
  size = 0
  lst = os.listdir(pathvar)
  print(lst)
  for i in lst:
    pathvar2 = os.path.join(pathvar,i)
    print(pathvar2)

    # 判斷是否是文件
    if os.path.isfile(pathvar2):
    size += os.path.getsize(pathvar2)
    # 判斷是否是文件夾
    elif os.path.isdir(pathvar2):
      size += getallsize(pathvar2)

      print(size)

  return size

# "E:\串講基礎\day2\test\1.txt"
pathvar = r"E:\串講基礎\day2\test"
res = getallsize(pathvar)
# print(res)

# 方法二
import os 
# os.walk() => 生成器
pathvar = r"E:\串講基礎\day2\test"
gen = os.walk(pathvar)

for root,dirs,files in gen:
  for name in files:
    pathvar = os.path.join(root,name)
    print(pathvar)

 

 

39.求結果

# floor ceil round
import math
print(math.floor(5.5))

# round n.5 奇進偶不進
print(round(4.5))
print(round(5.5))
print(round(4.52))

 

 40.是否使用過functools中的函數?其作用是什么?

from functools import reduce
# 在裝飾器中使用,如果想要保留原來函數的屬性,加上wraps
from functools import wraps

def wrapper(func):
    @wraps(func)
    def inner(*args,**kwargs):
        res = func(*args,**kwargs)
        print("and you")
        return res
        
    return inner

@wrapper
def func():
    print("i am fine 3q")

func()
print(func)

# def abc():
    # pass
# print(abc)

 

41.re的match和search區別?

search 從字符串中任意位置進行匹配查找到一個就停止了,返回的是一個對象. 獲取匹配的內容必須使用.group()進行獲取

match 從字符串開始位置進行匹配

"""
match : 必須從字符串的開頭進行匹配
search: 從任意位置開始匹配,匹配到就返回
只匹配一個
"""

42.用Python匹配HTML tag的時候,<.>和<.?>有什么區別?

. 除了\n的任意字符
* 量詞,代表匹配0次或者多次,任意個
.* 貪婪匹配
.*? 非貪婪匹配

43.如何生成一個隨機數?

import random
random.random    隨機獲取 0<= x < 1
random.randrange 隨機獲取指定范圍中的整數,用法上同range
random.uniform   隨機獲取指定范圍中的小數

 

44.super的作用?

# 用來解決多繼承之間復雜的調用關系使用super
在多繼承中,如果出現了多個同名方法
super在調用的時候,會按照mro列表的繼承順序依次調用
類.mro() = > lst

45.雙下划線和單下划線的區別?

"單下划線" 開始的成員變量叫做保護變量,意思是只有類對象和子類對象自己能訪問到這些變量;

"雙下划線" 開始的是私有成員,意思是只有類對象自己能訪問,連子類對象也不能訪問到這個數

據。

class MyClass():
    __abc = 90
    _ppp = 100
"""
封裝: 公有public 私有private 受保護的protected
私有: 只能在當前這個類里面使用,不能再子類或者在類外使用
受保護的: 可以在當前這個類或者子類里使用,不能再類外使用
約定俗成在該變量前面加上一個下划線_ , 就表示受保護了
"""

 

46.@staticmethod和@classmethod的區別?

 

一個靜態方法,一個類方法
一個靜態方法:(無論是對象還是類,都可以調用,不會默認傳遞任何參數)
一個類方法 :(無論是對象還是類,都可以調用,會默認傳遞類這個參數)

47.實現一個單例模式(加鎖)。

 

# 單例模式:這個類無論實例化多少次,都有且只有一個對象
from threading import Lock
class MyClass(object):
    __obj = None
    lock = Lock()
    def __new__(cls,*args,**kwargs):
        with cls.lock:
            if not cls.__obj:
                cls.__obj = object.__new__(cls)
            return cls.__obj
obj1 = MyClass()
obj2 = MyClass()
print(obj1,obj2)

48。
棧 : 先進后出,或者 后進先出
隊列: 先進先出

49.以下代碼輸出是什么? 請給出答案並解釋。

class Parent(object):
    x = 1
class Child1(Parent):
    pass
class Child2(Parent):
    pass
# 1 1 1
print(Parent.x, Child1.x, Child2.x)
Child1.x = 2
# 1 2 1
print(Parent.x, Child1.x, Child2.x)
Parent.x = 3
# 3 2 3
print(Parent.x, Child1.x, Child2.x)

 

50.參考下面代碼片段

class Context:
  pass

with Content() as ctx:
  ctx.do_something()
請在Context類下添加代碼完成該類的實現

# 面向對象的上下文管理是with語法的具體實現
class Context():
    def __enter__(self):
        return self
    def __exit__(self, exc_type, exc_val, exc_tb):
        # 相當於在最后,執行了文件的關閉操作,fp.close()
        print("abc123")
    def do_something(self):
        print(1111)

with Context() as ctx:
    ctx.do_something()
    print(ctx)

# 自動實現了關閉操作
# with open("文件") as fp:
#     res = fp.read()

# ### 第二大題

1.如何獲取列表中第二大的值?
# (1) 所有的容器類型數據都可以通過 sorted (sort只局限於列表進行排序)
# 去重
lst = set([98,1,100,3,-100,50,100,100])
res = sorted(lst)
res_new = res[-2]
print(res_new)

2.簡述Python內存管理機制。

# (2) 內存管理機制
計數器,垃圾回收,內存池
# 一.計數器
特點:引用技術如果是0,把這個值從內存中釋放掉
a = 100
b = a
print(b)
del b
缺點:在維護引用計數時,又可能數據產生循環引用,造成數據不能刪除,造成內存泄漏
lst1 = [1,2]
lst2 = [5,6]
lst1.append(lst2)
lst2.append(lst1)
del lst1
print(lst1)
print(lst2)
# print(lst1)
# print(lst2)

3.簡述Python的垃圾回收機制。

# 垃圾回收:引用計數為主,標記清除和分帶回收為輔
標記清除 : 檢測標記該對象,避免出現循環引用不能刪除的現象
分帶回收 :
把內存中的數據分成三個區域: 新生代0,老年代1,永久代2
新生代0數據超過700 , 或者老年代1,永久代2數據超過10,自動觸發內存中的垃圾回收機制
新生代0觸發將清除所有三代的區域
老年代1觸發會清理1,2代
永久代2觸發只會清理自己


# 三.內存池
# 在同一個文件當中 (python3.6)
# -->Number 部分
1.對於整型而言,-5~正無窮范圍內的相同值 id一致
2.對於浮點數而言,非負數范圍內的相同值 id一致
3.布爾值而言,值相同情況下,id一致
4.復數在 實數+虛數 這樣的結構中永不相同(只有虛數的情況例外)
# -->容器類型部分
5.字符串 和 空元組 相同的情況下,地址相同
6.列表,元組,字典,集合無論什么情況 id標識都不同 [空元組例外]
# 在不同的文件當中
小數據池 ; 比如整型默認開辟 -5~256 這么多數據提前在內存中駐留

 


免責聲明!

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



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