python面試_總結02_代碼題


- 代碼題

1、創建一個函數,接收一個字符串參數,判斷其做為Python標識符是否合法。

具體要求:

  • 如果合法則輸出 True,否則輸出 False。
  • 如果該字符串與Python內置的關鍵字,或Bifs沖突,則打印'conflict'
  • 注: Python標識符的規則,關鍵字和Bifs可搜索得到
import keyword, string
print(keyword.kwlist)
print()
print(string.ascii_letters)
print()
print(string.digits)
['False', 'None', 'True', 'and', 'as', 'assert', 'async', 'await', 'break', 'class', 'continue', 'def', 'del', 'elif', 'else', 
'except', 'finally', 'for', 'from', 'global', 'if', 'import', 'in', 'is', 'lambda', 'nonlocal', 'not', 'or', 'pass', 'raise',
'return', 'try', 'while', 'with', 'yield'] abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ 0123456789

import keyword, string

def Identifier(s):
    kw = keyword.kwlist # 內置關鍵字
    # 請用if-else完成檢測,打印conflict或者False
    # your code here
    
    # 標識符命名規范
    # 1.數字,下划線,字母構成
    # 2.避開關鍵字,這里s != kw
    # 3.不能用數字開頭
    
    # 不能是關鍵字
    if s in kw:
        print(s, "標識符不能是關鍵字")
        return False
    # 開頭必須是字母或者下划線
    elif s[0] == "_" or s[0] in string.ascii_letters:
        # 除開頭以外,必須是數字+下划線+字母
        for i in s[1:]:
            if (i == "_") or (i in string.digits) or (i in string.ascii_letters):
                pass
            else:
                print(s, "既不是關鍵字,開頭也合法,但是后面有非法字符")
                return False
        print(s, "合法的標識符")
        return True
    else:
        print(s, "不是關鍵字,開頭已經不合法(后面不曉得)")
        return False
    

print("01", Identifier("list"))
print("02", Identifier("abc#"))
print("03",Identifier("1a"))
list 合法的標識符
01 True
abc# 既不是關鍵字,開頭也合法,但是后面有非法字符
02 False
1a 不是關鍵字,開頭已經不合法(后面不曉得)
03 False

2、編寫一個函數,能生成包含20個隨機整數的列表,然后將前10個元素升序排列,后10個元素降序排列,並分別打印輸出

提示:本題考察對列表的切片和排序操作,注意切片下標。

import random
def sort2part():
    # 用random生成20個隨機數並完成本題要求
    # your code here
    # 創建一個列表用於保存隨機數
    total_list = []
    list_asc = []
    list_dec = []
    # 1、生成20個隨機數
    for i in range(20):
        total_list.append(random.randint(1, 20))
    print("生成的隨機數列表是這個樣子:", total_list)
    # 2、對列表進行切片
    list_asc = total_list[:10]
    list_dec = total_list[10:]
    print("切片后前10的列表:", list_asc)
    print("切片后后10的列表:", list_dec)
    
    assert len(list_asc) + len(list_dec) == len(total_list), "長度需要滿足一致"
    
    # 3、分別進行排序
    list_asc = sorted(list_asc)
    list_dec = sorted(list_dec, reverse=True)
    print("升序后前10的列表:", list_asc)
    print("降序后后10的列表:", list_dec)

    return 

sort2part()

 

 3、有一分數序列為:2/1,3/2,5/3,8/5,13/8,21/13,  請使用Python代碼生成,並打印該數列的前30(演示代碼取5項)項,並求和返回

提示:觀察分數的分子和分母,每1項都和前2項有關系,也可檢索“斐波那契數列”

# 顯示分數的包
import fractions
from functools import reduce

def fab(max_num): 
    # 完成分子分母的生成並計算求和返回結果
    # your code here
    
    # 創建列表保存數據
    _list = []
    
    # 1、首先生成斐波那契數列
    a = 1  # 注意這里a從1開始
    b = 1
    for i in range(max_num):
        # a是分母,b是分子
        a, b = b, a + b
        '''
        上式等同於下面3式:
        temp = b
        b = a + b
        a = temp
        '''
        # print("a = ", a, "b = ", b)
        
        # 2、生成分數
        _list.append(fractions.Fraction(b, a))
        # _list.append(b / a)

    print("看一眼生成的列表長啥樣:", _list)
    # 分數要遍歷才能打印...
    for elm in _list:
        print(elm)

    assert len(_list) == max_num, "長度一致"
    
    # 3、求前30項的和
    sum_ = reduce(lambda x, y: x + y, _list)
    return sum_

print("該數列的前5項和: ",fab(5))
看一眼生成的列表長啥樣: [Fraction(2, 1), Fraction(3, 2), Fraction(5, 3), Fraction(8, 5), Fraction(13, 8)]
2
3/2
5/3
8/5
13/8
該數列的前5項和:  1007/120


4、BMI編寫

身體質量指數(BMI)是根據人的體重和身高計算得出的一個數字,BMI是可靠的身體肥胖指標,其計算公式:BMI = Weight / High2,其中體重單位為公斤,身高單位為米。

  • 計算公式為:BMI=kg÷ 2m

  • 提示用戶輸入體重(kg)和身高的數字(m)(注意單位),然后計算BMI。

  • 根據BMI指數范圍,定義當前健康狀態。BMI指數在18至25之間定義為健康的標准體重, 小於該范圍定義為偏瘦,超過該范圍定義為偏重。

  • 將BMI指數和其所代表狀態輸出

weight = float(input('請輸入您的體重:'))
high = float(input('請輸入您的身高:'))
# 完成BMI計算並返回結果提示信息
# your code here
high = high / 100
BMI = weight / (high ** 2)

if 18 <= BMI <= 25:
    print("您的身體質量指數是:%.2f, 很健康哦" % BMI)
elif BMI < 18:
    print("您的身體質量指數是:%.2f, 有些偏瘦哦" % BMI)
else:
    print("您的身體質量指數是:%.2f, 你這個胖紙" % BMI)
請輸入您的體重:65
請輸入您的身高:173
您的身體質量指數是:21.72, 很健康哦

5、字符統計

  • 創建一個函數,接收字符串輸入,分別統計出其中英文字母、空格、數字和其它字符的個數后打印。
  • 提示:
    • ord('a') 能將字符 'a' 轉化為 ASCII 碼表上對應的數值
    • 例如,空格為32
    • 數字 0-9 對應的碼值為 48-57
    • 大寫字母 A-Z 對應 65-90
    • 小寫字母 a-z 對應 97-122
    • 比122高的都是其它。
def str_count(s):  
    # 完成對應要求的統計,並返回對應的數量
    # your code here

    # 初始化計數變量
    count_s, count_z, count_a, count_o = 0, 0, 0, 0
    for i in s:
        # 得到對應ASCII碼的數值
        num_asc = ord(i)
        if num_asc == 32:
            count_s += 1
        elif 48 <= num_asc <= 57:
            count_z += 1
        elif 65 <= num_asc <= 90 or 97 <= num_asc <= 122:
            count_a += 1
        elif num_asc > 122:
            count_o += 1
#     assert (count_s + count_z + count_a + count_o) == total_num, "最終個數相符"
    
    print("空格個數:%d個" % count_s)  
    print("數字個數:%d個" % count_z)
    print("英文字母個數:%d個" % count_a)
    print("其他字符個數:%d個" % count_o)  
    
str_count("我是xiao ming ming, 今年27歲")
空格個數:3個
數字個數:2個
英文字母個數:12個
其他字符個數:5個

 6、創建一個函數,可以將去除給定列表中中相鄰且重復的元素(只保留一個)后,打印輸出結果。

  • 說明
    • 輸入參數為 l1 = [1,2,3,4,4,4,4,4,4,5,6,6,8,8,12,12,12,12,13]
    • 操作后,保證原有整體排序不變,僅處理相鄰且重復的元素
    • 請勿使用set
def remove_same(ll):
    # 完成題目要求的任務,並返回結果
    # your code here
    # 逆序,這樣就不會出現下標溢出的情況
    for i in range(len(ll) - 1, 0, -1):
        # print("現在到了第%d步" % i)
        print(ll)
        if ll[i] == ll[i-1]:
            # 刪除相鄰且重復的元素
            del ll[i]
    return ll
    
lst = [4,4,5,6,5,6,6,8,7,8,12,12]
# lst = [1,1,2,3,4,4,4,4,4,4,5,6,6,8,8,12,12,12,12,13]
# lst1 = [1,2,3,4,4,4,4,4,4,5,6,6,8,8,12,12,12,12,13, 4, 8, 4, 12, 13, 13, 17, 3, 3, 3]

print(remove_same(lst))
[4, 4, 5, 6, 5, 6, 6, 8, 7, 8, 12, 12]
[4, 4, 5, 6, 5, 6, 6, 8, 7, 8, 12]
[4, 4, 5, 6, 5, 6, 6, 8, 7, 8, 12]
[4, 4, 5, 6, 5, 6, 6, 8, 7, 8, 12]
[4, 4, 5, 6, 5, 6, 6, 8, 7, 8, 12]
[4, 4, 5, 6, 5, 6, 6, 8, 7, 8, 12]
[4, 4, 5, 6, 5, 6, 8, 7, 8, 12]
[4, 4, 5, 6, 5, 6, 8, 7, 8, 12]
[4, 4, 5, 6, 5, 6, 8, 7, 8, 12]
[4, 4, 5, 6, 5, 6, 8, 7, 8, 12]
[4, 4, 5, 6, 5, 6, 8, 7, 8, 12]
[4, 5, 6, 5, 6, 8, 7, 8, 12]

7、創建一個函數,接收一個由整數組成的列表(需對輸入列表做檢查,長度最少為2, 數據類型為整型),並檢驗后下列條件后輸出:

  • 如列表是升序排列的,則輸出"ASC";
  • 如列表是降序排列的,則輸出"DESC";
  • 如列表無序,則輸出"WRONG"。
def check_data(l):
    # 請完成題目要求的任務,並輸出對應信息
    # your code here
    # 得到列表的總長度
    count = len(l)
    if count < 2:
        print("長度不夠,短拒")
        return None
    # 判斷數據類型是否位int
    for i in range(count):
        if not isinstance(l[i], int):
            print("數據類型有非int型")
            return None
    # 判斷是否是升序
    if sorted(l) == l:
        print("ASC")
    # 判斷是否降序
    elif sorted(l, reverse=True) == l:
        print("DESC")
    # 無序
    else:
        print("WRONG")
    

check_data([1])
check_data([1,"2"])
check_data([1,2,3,4])
check_data([4,3,2,1])
check_data([1,3,2,4])
長度不夠,短拒
數據類型有非int型
ASC
DESC
WRONG

 8、高階函數綜合運用

l1=[1,3,6,8,10,11,17]

請僅使用map,reduce,filter對上方數組依次進行如下三次操作:

  • 剔除掉所有的偶數后打印

  • 對剩下的數字每個數字進行平方后打印

  • 對數組求和后打印

# 剔除掉所有的偶數后打印
# your code here
l1=[1,3,6,8,10,11,17]
print("原始的l1:", l1)

def f(x):
    return x % 2 != 0

l1 = list(filter(f, l1))
print("剔除偶數后的l1:", l1)
原始的l1: [1, 3, 6, 8, 10, 11, 17]
剔除偶數后的l1: [1, 3, 11, 17]
# 對剩下的數字每個數字進行平方后打印
# your code here
print("現在的l1:", l1)

l1 = list(map(lambda x: x ** 2, l1))
print("求平方后的l1:", l1)
現在的l1: [1, 3, 11, 17]
求平方后的l1: [1, 9, 121, 289]
# 對數組求和后打印
# your code here
print("現在的l1:", l1)

# 對數組中國的數求和
from functools import reduce

l1_sum = reduce(lambda x, y: x + y, l1)
print("所求數字之和:", l1_sum)
現在的l1: [1, 9, 121, 289]
所求數字之和: 420

9、Python類設計

設計一個公司類,完成以下要求,並實例化不同對象進行驗證

類變量

  • 類下公司的總個數,類下公司實例的名稱列表

類方法

  • 返回公司類共有多少個公司實例
  • 返回公司類的公司實例有名稱列表

實例變量

  • 公司名,簡介,利潤,銷售額,總成本,雇員姓名列表,雇員詳細信息列表(這里可能會考察到*號對參數解包)

實例方法:

  • 招聘人才(每招一個人會有成本產生,影響該實例雇員列表、人數、總成本,默認成本cost=10000)
  • 解雇人員(每解雇一個人會有成本產生,影響該實例雇員列表、人數 、總成本,默認成本cost=5000)
  • 公司廣告推廣(影響該實例總成本,自定義成本cost)
  • 交社保(按公司雇員總人數計算,影響該實例總成本,默認單人社保繳納1000)
  • 交稅(按公司雇員總人數計算,影響該實例總成本,默認單人稅費繳納500)
  • 銷售(按銷售件數*價格計算銷售額,利潤按銷售額*利潤率進行計算利潤。默認利潤率50%)
  • 獲取公司雇員列表
  • 獲取公司凈利潤

提示:具體的函數方法與變量定義,請參考下述實例化代碼確定。初始化雇員的地方,大家看到調用的時候會包含年齡等信息,這里可能會用到不定長參數輸入,詳細可以參考python參數說明(https://blog.csdn.net/qinyilang/article/details/5484415)

class Company(object):
    # 完成題目對應的要求
    # your code here

    # 類變量: 類下公司的總個數,類下公司實例的名稱列表
    companyNum = 0
    companyList = []

    def __init__(self, companyName, brief, profit=0, sale_=0, cost=0, name_list=[], *args):
        '''
        實例變量
        公司名,簡介,利潤,銷售額,總成本,雇員姓名列表,雇員詳細信息列表(這里可能會考察到*號對參數解包)
        '''
        # 公司名
        self.companyName = companyName
        # 簡介
        self.brief = brief
        # 利潤,銷售額,總成本,雇員姓名列表,雇員詳細信息列表
        self.profit = profit
        self.sale_ = sale_
        self.cost = cost
        self.name_list = name_list
        # self.name_detail = name_detail

        # 每實例化一個對象,公司數+1
        Company.companyNum += 1
        # 每實例化一個對象,公司實例的名稱列表追加一個公司名
        Company.companyList.append(self.companyName)

    def recruit(self, name, age, cost=10000):
        '''
        招聘人才
        每招一個人會有成本產生,影響該實例雇員列表、人數、總成本,默認成本cost=10000
        '''
        self.name_list.append(name)
        self.cost += cost
        # self.name_detail.append(age)

    def dismiss(self, name, cost=5000):
        '''
        解雇人員
        每解雇一個人會有成本產生,影響該實例雇員列表、人數 、總成本,默認成本cost=5000
        '''
        self.name_list.remove(name)
        self.cost -= cost

    def adPromotion(self, cost):
        '''
        公司廣告推廣
        影響該實例總成本,自定義成本cost
        '''
        self.cost += cost

    def payInsurance(self):
        '''
        交社保
        按公司雇員總人數計算,影響該實例總成本,默認單人社保繳納1000
        '''
        self.cost -= 1000 * len(self.name_list)

    def payTax(self):
        '''
        交稅
        按公司雇員總人數計算,影響該實例總成本,默認單人稅費繳納500
        '''
        self.cost -= 500 * len(self.name_list)

    def sale(self, num, price):
        '''
        銷售
        按銷售件數*價格計算銷售額,利潤按銷售額*利潤率進行計算利潤。默認利潤率50%
        '''
        # 銷售額
        self.sale_ = num * price
        # 利潤
        self.profit += self.sale_ * 0.5

    def getEmployeeList(self):
        '''
        獲取公司雇員列表
        '''
        return self.name_list

    def getProfit(self):
        '''
        獲取公司凈利潤
        '''
        # 利潤 = 收入 - 支出
        # 收入
        return self.profit - self.cost

    # 類方法
    # 返回公司類共有多少個公司實例
    # 返回公司類的公司實例有名稱列表
    @classmethod
    def Company_num(cls):
        return len(cls.name_list)

    @classmethod
    def Company_list(cls):
        return cls.name_list
#功能驗證
c0 = Company('網易','高科技互聯網公司')
c0.recruit('張三',18, cost=20000)
c0.recruit('王五',20, cost=10000)
print('{}公司員工詳細信息列表:{}'.format(c0.companyName, c0.getEmployeeList()))

c0.dismiss('王五')

c0.adPromotion(5000)
c0.payInsurance()
c0.payTax()
c0.sale(50,100)
print('{}公司員工詳細信息列表:{}'.format(c0.companyName, c0.getEmployeeList()))
print('{}公司當前利潤:{}'.format(c0.companyName, c0.getProfit()))

c1 = Company('百度','搜索引擎')
c1.recruit('李四',30, cost=50000)
c1.recruit('趙六',50, cost=40000)
print('{}公司員工詳細信息列表:{}'.format(c1.companyName, c1.getEmployeeList()))

print('公司名列表:',Company.companyList)
print('公司總個數:',Company.companyNum)
網易公司員工詳細信息列表:['張三', '王五']
網易公司員工詳細信息列表:['張三']
網易公司當前利潤:-26000.0
百度公司員工詳細信息列表:['張三', '李四', '趙六']
公司名列表: ['網易', '百度']
公司總個數: 2

10、結合PIL庫,制作一個能生成5位隨機數驗證碼圖片的函數

生成5位隨機數驗證碼並存儲為verify.png名稱的圖片。

提示:PIL庫的使用方法可以參考python中PIL庫的使用PIL庫簡易教程與驗證碼生成

%matplotlib inline
from PIL import Image
from PIL import ImageDraw
from PIL import ImageFont
from PIL import ImageFilter

import random
# 完成題目指定的任務
# your code here

# 隨機ASCII碼生成數字
def rndChar():
    return chr(random.randint(48, 57)) # 0-9的ASCII碼是48-57

# 隨機顏色1:
def rndColor():
    return (random.randint(64, 255), random.randint(64, 255), random.randint(64, 255))

# 隨機顏色2:
def rndColor2():
    return (random.randint(32, 127), random.randint(32, 127), random.randint(32, 127))

# 300 x 60:
num = 5  # 生成num位的驗證碼
width = 60 * num  # 圖寬
height = 60
image = Image.new('RGB', (width, height), (255, 255, 255))
# 創建Font對象:
font = ImageFont.truetype('Arial.ttf', 36)
# 創建Draw對象:
draw = ImageDraw.Draw(image)
# 填充每個像素:
for x in range(width):
    for y in range(height):
        draw.point((x, y), fill=rndColor())
# 輸出文字:
for t in range(num):
    draw.text((60 * t + 10, 10), rndChar(), font=font, fill=rndColor2())
# 模糊:
image = image.filter(ImageFilter.BLUR)
image.save("verify.png", "jpeg")














免責聲明!

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



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