面試題(二)


1、什么是lambda函數?它有什么好處?另外python在函數編程方面提供了些什么函數和語法?

lambda是Python中的匿名函數。它語法簡單,簡化代碼,不會產生命名沖突,污染命名空間。Python提供了map,reduce,filter等函數方法,提供了裝飾器,閉包等語法
答案

2、詳細說說tuple、list、dict的用法,它們的特點;

tuple 元祖,固定長度不可變的順序容器,訪問效率高,是和存儲一些常量數據,可以作為字典的鍵使用
list 列表,是長度可變有序的數據存儲容器,。可以通過下標索引取到相應的數據
dict 字典,長度可變的hash字典容器。存儲的方式為鍵值對,可以通過相應的鍵獲取相應的值,key支持多種類型
答案

3、說說python中裝飾器、迭代器的用法;描述下dict 的 items() 方法與 iteritems() 方法的不同;

裝飾器是指對函數執行過程,做一些擴展,甚至可以更改本身函數的執行
迭代器是指遵循迭代器協議的對象,這類對象在被for循環時,每次迭代生成下一個項,不用一開始就生成整個列表
在python3中 不存在iteritems,items方法返回可迭代對象
在python2中 items()返回[(key,value)]的列表對象,iteritems()返回迭代器對象,iteritems()循環時不可以增刪dict的內容
答案

4、講講對unicode, gbk, utf-8等的理解,python2.x是如何處理編碼問題?

unicode編碼:為了解決各個國家的語言的存儲,引進的unicode碼,包括UCS2,UCS4,UTF-8,UTF-7等
gbk:和unicode不一樣的編碼方式 ,常用的為 gbk-2312
utf-8: UTF-8 使用 1-4 個字節來存儲單個字符,應該是目前最流行的字符集。Linux 默認字符集就是UTF-8。既解決了大多數語言的編碼方式,又避免了簡單字符存儲對空間的浪費

python 2.x 需要在文件上方聲明文件的編碼方式# -*- coding: utf8 -*-,可以通過str.decode/str.encode處理字符串的文本編碼
保證 python 編輯器的編碼正確,或使用 u’中文’保證被轉換成 unicode 編碼,推薦使用
sys.setdefaultencoding('utf-8')來保證我們的編碼
答案

5、Python 是如何進行內存管理的?python 的程序會內存泄露嗎?說說有沒有什么方面防止或檢測內存泄露?

Python GC主要使用 引用計數 來跟蹤和回收垃圾。在引用計數的基礎上,通過“標記-清除”解決容器對象可能產生的循環引用問題。通過分代
以空間換時間的方法提高垃圾回收效率
1、引用計數: 每個對象中都有ob-refcnt來做引用計數。當一個對象...,ob-refcnt就會增加,當引用的對象刪除,那么ob-refcnt就會減少當ob-refcnt為零,就會釋放該對象的內存空間
2、標記清除: 解決循環引用的問題。先按需分配,等到沒有空閑內存的時候,從寄存器和程序棧上的引用出發,遍歷所有對象和引用把所有能訪問的打標記,最后將沒有標記的對象釋放掉
3、分代技術: 提高效率,提高垃圾回收的效率,按照存活時間,分成不同的集合。將內存塊按照其存活時間划分為不同的集合。每個集合就稱為一個“代”,垃圾回收的頻率隨代的存活時間增大而減小。。Python默認定義分代對象集合,引用數越大,對象的存活時間越長

Python也會內存泄露,Python本身的垃圾回收機制無法回收重寫了__del__的循環引用的對象

程序員管理好每個python對象的引用,盡量在不需要使用對象的時候,斷開所有引用
盡量少通過循環引用組織數據,可以改用weakref做弱引用或者用id之類的句柄訪問對象
通過gc模塊的接口可以檢查出每次垃圾回收有哪些對象不能自動處理,再逐個逐個處理
答案

6、關於 python 程序的運行性能方面,有什么手段能提升性能?

1、使用多進程,充分利用機器的多核性能
2、對於性能影響較大的部分代碼,可以使用C或C++編寫
3、對於IO阻塞造成的性能影響,可以使用IO多路復用來解決
4、盡量使用python的內建函數
5、盡量使用局部變量
答案

7、list 對象 alist [{'name':'a','age':20},{'name':'b','age':30},{'name':'c','age':25}], 請按 alist 中元素的age 由大到小排序;

def sort_by_age(list1):
    return sorted(alist,key=lambda x:x['age'],reverse=True)
答案

8、兩個 list 對象 alist ['a','b','c','d','e','f'], blist ['x','y','z','d','e','f'],請用簡潔的方法合並這兩個 list,並且 list 里面的元素不能重復;

alist = ['a','b','c','d','e','f']
blist = ['x','y','z','d','e','f']

def merge_list(*args):
    s = set()
    for i in args:
        s = s.union(i)
    return list(s)
答案

9、打亂一個排好序的 list 對象 alist;

import random
random.shuffle(alist)
答案

10、簡單實現一個stack

class Stack:
    def __init__(self):
        self.items = []

    def __iter__(self):
        return self.items.__iter__()

    def pop(self):
        return self.items.pop()

    def top(self):
        if len(self.items) > 0:
            return self.items[len(self.items) - 1]

    def push(self, item):
        self.items.append(item)

    def empty(self):
        self.items = []

    def size(self):
        return len(self.items)
答案

11、輸入某年某月某日,判斷這一天是這一年的第幾天?(可以用 python 標准庫)

import datetime
def dayofyear():
    year = input("請輸入年份:")
    month = input("請輸入月份:")
    day = input("請輸入天:")
    date1 = datetime.date(year=int(year),month=int(month),day=int(day))
    date2 = datetime.date(year=int(year),month=1,day=1)
    return (date1 -date2).days
答案

12、將字符串:"k:1|k1:2|k2:3|k3:4",處理成 python 字典:{k:1, k1:2, ... }

str1 = "k:1|k1:2|k2:3|k3:4"
def str2dict(str1):
    dict1 = {}
    for iterms in str1.split('|'):
        key,value = iterms.split(':')
        dict1[key] = value
    return dict1
答案

 


免責聲明!

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



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