python面試題二:Python 基礎題


1.位和字節的關系?

Byte 字節

bit 位

1Byte = 8bit

2.b、B、KB、MB、GB 的關系?

1Byte = 8bit

KB 1KB=1024B

MB 1MB=1024KB

GB 1GB=1024MB

TB 1TB=1024GB

3.請至少列舉5個 PEP8 規范(越多越好)。

       一、代碼編排

       1 縮進。4個空格的縮進(編輯器都可以完成此功能),不使用Tap,更不能混合使用Tap和空格

       2 每行最大長度79,換行可以使用反斜杠,最好使用圓括號。換行點要在操作符的后邊敲回車。

       3 類和top-level函數定義之間空兩行;類中的方法定義之間空一行;函數內邏輯無關段落之間空一行;其他地方盡量不要再空行。

      二、文檔編排

      1 模塊內容的順序:模塊說明和docstring—import—globals&constants—其他定義。其中import部分,又按標准、三方和自己編寫順序依次排放,之間空一行。

      2 不要在一句import中多個庫,比如import os, sys不推薦。

      3 如果采用from XX import XX引用庫,可以省略‘module.’,都是可能出現命名沖突,這時就要采用import XX。

    三、空格的使用

      1 各種右括號前不要加空格。
      2 逗號、冒號、分號前不要加空格。
      3 函數的左括號前不要加空格。如Func(1)。
      4 序列的左括號前不要加空格。如list[2]。
      5 操作符左右各加一個空格,不要為了對齊增加空格。
      6 函數默認參數使用的賦值符左右省略空格。
      7 不要將多句語句寫在同一行,盡管使用‘;’允許。
      8 if/for/while語句中,即使執行語句只有一句,也必須另起一行。

  四 注釋

      1.函數注釋

       """

       功能說明

       參數 名稱  類型

       return

       """

      2.變量注釋

       #注釋

      3.類型注解

       https://www.cnblogs.com/yinzhengjie/p/10971296.html

4.通過代碼實現如下轉換:

        二進制轉換成十進制:v = “0b1111011”


       

int(a,2)

        十進制轉換成二進制:v = 18


bin(v)

        八進制轉換成十進制:v = “011”


a = bin(v)
b = int(a,2)

       十進制轉換成八進制:v = 30


oct(v)

       十六進制轉換成十進制:v = “0x12”


a = bin(v)
b = int(a,2)

       十進制轉換成十六進制:v = 87

hex(v)

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

如 10.3.9.12 轉換規則為:
        10            00001010

         3            00000011

         9            00001001

        12            00001100

再將以上二進制拼接起來計算十進制結果:00001010 00000011 00001001 00001100 = ?

 

6.python遞歸的最大層數?

import sys
sys.setrecursionlimit(100000)

def foo(n):
    print(n)
    n += 1
    foo(n)
        
if __name__ == '__main__':
    foo(1)

 

7.求結果:

    v1 = 1 or 3
  # 1
    v2 = 1 and 3
 # 3
    v3 = 0 and 2 and 1 # 0

    v4 = 0 and 2 or 1 # 1

    v5 = 0 and 2 or 1 or 4 # 1

    v6 = 0 or False and 1 # False

 

8.ascii、unicode、utf-8、gbk 區別?

美國制定了一套字符編碼,對英文字符與二進制之間做了聯系,這被稱為ASCII碼,一直沿用至今。

ASCII碼一共規定了128個字符,比如SPACE是32,A是65,這128個符號只咱用了一個字節的后面七位,最前面的一位統一規定為0。

 

GBK編碼是對GB2312的擴展,完全兼容GB2312。采用雙字節編碼方案,剔出xx7F碼位,共23940個碼位,共收錄漢字和圖形符號21886個,GBK編碼方案於1995年12月15日發布。它幾乎完美支持漢字,因此經常會遇見GBK與Unicode的轉換。

 

將世界上所有的符號都納入其中,每一種符號都給予獨一無二的編碼,那么亂碼問題就不會存在了。因此,產生了Unicode編碼,這是一種所有符號的編碼。

UTF8就是在互聯網中使用最多的對Unicode的實現方式

UTF8編碼規則只有兩條:

1)對於單字節的符號,字節的第一位設為0,后面的7位為這個符號的Unicode碼。因此,對於英文字母,UTF8編碼和ASCII編碼是相同的。

2)對於非單字節(假設字節長度為N)的符號,第一個字節的前N位都設為1,第N+1設為0,后面字節的前兩位一律設為10,剩下的沒有提及的二進制,全部為這個符號的Unicode碼。

10.用一行代碼實現數值交換:

     
 a = 1
 
     b = 2

a,b = b,a

 

11.列舉布爾值為False的常見值?

為0的,空集合,空字符串,空值None

12.字符串、列表、元組、字典每個常用的5個方法?

 

13.pass的作用?

占位符

14.is和==的區別

Python中對象包含的三個基本要素,分別是:id(身份標識)、type(數據類型)和value(值)。

==是python標准操作符中的比較操作符,用來比較判斷兩個對象的value(值)是否相等

is也被叫做同一性運算符,這個運算符比較判斷的是對象間的唯一身份標識,也就是id是否相同

15.Python的可變類型和不可變類型?

可變類型:列表、字典、數組、集合

不可變:數字,字符串,元組

16.求結果

   v = dict.fromkeys(['k1','k2'],[])
 
   v[‘k1’].append(666)

   print(v)


   v = dict.fromkeys(['k1','k2'],[])
 
   v[‘k1’].append(666) 

   print(v)
# {‘k1’:[666],'k2':[666]}
   v[‘k1’] = 777

   print(v)# {‘k1’:777,'k2':[666]}

17 求結果:

 

18 列舉常見的內置函數?

id(),dir(),dict(),zip(),set(),list(),int(),str(),print(),enumerate(),all(),any(),eval(),format(),getattr(),hasattr(),len(),map(),next(),range(),setatrr(),tuple()

20 一行代碼實現9*9乘法表

for i in range(1,10):
    for j in range(1,i+1):
        print('%s * %s =  %s  ' %(i,j,i*j),end="")
    print()
 
print('\n'.join(['\t'.join(["%2s*%2s=%2s"%(j,i,i*j) for j in range(1,i+1)]) for i in range(1,10)]))

 

21 至少列舉8個常用模塊都有那些?

os,time,re,datetime,requests,thread,multiprocessing,gevent,

22 re的match和search區別?

match 從字符串頭部開始匹配

search 從字符串任意位置開始匹配

23 什么是正則的貪婪匹配?

貪婪模式也就是我們使用 .* 匹配任意字符時會盡可能長地向后匹配,如果我們想阻止這種貪婪模式,需要加個問號,盡可能少地匹配,如下例子:

In [1]: import re

In [2]: html = '<h1> hello world </h1>'    

In [3]: re.findall(r'<.*>', html)    # 貪婪模式默認匹配到所有內容
Out[3]: ['<h1> hello world </h1>']

In [4]: re.findall(r'<.*?>', html)   # 我們只想匹配兩個標簽的內容,可以加上問號來阻止貪婪模式
Out[4]: ['<h1>', '</h1>']

 

24 求結果:


a. [ i % 2 for i in range(10) ]


b. ( i % 2 for i in range(10) )

a. [ i % 2 for i in range(10) ]
 # [0,1,0,1,0,1,0,1,0,1]

b. ( i % 2 for i in range(10) ) # 生成器

 

25 求結果:


a. 1 or 2
 # 1

b. 1 and 2
 # 2

c. 1 < (2==2)
 # False

d. 1 < 2 == 2 # True

Python能夠正確處理這個鏈式對比的邏輯。回到最開始的問題上, = =等於符號和 <小於符號,本質沒有什么區別。所以實際上 2==2>1也是一個鏈式對比的式子,它相當於 2==2and2>1。此時,這個式子就等價於 TrueandTrue。所以返回的結果為True。

注:True相當於1,False相當於0

26 def func(a,b=[]) 這種寫法有什么坑?

def func(a,b=[]):
    b.append(a)
    print(b)
func(1)
func(1)
func(1)
func(1)
復制代碼

看下結果

  [1]
  [1, 1]
  [1, 1, 1]
  [1, 1, 1, 1]

函數的第二個默認參數是一個list,當第一次執行的時候實例化了一個list,第二次執行還是用第一次執行的時候實例化的地址存儲,所以三次執行的結果就是 [1, 1, 1] ,想每次執行只輸出[1] ,默認參數應該設置為None。

27 如何實現 “1,2,3” 變成 [‘1’,’2’,’3’] ?

[i for i in a.split(',')]

28 如何實現[‘1’,’2’,’3’]變成[1,2,3] ?

[int(i) for i in ['1','2','3']]

29 比較: a = [1,2,3] 和 b = [(1),(2),(3) ] 以及 b = [(1,),(2,),(3,) ] 的區別?

30 如何用一行代碼生成[1,4,9,16,25,36,49,64,81,100] ?

[i**2 for i in range(1,11)]

31 一行代碼實現刪除列表中重復的值 ?

set(alist)

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

global a

33 logging模塊的作用?以及應用場景?

logging模塊定義的函數和類為應用程序和庫的開發實現了一個靈活的事件日志系統。

開發應用程序或部署開發環境時,可以使用DEBUG或INFO級別的日志獲取盡可能詳細的日志信息來進行開發或部署調試;

應用上線或部署生產環境時,應該使用WARNING或ERROR或CRITICAL級別的日志來降低機器的I/O壓力和提高獲取錯誤日志信息的效率。

日志級別的指定通常都是在應用程序的配置文件中進行指定的。

34 請用代碼簡答實現stack 。

class Stack(object):
    def __init__(self):
        self.stack = []
        
    def push(self, value): # 進棧
        self.stack.append(value)
        
    def pop(self):  # 出棧
        if self.stack :
            self.stack.pop()
        else:
            raise LookupError("stack is empty")
        
    def is_empty(self):  # 如果棧為空
        return bool(self.stack)
    
    def top(self):
        # 取出目前stack中最新的元素
        return self.stack[-1]

 

35 常用字符串格式化哪幾種?

% 格式符

.format()

36 簡述 生成器、迭代器、可迭代對象 以及應用場景?

可迭代對象:可以通過for ... in ...這類語句迭代讀取一條數據的對象(具備__iter__方法的對象)

迭代器:一個實現了__iter__方法和__next__方法的對象,就是迭代器

生成器:一類特殊的迭代器

創建生成器的方法:a.將[]變為() b.在def 中有yield關鍵字的稱為生成器(使用send喚醒)

37 用Python實現一個二分查找的函數。

def binary_chop(alist, data):
    """
    非遞歸解決二分查找
    :param alist:
    :return:
    """
    n = len(alist)
    first = 0
    last = n - 1
    while first <= last:
        mid = (last + first) // 2
        if alist[mid] > data:
            last = mid - 1
        elif alist[mid] < data:
            first = mid + 1
        else:
            return True
    return False

if __name__ == '__main__':
    lis = [2,4, 5, 12, 14, 23]
    if binary_chop(lis, 14):
        print('ok')

38 os和sys模塊的作用?

39 如何生成一個隨機數?

import random
random.randint(1,100)
random.random()

random.choice(['剪刀', '石頭', '布'])

40 如何使用python刪除一個文件?

os.remove() 方法用於刪除指定路徑的文件。如果指定的路徑是一個目錄,將拋出OSError。

os.removedirs() 方法用於遞歸刪除目錄。像rmdir(), 如果子文件夾成功刪除, removedirs()才嘗試它們的父文件夾,直到拋出一個error(它基本上被忽略,因為它一般意味着你文件夾不為空)。

os.rmdir() 方法用於刪除指定路徑的目錄。僅當這文件夾是空的才可以, 否則, 拋出OSError。

os.unlink() 方法用於刪除文件,如果文件是一個目錄則返回一個錯誤。

 

41 談談你對面向對象的理解?

42 面向對象深度優先和廣度優先是什么?

43 面向對象中super的作用?

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

45 列舉面向對象中帶爽下划線的特殊方法,如:__new__、__init__

46 如何判斷是函數還是方法?

47 列舉面向對象中的特殊成員以及應用場景

48 1、2、3、4、5 能組成多少個互不相同且無重復的三位數

60個

49 什么是反射?以及應用場景?

50 什么是面向對象的mro

51 異常處理寫法?以及如何主動拋出異常?(應用場景)自定義異常代碼

異常處理寫法

(1)第一種寫法

需要注意的是 在拋出異常的時候,HTTPError必須寫在URLError之前,因為只有這樣前者才能拋出異常,不然的話就會被后者攔截,提前拋出異常。 

from urllib.request import Request,urlopen
from urllib.error import URLError,HTTPError
#請求某一個地址
req = Request(someurl)
try:
    response = urlopen(req)
except HTTPError as e:
    print("The server conldn\'t fulfill the request.")
except URLError as e:
    print('We failed to reach a server.')
    print('reason:',e.reason)
else:
    #everything is fine

(2)第二種寫法

from urllib.request import Request,urlopen
from urllib.error import URLError
#請求某一個地址
req = Request("http://xx.baidu.com")
try:
    response = urlopen(req)
except URLError as e:
    if hasattr(e,'reason'):
        print("We failed to reach a server")
    elif hasattr(e,'code'):
        print("The server couldn\'t ful fill the request.")
    else:
        print("everything is fine")
#hasattr判斷是否擁有這個屬性,如果有的話就打印,如果沒有判斷下一個,建議使用第二個拋異常方法。

主動拋出異常

格式:
主動拋出異常終止程序
raise 異常名稱('異常描述')

raise RuntimeError('testError')

自定義異常代碼

python的異常分為兩種.
1、內建異常,就是python自己定義的異常。
2、不夠用,用戶自定義異常,
首先看看python的異常繼承樹


 
 

我們可以看到python的異常有個大基類。然后繼承的是Exception。所以我們自定義類也必須繼承Exception。

#最簡單的自定義異常
class FError(Exception):
    pass

拋出異常、用try-except拋出

try:
    raise FError("自定義異常")
except FError as e:
    print(e)

52 isinstance作用以及應用場景?

判斷變量類型

53 json序列化時,可以處理的數據類型有哪些?如何定制支持datetime類型?

字典以及列表

自定義時間序列化轉換器
import json
from json import JSONEncoder
from datetime import datetime
class ComplexEncoder(JSONEncoder):
    def default(self, obj):
        if isinstance(obj, datetime):
            return obj.strftime('%Y-%m-%d %H:%M:%S')
        else:
            return super(ComplexEncoder,self).default(obj)
d = { 'name':'alex','data':datetime.now()}
print(json.dumps(d,cls=ComplexEncoder))
# {"name": "alex", "data": "2018-05-18 19:52:05"}

 

54 json序列化時,默認遇到中文會轉換成unicode,如果想要保留中文怎么辦?

import json
a=json.dumps({"ddf":"你好"},ensure_ascii=False)
print(a) #{"ddf": "你好"}

55 什么是斷言?應用場景?

Python的assert是用來檢查一個條件,如果它為真,就不做任何事。如果它為假,則會拋出AssertError並且包含錯誤信息。例如:

x = 23
assert x > 0, "x is not zero or negative"
assert x%2 == 0, "x is not an even number"

斷言應該用於:

  防御型的編程
  運行時檢查程序邏輯
  檢查約定
  程序常量
  檢查文檔

56 有用過with statement嗎?它的好處是什么?

with語句的作用是通過某種方式簡化異常處理,它是所謂的上下文管理器的一種

 with open('output.txt', 'w') as f:
        f.write('Hi there!')

當你要成對執行兩個相關的操作的時候,這樣就很方便,以上便是經典例子,with語句會在嵌套的代碼執行之后,自動關閉文件。這種做法的還有另一個優勢就是,無論嵌套的代碼是以何種方式結束的,它都關閉文件。如果在嵌套的代碼中發生異常,它能夠在外部exception handler catch異常前關閉文件。如果嵌套代碼有return/continue/break語句,它同樣能夠關閉文件。

57 使用代碼實現查看列舉目錄下的所有文件。

import re

import os

import time

 

def print_files(path):

    lsdir = os.listdir(path)

    dirs = [i for i in lsdir if os.path.isdir(os.path.join(path, i))]    if dirs:

        for i in dirs:

            print_files(os.path.join(path, i))

    files = [i for i in lsdir if os.path.isfile(os.path.join(path,i))]

    #for f in files:  #列出所有文件(包括子目錄下的文件)

    for f in dirs:    #列出所有目錄(包括子目錄下的目錄)

        sss = (os.path.join(path, f))

        if os.path.isdir(sss): #判斷路徑是否為目錄

            print (sss)  

    return

 

print_files('/test/test1/'#列出'/test/test1/'目錄下的所有文件或目錄(包括子目錄)

58 簡述 yield和yield from關鍵字。

簡單地說,yield from  generator 。實際上就是返回另外一個生成器

def generator1():
    item = range(10)
    for i in item:
        yield i

def generator2():
    yield 'a'
    yield 'b'
    yield 'c'
    yield from generator1() #yield from iterable本質上等於 for item in iterable: yield item的縮寫版
    yield from [11,22,33,44]
    yield from (12,23,34)
    yield from range(3)

for i in generator2() :
    print(i)

從上面的代碼可以看書,yield from 后面可以跟的式子有“ 生成器  元組 列表等可迭代對象以及range()函數產生的序列”

 59 python 獲取當前日期

1.先導入庫:import datetime

2.獲取當前日期和時間:now_time = datetime.datetime.now()

3.格式化成我們想要的日期:strftime()

比如:“2016-09-21”:datetime.datetime.now().strftime('%Y-%m-%d')

4.在當前時間增加1小時:add_hour=datetime.datetime.now()+datetime.timedelta(hours=1)   #需要導入timedelta庫

格式“小時”:now_hour=add_hour.strftime('%H')

5.時間的三種存在方式:時間對象,時間字符串,時間戳。

(1)字符串轉datetime:
>>> string = '2014-01-08 11:59:58'
>>> time1 = datetime.datetime.strptime(string,'%Y-%m-%d %H:%M:%S')
>>> print time1
2014-01-08 11:59:58

(2)datetime轉字符串:
>>> time1_str = datetime.datetime.strftime(time1,'%Y-%m-%d %H:%M:%S')
>>> time1_str
'2014-01-08 11:59:58'

(3)時間戳轉時間對象:

>>>time1 = time.localtime()

>>>time1_str = datetime.datetime.fromtimestamp(time1)

6.格式參數:

%a 星期幾的簡寫
%A 星期幾的全稱
%b 月分的簡寫
%B 月份的全稱
%c 標准的日期的時間串
%C 年份的后兩位數字
%d 十進制表示的每月的第幾天
%D 月/天/%e 在兩字符域中,十進制表示的每月的第幾天
%F 年-月-%g 年份的后兩位數字,使用基於周的年
%G 年分,使用基於周的年
%h 簡寫的月份名
%H 24小時制的小時
%I 12小時制的小時
%j 十進制表示的每年的第幾天
%m 十進制表示的月份
%M 十時制表示的分鍾數
%n 新行符
%p 本地的AM或PM的等價顯示
%r 12小時的時間
%R 顯示小時和分鍾:hh:mm
%S 十進制的秒數
%t 水平制表符
%T 顯示時分秒:hh:mm:ss
%u 每周的第幾天,星期一為第一天 (值從0到6,星期一為0)
%U 第年的第幾周,把星期日做為第一天(值從0到53)
%V 每年的第幾周,使用基於周的年
%w 十進制表示的星期幾(值從0到6,星期天為0)
%W 每年的第幾周,把星期一做為第一天(值從0到53)
%x 標准的日期串
%X 標准的時間串
%y 不帶世紀的十進制年份(值從0到99)
%Y 帶世紀部分的十制年份
%z,%Z 時區名稱,如果不能得到時區名稱則返回空字符。
%% 百分號

  60 將“hello world” 轉換為首字母大寫“Hello World”

captilize()

61 檢測字符串是否只含有數字

str.isdigit()

62 打亂一個列表的元素

# shuffle()使用樣例
import random

x = [i for i in range(10)]
print(x)
random.shuffle(x)
print(x)

 63 獲取指定日期的前N天日期和后N天日期

#encoding:utf-8
from datetime import date, datetime, timedelta

day = date.today()
now = datetime.now()
delta = timedelta(days=5)
n_days_after = now + delta
n_days_forward = now - delta
print(("當前日期:{}").format(day))
print("向后推遲5天的日期:{}".format(n_days_after.strftime('%Y-%m-%d')))
print("向前推5天的日期:{}".format(n_days_forward.strftime('%Y-%m-%d')))

 64 簡述any()和all()方法

#any(x)判斷x對象是否為空對象,如果都為空、0、false,則返回false,如果不都為空、0、false,則返回true

#all(x)如果all(x)參數x對象的所有元素不為0、''、False或者x為空對象,則返回True,否則返回False

 


免責聲明!

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



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