面試題之python基礎

 

基礎語法

 

 

輸入和輸出

 

  • 代碼中要修改不可變的數據會出現什麼問題,拋出什麼異常?

    代碼不會征程運行,拋出TypeError異常java

  • a = 1,b = 2,不用中間變量交換a和b的值?

 

    
 1 # 方法1
 2 a = a + b
 3 b = a - b
 4 a = a -b
 5 
 6 #方法2:
 7  a = a^b
 8 b = b^a
 9 a = a^b
10 
11 #方法3
12 a,b = b, a
View Code

 

  • print調用python中底層的什麼方法?

    print方法默認調用sys.stdount.write方法,即往控制檯打印字符串python

  • 下面這段代碼的輸出結果是什麼?請解釋
class Parent(object):
    x =1
class Child1(Parent):
    pass
class Child2(Parent):
    pass
print(Parent.x, Child1.x, Child2.x)
Child1.x =2
print(Parent.x, Child1.x, Child2.x)
parent.x = 3
print(Parent.x, Child1.x, Child2.x)
View Code
# 結果爲 1 1 1 繼承父類的類屬性,因此都同樣,只想同一塊內存地址     
# 結果爲1 2 1 更改child1,child1的x指向新的內存地址
# 結果爲3 2 3 更改parent, parent的x指向新的內存地址

 

  • 簡述你對input()函數的理解?

    在python3中, input()獲取用戶輸入,不管用戶輸入什麼,獲取到的都是字符串的類型
    在python2中, raw_input()和input(), raw_input()和python3的做用是同樣的,input()是輸入什麼類型,獲取到的就是什麼數據類型的。mysql

 

條件與循環  

 

  • 閱讀下面的代碼,寫出A0,A1 至An 的最終值
1. A0 = dict(zip(('a''b''c''d''e'),(1,2,3,4,5)))
2. A1 = range(10)
3. A2 = [i for i in A1 if i in A0]
4. A3 = [A0[s] for s in A0]
5. A4 = [i for i in A1 if i in A3]
6. A5 = {i:i*i for i in A1}
7. A6 = [[i,i*i] for i in A1]



#1. A0 = {'a': 1, 'c': 3, 'b': 2, 'e': 5, 'd': 4}
#2. A1 = [0, 1, 2, 3, 4, 5, 6, 7, 8, 9]
#3. A2 = []
#4. A3 = [1, 3, 2, 5, 4]
#1. A4 = [1, 2, 3, 4, 5]
#2. A5 = {0: 0, 1: 1, 2: 4, 3: 9, 4: 16, 5: 25, 6: 36, 7: 49, 8: 64, 9: 81}
#3. A6 = [[0, 0], [1, 1], [2, 4], [3, 9], [4, 16], [5, 25], [6, 36],[7, 49],[8, 64] [9,81]]
View Code

 

  • range 和xrange 的區別?

    二者用法相同,不一樣的是range 返回的結果是一個列表,而xrange 的結果是一個生成器,前者是
    直接開闢一塊內存空間來保存列表,後者是邊循環邊使用,只有使用時纔會開闢內存空間,因此當列表
    很長時,使用xrange 性能要比range 好。linux

 

 

  • 考慮如下Python 代碼,若是運行結束,命令行中的運行結果是什麼
  
1. l = []
2. for i in xrange(10):
3. l.append({‘num’:i})
4. print l
# 在考慮如下代碼,運行結束後的結果是什麼?
1. l = []
2. a = {‘num’:0}
3. for i in xrange(10):
4. a[‘num’] = i
5. l.append(a)
6. print



#上方代碼的結果:
1. [{‘num’:0},{‘num’:1},{‘num’:2},{‘num’:3},{‘num’:4},{‘num’:5},{‘num’:6},{‘num’:7},{‘num’:8},
{‘num’:9}]
#下方代碼結果:
1. [{‘num’:9},{‘num’:9},{‘num’:9},{‘num’:9},{‘num’:9},{‘num’:9},{‘num’:9},{‘num’:9},{‘num’:9},
{‘num’:9}]

#緣由是:字典是可變對象,在下方的l.append(a)的操做中是把字典a 的引用傳到列表l 中,當後
續操做修改a[‘num’]的值的時候,l 中的值也會跟着改變,至關於淺拷貝。
View Code

 

文件操做  

  • 4G 內存怎麼讀取一個5G 的數據?

   方法一:能夠經過生成器,分屢次讀取,每次讀取數量相對少的數據(好比500MB)進行處理,處理結束後在讀取後面的500MB 的數據。       
   方法二:能夠經過linux 命令split 切割成小文件,而後再對數據進行處理,此方法效率比較高。能夠按照行數切割,能夠按照文件大小切割。程序員

 

 

  • 如今考慮有一個jsonline 格式的文件file.txt 大小約爲10K,以前處理文件的

  代碼以下所示:web

1. def get_lines():
2. l = []
3. with open(‘file.txt’,‘rb’) as f:
4. for eachline in f:
5. l.append(eachline)
6. return l
7. if __name__ == ‘__main__’:
8. for e in get_lines():
9. process(e) #處理每一行數據

  如今要處理一個大小爲10G 的文件,可是內存只有4G,若是在只修改get_lines 函數而其餘代
  碼保持不變的狀況下,應該如何實現?須要考慮的問題都有哪些?redis

1. def get_lines():
2. l = []
3. with open(‘file.txt’,’rb’) as f:
4. data = f.readlines(60000)
5. l.append(data)
6. yield l

#要考慮到的問題有:
#內存只有4G 沒法一次性讀入10G 的文件,須要分批讀入。分批讀入數據要記錄每次讀入數據#的位
#置。分批每次讀入數據的大小,過小就會在讀取操做上花費過多時間。
View Code

 

  • read、readline 和readlines 的區別?

    read:讀取整個文件。
    readline:讀取下一行,使用生成器方法。
    readlines:讀取整個文件到一個迭代器以供咱們遍歷。算法

 

  • 補充缺失的代碼?
1.def print_directory_contents(sPath):
2. """
3. 這個函數接收文件夾的名稱做爲輸入參數
4. 返回該文件夾中文件的路徑
5. 以及其包含文件夾中文件的路徑
6. """
7. # 補充代碼
8. ------------代碼以下--------------------
9. import os
10. for sChild in os.listdir(sPath):
11. sChildPath = os.path.join(sPath, sChild)
12. if os.path.isdir(sChildPath):
13. print_directory_contents(sChildPath)
14. else:
15. print(sChildPath)

 

異常

  • 在except 中return 後還會不會執行finally 中的代碼?怎麼拋出自定義異常?
    #會繼續處理finally 中的代碼;用raise 方法能夠拋出自定義異常
  • 介紹一下except 的做用和用法?

    xcept: #捕獲全部異常
    except: <異常名>: #捕獲指定異常
    except:<異常名1, 異常名2> : 捕獲異常1 或者異常2
    except:<異常名>,<數據>:捕獲指定異常及其附加的數據
    except:<異常名1,異常名2>:<數據>:捕獲異常名1 或者異常名2,及附加的數據sql

模塊與包

  • 經常使用的Python 標準庫都有哪些?

    os 操做系統,time 時間,random 隨機,pymysql 鏈接數據庫,threading 線程,multiprocessing進程,query隊列mongodb

    os 操做系統,time 時間,random 隨機,pymysql 鏈接數據庫,threading 線程,multiprocessing
    進程,queue 隊列。
    第三方庫:
    django 和flask 也是第三方庫,requests,virtualenv,selenium,scrapy,xadmin,celery,
    re,hashlib,md5。
    經常使用的科學計算庫(如Numpy,Scipy,Pandas)。

     

  • 賦值、淺拷貝和深拷貝的區別?
    1、賦值
    在Python 中,對象的賦值就是簡單的對象引用,這點和C++不一樣,以下所示:
    16.a = [1,2,"hello",['python', 'C++']]
    17.b = a
    在上述狀況下,a 和b 是同樣的,他們指向同一片內存,b 不過是a 的別名,是引用。
    咱們可使用b is a 去判斷,返回True,代表他們地址相同,內容相同,也可使用id()函數來查
    看兩個列表的地址是否相同。
    賦值操做(包括對象做爲參數、返回值)不會開闢新的內存空間,它只是複製了對象的引用。也就是
    說除了b 這個名字以外,沒有其餘的內存開銷。修改了a,也就影響了b,同理,修改了b,也就影響
    了a。
    2、淺拷貝(shallow copy)
    淺拷貝會建立新對象,其內容非原對象自己的引用,而是原對象內第一層對象的引用。
    淺拷貝有三種形式:切片操做、工廠函數、copy 模塊中的copy 函數。
    好比上述的列表a;
    切片操做:b = a[:] 或者b = [x for x in a];
    工廠函數:b = list(a);
    copy 函數:b = copy.copy(a);
    淺拷貝產生的列表b 再也不是列表a 了,使用is 判斷能夠發現他們不是同一個對象,使用id 查看,
    他們也不指向同一片內存空間。可是當咱們使用id(x) for x in a 和id(x) for x in b 來查看a 和b 中元
    素的地址時,能夠看到兩者包含的元素的地址是相同的。
    在這種狀況下,列表a 和b 是不一樣的對象,修改列表b 理論上不會影響到列表a。
    可是要注意的是,淺拷貝之因此稱之爲淺拷貝,是它僅僅只拷貝了一層,在列表a 中有一個嵌套的
    list,若是咱們修改了它,狀況就不同了。
    好比:a[3].append('java')。查看列表b,會發現列表b 也發生了變化,這是由於,咱們修改了嵌
    套的list,修改外層元素,會修改它的引用,讓它們指向別的位置,修改嵌套列表中的元素,列表的地
    址並未發生變化,指向的都是用一個位置。
    3、深拷貝(deep copy)
    深拷貝只有一種形式,copy 模塊中的deepcopy()函數。
    深拷貝和淺拷貝對應,深拷貝拷貝了對象的全部元素,包括多層嵌套的元素。所以,它的時間和空
    間開銷要高。
    一樣的對列表a,若是使用b = copy.deepcopy(a),再修改列表b 將不會影響到列表a,即便嵌
    套的列表具備更深的層次,也不會產生任何影響,由於深拷貝拷貝出來的對象根本就是一個全新的對象,
    再也不與原來的對象有任何的關聯。
    4、拷貝的注意點?
    對於非容器類型,如數字、字符,以及其餘的「原子」類型,沒有拷貝一說,產生的都是原對象的
    引用。
    若是元組變量值包含原子類型對象,即便採用了深拷貝,也只能獲得淺拷貝。

     

  • __init__ 和__new__的區別?

    init 在對象建立後,對對象進行初始化。
    new 是在對象建立以前建立一個對象,並將該對象返回給init。

  • Python 裏面如何生成隨機數?

    在Python 中用於生成隨機數的模塊是random,在使用前須要import. 以下例子能夠酌情列
    舉:
    random.random():生成一個0-1 之間的隨機浮點數;
    random.uniform(a, b):生成[a,b]之間的浮點數;
    random.randint(a, b):生成[a,b]之間的整數;
    random.randrange(a, b, step):在指定的集合[a,b)中,以step 爲基數隨機取一個數;

    random.choice(sequence):從特定序列中隨機取一個元素,這裏的序列能夠是字符串,列表,
    元組等。

  • 輸入某年某月某日,判斷這一天是這一年的第幾天?(能夠用Python 標準
    庫)

    1. import datetime
    2. def dayofyear():
    3. year = input("請輸入年份:")
    4. month = input("請輸入月份:")
    5. day = input("請輸入天:")
    6. date1 = datetime.date(year=int(year),month=int(month),day=int(day))
    7. date2 = datetime.date(year=int(year),month=1,day=1)
    8. return (date1 - date2 + 1).days
    View Code

     

  • 打亂一個排好序的list 對象alist?
    1. import random
    2. random.shuffle(alist)

     

  • 說明一下os.path 和sys.path 分別表明什麼?

    os.path 主要是用於對系統路徑文件的操做。
    sys.path 主要是對Python 解釋器的系統環境參數的操做(動態的改變Python 解釋器搜索路徑)。

  • Python 中的os 模塊常見方法?
    os.remove()刪除文件
    os.rename()重命名文件
    os.walk()生成目錄樹下的全部文件名
    os.chdir()改變目錄
    os.mkdir/makedirs 建立目錄/多層目錄
    os.rmdir/removedirs 刪除目錄/多層目錄
    os.listdir()列出指定目錄的文件
    os.getcwd()取得當前工做目錄
    os.chmod()改變目錄權限
    os.path.basename()去掉目錄路徑,返回文件名
    os.path.dirname()去掉文件名,返回目錄路徑
    os.path.join()將分離的各部分組合成一個路徑名
    os.path.split()返回(dirname(),basename())元組
    os.path.splitext()(返回filename,extension)元組
    os.path.getatime\ctime\mtime 分別返回最近訪問、建立、修改時間
    os.path.getsize()返回文件大小
    os.path.exists()是否存在
    os.path.isabs()是否爲絕對路徑
    os.path.isdir()是否爲目錄
    os.path.isfile()是否爲文件
    View Code
  • Python 的sys 模塊經常使用方法?
    sys.argv 命令行參數List,第一個元素是程序自己路徑
    sys.modules.keys() 返回全部已經導入的模塊列表
    sys.exc_info() 獲取當前正在處理的異常類,exc_type、exc_value、exc_traceback 當前處理的異常詳細信息
    sys.exit(n) 退出程序,正常退出時exit(0)
    sys.hexversion 獲取Python 解釋程序的版本值,16 進制格式如:0x020403F0
    sys.version 獲取Python 解釋程序的版本信息
    sys.maxint 最大的Int 值
    sys.maxunicode 最大的Unicode 值
    sys.modules 返回系統導入的模塊字段,key 是模塊名,value 是模塊
    sys.path 返回模塊的搜索路徑,初始化時使用PYTHONPATH 環境變量的值
    sys.platform 返回操做系統平臺名稱
    sys.stdout 標準輸出
    sys.stdin 標準輸入
    sys.stderr 錯誤輸出
    sys.exc_clear() 用來清除當前線程所出現的當前的或最近的錯誤信息
    sys.exec_prefix 返回平臺獨立的python 文件安裝的位置
    sys.byteorder 本地字節規則的指示器,big-endian 平臺的值是'big',little-endian 平臺的值是'little'
    sys.copyright 記錄python 版權相關的東西
    sys.api_version 解釋器的C 的API 版本
     sys.version_info 元組則提供一個更簡單的方法來使你的程序具有Python 版本要求功能
    View Code
  • unittest 是什麼?

    在Python 中,unittest 是Python 中的單元測試框架。它擁有支持共享搭建、自動測試、在測試中暫停代碼,將不一樣測試迭代成一組的功能

  • 模塊和包是什麼?

    在Python 中,模塊是搭建程序的一種方式。每個Python 代碼文件都是一個模塊,並能夠引用其餘的的模塊,好比對象和屬性
    一個包含許多Python 代碼的文件夾是一個包。一個包能夠包含模塊和子文件夾。

Python 特性

  • Python 是強語言類型仍是弱語言類型?

    Python 是強類型的動態腳本語言。
    強類型:不容許不一樣類型相加。
    動態:不使用顯示數據類型聲明,且肯定一個變量的類型是在第一次給它賦值的時候。
    腳本語言:通常也是解釋型語言,運行代碼只須要一個解釋器,不須要編譯。

  • 談一下什麼是解釋性語言,什麼是編譯性語言?

    計算機不能直接理解高級語言,只能直接理解機器語言,因此必需要把高級語言翻譯成機器語言,計算機才能執行高級語言編寫的程序。

    解釋性語言在運行程序的時候纔會進行翻譯。
    編譯型語言寫的程序在執行以前,須要一個專門的編譯過程,把程序編譯成機器語言(可執行文件

  • Python 中有日誌嗎?怎麼使用?

    Python 自帶logging 模塊,調用logging.basicConfig()方法,配置須要的日誌等級和相應的參數,
    Python 解釋器會按照配置的參數生成相應的日誌。

  • Python 是如何進行類型轉換的?
    內建函數封裝了各類轉換函數,可使用目標類型關鍵字強制類型轉換,進制之間的轉換能夠用
    int(‘str’,base=’n’)將特定進制的字符串轉換爲十進制,再用相應的進制轉換函數將十進制轉換
    爲目標進制。
    可使用內置函數直接轉換的有:
    list---->tuple tuple(list)
    tuple---->list list(tuple)
  • Python2 與Python3 的區別?
    1. Python3 對Unicode 字符的原生支持。
    Python2 中使用ASCII 碼做爲默認編碼方式致使string 有兩種類型str 和unicode,Python3 只
    支持unicode 的string。
    2. Python3 採用的是絕對路徑的方式進行import。
    Python2 中相對路徑的import 會致使標準庫導入變得困難(想象一下,同一目錄下有file.py,如
    何同時導入這個文件和標準庫file)。Python3 中這一點將被修改,若是還須要導入同一目錄的文件必
    須使用絕對路徑,不然只能使用相關導入的方式來進行導入。
    3. Python2 中存在老式類和新式類的區別,Python3 統一採用新式類。新式類聲明要求繼承object,
    必須用新式類應用多重繼承。
    4. Python3 使用更加嚴格的縮進。Python2 的縮進機制中,1 個tab 和8 個space 是等價的,所
    以在縮進中能夠同時容許tab 和space 在代碼中共存。這種等價機制會致使部分IDE 使用存在問題。
    Python3 中1 個tab 只能找另一個tab 替代,所以tab 和space 共存會致使報錯:TabError:
    inconsistent use of tabs and spaces in indentation.
    2) 廢棄類差別
    1. print 語句被Python3 廢棄,統一使用print 函數
    2. exec 語句被python3 廢棄,統一使用exec 函數
    3. execfile 語句被Python3 廢棄,推薦使用exec(open("./filename").read())
    4. 不相等操做符"<>"被Python3 廢棄,統一使用"!="
    5. long 整數類型被Python3 廢棄,統一使用int
    6. xrange 函數被Python3 廢棄,統一使用range,Python3 中range 的機制也進行修改並提升
    了大數據集生成效率
    7. Python3 中這些方法再再也不返回list 對象:dictionary 關聯的keys()、values()、items(),zip(),
    map(),filter(),可是能夠經過list 強行轉換:
    1. mydict={"a":1,"b":2,"c":3}
    2. mydict.keys() #<built-in method keys of dict object at 0x000000000040B4C8>
    3. list(mydict.keys()) #['a', 'c', 'b']
    8. 迭代器iterator 的next()函數被Python3 廢棄,統一使用next(iterator)
    9. raw_input 函數被Python3 廢棄,統一使用input 函數
    10. 字典變量的has_key 函數被Python 廢棄,統一使用in 關鍵詞
    11. file 函數被Python3 廢棄,統一使用open 來處理文件,能夠經過io.IOBase 檢查文件類型
    12. apply 函數被Python3 廢棄
    13. 異常StandardError 被Python3 廢棄,統一使用Exception
    View Code
    3) 修改類差別
    1. 浮點數除法操做符「/」和「//」的區別
    「 / 」:
    Python2:若爲兩個整形數進行運算,結果爲整形,但若兩個數中有一個爲浮點數,則結果爲
    浮點數;
    Python3:爲真除法,運算結果再也不根據參加運算的數的類型。
    「//」:
    Python2:返回小於除法運算結果的最大整數;從類型上講,與"/"運算符返回類型邏輯一致。
    Python3:和Python2 運算結果同樣。
    2. 異常拋出和捕捉機制區別
    Python2
    1. raise IOError, "file error" #拋出異常
    2. except NameError, err: #捕捉異常
    Python3
    1. raise IOError("file error") #拋出異常
    2. except NameError as err: #捕捉異常
    Python2,for 循環會修改外部相同名稱變量的值
    1. i = 1
    2. print'comprehension: ', [i for i in range(5)])
    3. print'after: i =', i ) #i=4
    Python3,for 循環不會修改外部相同名稱變量的值
    1. i = 1
    2. print'comprehension: ', [i for i in range(5)])
    3. print'after: i =', i ) #i=1
    4. round 函數返回值區別
    Python2,round 函數返回float 類型值
    1. isinstance(round(15.5),int) #True
    Python3,round 函數返回int 類型值
    1. isinstance(round(15.5),float) #True
    5. 比較操做符區別
    Python2 中任意兩個對象均可以比較
    1. 11 < 'test' #True
    Python3 中只有同一數據類型的對象能夠比較
    1. 11 < 'test' # TypeError: unorderable types: int() < str()
    View Code
    第三方工具包差別
    咱們在pip 官方下載源pypi 搜索Python2.7 和Python3.5 的第三方工具包數能夠發現,Python2.7
    版本對應的第三方工具類目數量是28523,Python3.5 版本的數量是12457,這兩個版本在第三方工具
    包支持數量差距至關大。
    咱們從數據分析的應用角度列舉了常見實用的第三方工具包(以下表),並分析這些工具包在
    Python2.7 和Python3.5 的支持狀況:
    分類工具名用途
    數據收集scrapy 網頁採集,爬蟲
    數據收集scrapy-redis 分佈式爬蟲
    數據收集selenium web 測試,仿真瀏覽器
    數據處理beautifulsoup 網頁解釋庫,提供lxml 的支持
    數據處理lxml xml 解釋庫
    數據處理xlrd excel 文件讀取
    數據處理xlwt excel 文件寫入
    數據處理xlutils excel 文件簡單格式修改
    數據處理pywin32 excel 文件的讀取寫入及複雜格式定製
    數據處理Python-docx Word 文件的讀取寫入
    數據分析numpy 基於矩陣的數學計算庫
    數據分析pandas 基於表格的統計分析庫
    數據分析scipy 科學計算庫,支持高階抽象和複雜模型
    數據分析statsmodels 統計建模和計量經濟學工具包
    數據分析scikit-learn 機器學習工具庫
    數據分析gensim 天然語言處理工具庫
    數據分析jieba 中文分詞工具庫
    數據存儲MySQL-python mysql 的讀寫接口庫
    數據存儲mysqlclient mysql 的讀寫接口庫
    數據存儲SQLAlchemy 數據庫的ORM 封裝
    數據存儲pymssql sql server 讀寫接口庫
    數據存儲redis redis 的讀寫接口
    數據存儲PyMongo mongodb 的讀寫接口
    數據呈現matplotlib 流行的數據可視化庫
    數據呈現seaborn 美觀的數據但是湖庫,基於matplotlib
    工具輔助jupyter 基於web 的python IDE,經常使用於數據分析
    工具輔助chardet 字符檢查工具
    工具輔助ConfigParser 配置文件讀寫支持
    工具輔助requests HTTP 庫,用於網絡訪問
    View Code
    5) 工具安裝問題
    windows 環境
    Python2 沒法安裝mysqlclient。Python3 沒法安裝MySQL-python、flup、functools3二、
    Gooey、Pywin3二、webencodings。
    matplotlib 在python3 環境中安裝報錯:The following required packages can not be
    built:freetype, png。須要手動下載安裝源碼包安裝解決。
    scipy 在Python3 環境中安裝報錯,numpy.distutils.system_info.NotFoundError,須要本身手
    工下載對應的安裝包,依賴numpy,pandas 必須嚴格根據python 版本、操做系統、64 位與否。運行
    matplotlib 後發現基礎包numpy+mkl 安裝失敗,須要本身下載,國內暫無下載源
    centos 環境下
    Python2 沒法安裝mysql-python 和mysqlclient 包,報錯:EnvironmentError: mysql_config not
    found,解決方案是安裝mysql-devel 包解決。使用matplotlib 報錯:no module named _tkinter,
    安裝Tkinter、tk-devel、tc-devel 解決。
    pywin32 也沒法在centos 環境下安裝。
    View Code
  • 關於Python 程序的運行方面,有什麼手段能提高性能?
    1、使用多進程,充分利用機器的多核性能
    二、對於性能影響較大的部分代碼,可使用C 或C++編寫
    3、對於IO 阻塞形成的性能影響,可使用IO 多路複用來解決
    4、儘可能使用Python 的內建函數
    五、儘可能使用局部變量
  • Python 中的做用域?

    Python 中,一個變量的做用域老是由在代碼中被賦值的地方所決定。當Python 遇到一個變量的話它會按照這的順序進行搜索:

    本地做用域(Local)--->當前做用域被嵌入的本地做用域(Enclosing locals)--->全局/模塊做用域
    (Global)--->內置做用域(Built-in)。

  • 什麼是Python?
     Python 是一種編程語言,它有對象、模塊、線程、異常處理和自動內存管理,能夠加入其餘語
    言的對比。
     Python 是一種解釋型語言,Python 在代碼運行以前不須要解釋。
     Python 是動態類型語言,在聲明變量時,不須要說明變量的類型。
     Python 適合面向對象的編程,由於它支持經過組合與繼承的方式定義類。
     在Python 語言中,函數是第一類對象。
     Python 代碼編寫快,可是運行速度比編譯型語言一般要慢。
     Python 用途普遍,常被用走"膠水語言",可幫助其餘語言和組件改善運行情況。
     使用Python,程序員能夠專一於算法和數據結構的設計,而不用處理底層的細節。
  • 什麼是python自省?
    Python 自省是Python 具備的一種能力,使程序員面向對象的語言所寫的程序在運行時,可以得到
    對象的類Python 型。Python 是一種解釋型語言,爲程序員提供了極大的靈活性和控制力。
  • 什麼是Python 的命名空間?
    在Python 中,全部的名字都存在於一個空間中,它們在該空間中存在和被操做——這就是命名空
    間。它就好像一個盒子,每個變量名字都對應裝着一個對象。當查詢變量的時候,會從該盒子裏面尋
    找相應的對象。
  • 你所遵循的代碼規範是什麼?請舉例說明其要求?
    PEP8 規範。
    1. 變量
    常量:大寫加下劃線USER_CONSTANT。
    私有變量: 小寫和一個前導下劃線_private_value。
    Python 中不存在私有變量一說,如果遇到須要保護的變量,使用小寫和一個前導下劃線。但這只是
    程序員之間的一個約定,用於警告說明這是一個私有變量,外部類不要去訪問它。但實際上,外部類還
    是能夠訪問到這個變量。
    內置變量: 小寫,兩個前導下劃線和兩個後置下劃線__class__
    兩個前導下劃線會致使變量在解釋期間被改名。這是爲了不內置變量和其餘變量產生衝突。用戶
    定義的變量要嚴格避免這種風格。以避免致使混亂。
    2. 函數和方法
    整體而言應該使用,小寫和下劃線。但有些比較老的庫使用的是混合大小寫,即首單詞小寫,以後
    每一個單詞第一個字母大寫,其他小寫。但如今,小寫和下劃線已成爲規範。
    私有方法:小寫和一個前導下劃線
    這裏和私有變量同樣,並非真正的私有訪問權限。同時也應該注意通常函數不要使用兩個前導下
    劃線(當遇到兩個前導下劃線時,Python 的名稱改編特性將發揮做用)。
    特殊方法:小寫和兩個前導下劃線,兩個後置下劃線
    這種風格只應用於特殊函數,好比操做符重載等。
    函數參數: 小寫和下劃線,缺省值等號兩邊無空格
    3. 類
    類老是使用駝峯格式命名,即全部單詞首字母大寫其他字母小寫。類名應該簡明,精確,並足以從
    中理解類所完成的工做。常見的一個方法是使用表示其類型或者特性的後綴,例如:
    SQLEngine,MimeTypes 對於基類而言,可使用一個Base 或者Abstract 前綴BaseCookie,
    AbstractGroup
    4. 模塊和包
    除特殊模塊__init__ 以外,模塊名稱都使用不帶下劃線的小寫字母。
    如果它們實現一個協議,那麼一般使用lib 爲後綴,例如:
    import smtplib
    import os
    import sys
    5. 關於參數
    5.1 不要用斷言來實現靜態類型檢測。斷言能夠用於檢查參數,但不該僅僅是進行靜態類型檢測。
    Python 是動態類型語言,靜態類型檢測違背了其設計思想。斷言應該用於避免函數不被毫無心義的調
    用。
    5.2 不要濫用*args 和**kwargs。*args 和**kwargs 參數可能會破壞函數的健壯性。它們使籤
    名變得模糊,並且代碼經常開始在不該該的地方構建小的參數解析器。
    6. 其餘
    6.1 使用has 或is 前綴命名布爾元素
    is_connect = True
    has_member = False
    6.2 用複數形式命名序列
    members = ['user_1', 'user_2']
    6.3 用顯式名稱命名字典
    person_address = {'user_1':'10 road WD', 'user_2' : '20 street huafu'}
    6.4 避免通用名稱
    諸如list, dict, sequence 或者element 這樣的名稱應該避免。
    6.5 避免現有名稱
    諸如os, sys 這種系統已經存在的名稱應該避免。
    7. 一些數字
    一行列數: PEP 8 規定爲79 列。根據本身的狀況,好比不要超過滿屏時編輯器的顯示列數。
    一個函數: 不要超過30 行代碼, 便可顯示在一個屏幕類,能夠不使用垂直遊標便可看到整個函數。
    一個類: 不要超過200 行代碼,不要有超過10 個方法。一個模塊不要超過500 行。
    8. 驗證腳本
    能夠安裝一個pep8 腳本用於驗證你的代碼風格是否符合PEP8。
    View Code
相關文章
相關標籤/搜索