python編程規範系列--建議08~18

来源:https://www.cnblogs.com/zhangbc/archive/2019/01/18/10289870.html
-Advertisement-
Play Games

本系列來自《編寫高質量代碼 改善python程式的91個建議》的讀書筆記整理。python編程規範系列--建議08~18 ...


  本系列來自《編寫高質量代碼 改善python程式的91個建議》的讀書筆記整理。

   本章主要內容

建議8:利用assert語句來發現問題 建議9:數據交換值時不推薦使用中間交換變數 建議10:充分利用Lazy evaluation的特性 建議11:理解枚舉替代實現的缺陷 建議12:不推薦使用type來進行類型檢查 建議13:儘量轉換為浮點類型再做除法 建議14:警惕eval()的安全漏洞 建議15:使用enumerate()獲取序列迭代的索引和值 建議16:分清==與is的適用場景 建議17:考慮相容性,儘可能使用Unicod 建議18:構建合理的包層次來管理module

建議8:利用assert語句來發現問題

    1)__debug__的值預設為True,且只讀,無法修改(py2.7)。     2)斷言是有代價的,對性能產生一定影響。禁用斷言的方法是在運行腳本的時候加上-O標記(不優化位元組碼,而是忽略與斷言相關的語句)。
    使用斷言註意點:     1)不要濫用,這是使用斷言的最基本的原則;     2)如果Python本身的異常能夠處理就不要再使用斷言;     3)不要使用斷言來檢查用戶的輸入;     4)在函數調用後,當需要確認返回值是否合理時可以使用斷言;     5)當條件時業務邏輯繼續下去的先決條件時,可以使用斷言。

建議9:數據交換值時不推薦使用中間交換變數

1 >>> from timeit import Timer
2 >>> Timer('temp=x;x=y;y=temp','x=2;y=3').timeit()
3 0.03472399711608887
4 >>> Timer('x,y=y,x','x=2;y=3').timeit()
5 0.031581878662109375

建議10:充分利用Lazy evaluation的特性

    Lazy evaluation常被譯作“延時計算”或“惰性計算”,指的是僅僅在真正需要執行計算的時候才計算表達式的值。典型例子:生成器表達式。     1)避免不必要的計算,帶來性能上的提升;     2)節省空間,使用無限迴圈的數據結構成為可能。

建議11:理解枚舉替代實現的缺陷

    1)替代方法:使用類屬性;藉助函數;使用collections.namedtuple.
1 >>> from collections import namedtuple
2 >>> Seasons=namedtuple('Seasons','Spring Summer Autumn Winter')._make(xrange(4))
3 >>> print Seasons
4 Seasons(Spring=0, Summer=1, Autumn=2, Winter=3)
5 >>> print Seasons.Autumn
6 2
    2)替代缺陷:允許枚舉值重覆;支持無意義的操作.
1 >>> Seasons._replace(Spring=2) # 不合理
2 Seasons(Spring=2, Summer=1, Autumn=2, Winter=3)
3 >>> Seasons.Summer+Seasons.Autumn == Seasons.Winter # 無意義
4 True
    3)py2.7的替代方案(py3.4後引入Enum類型):flufl.enum
 1 from flufl.enum import Enum
 2 
 3 
 4 class Seasons(Enum):
 5     Spring = "Spring"
 6     Summer = 2
 7     Autumn = 3
 8     Winter = 4
 9 
10 Seasons = Enum('Seasons', 'Spring Summer Autumn Winter')
11 print Seasons
12 print Seasons.Summer.value    

建議12:不推薦使用type來進行類型檢查

    1)基於內建類型擴展的用戶自定義類型,type函數並不能準確返回結果;     2)在舊式類中,所有類的實例的type值都相等。     3)可以用isinstance()函數檢查。

建議13:儘量轉換為浮點類型再做除法

        當涉及除法運算的時候儘量先將操作數轉換成浮點類型再做運算。         浮點數不精確性導致的無限迴圈:
1 >>> i=1
2 >>> while i!=1.5:
3 ... i=i+0.1
4 ... print i

建議14:警惕eval()的安全漏洞

 1 # -*-coding:UTF-8 -*-
 2 
 3 import sys
 4 from math import *
 5 
 6 
 7 def ExpCalcBot(string):
 8     try:
 9         print 'Your answer is', eval(string)
10     except NameError:
11         print "The expression you enter is not valid."
12 
13 
14 while True:
15     print 'Please enter a number or operation. Enter e to complete. '
16 
17     inputStr = raw_input()
18     if inputStr == 'e':
19         sys.exit()
20     elif repr(inputStr) != ' ':
21         ExpCalcBot(inputStr)

輸入:__import__("os").system("dir")   顯示當前目錄下的所有文件.

        __import__("os").system("del */Q")   刪除當前目錄下的所有文件.
        因此,在實際應用過程中國呢如果使用對象不是信任源,應該儘量避免使用eval,在需要使用eval的地方可以用安全性更好的ast.literal_eval替代。

建議15:使用enumerate()獲取序列迭代的索引和值

        註意,在獲取迭代過程中字典的key和value,應該使用如下iteritems()方法。
1 >>> person={'name': 'Josn', 'age': 19, 'hobby': 'football'}
2 >>> for k,v in person.iteritems():
3 ... print k, ":", v

建議16:分清==與is的適用場景

 1 >>> a="Hi"
 2 >>> b="Hi"
 3 >>> a is b
 4 True
 5 >>> a==b
 6 True
 7 >>> a1 ="I am using long string for testing" # 註意區分
 8 >>> b1 ="I am using long string for testing"
 9 >>> a1 is b1
10 False
11 >>> a1==b1
12 True

    is:表示的是對象標識符,檢查對象的標識符是否一致,也就是比較兩個對象在記憶體中是否擁有同一塊記憶體空間;     ==:表示的是值相等,用來判斷兩個對象的值是否相等,可以被重載。     字元串駐留(string interning)機制:對於較小的字元串,為了提高系統性能會保留其值的一個副本,當創建新的字元串時直接指向該副本即可。

建議17:考慮相容性,儘可能使用Unicode

    python內建的字元串有兩種類型:str和Unicode,共同祖先為basestring。     windows本地預設編碼是CP936。     解碼:str.decode([編碼參數[,錯誤處理]])  
    編碼:str.encode([編碼參數[,錯誤處理]])
    錯誤處理參數有3種方式:
        (1)strict:預設值,拋出UnicodeError異常;
        (2)ignore:忽略不可轉換的字元;
        (3)replace:將不可轉換字元用?代替。
    有些軟體在保存UTF-8編碼時,會在文件最開始地方插入不可見的BOM,可以利用codecs解決。
1 import codecs
2 
3 
4 content = open('manage.py', 'r').read()
5 
6 if content[:3] == codecs.BOM_UTF8:
7     content = content[:3]
8 
9 print content.decode("utf-8")
    編碼聲明的三種方式:
1 # coding=<encoding name> #方式一
2 #!/usr/bin/env python
3 
4 # -*- coding:<encoding name> -*- #方式二
5 
6 #!/usr/bin/env python
7 # vim:set fileencoding=<encoding name> #方式三

建議18:構建合理的包層次來管理module

    包中__init__.py文件的作用:1)使包和普通目錄區分;               2)在該文件中聲明模塊級別的import語句從而使其變成包級別可見;               3)通過該文件中定義__all__變數,控制需要導入的子包或者模塊。
    使用包的好處:     1)合理組織代碼,便於維護和使用;     2)能夠有效地避免名稱空間衝突。
您的分享是我們最大的動力!

-Advertisement-
Play Games
更多相關文章
  • 1. 組合繼承:又叫偽經典繼承,是指將原型鏈和借用構造函數技術組合在一塊的一種繼承方式。 下麵來看一個例子: 組合繼承避免了原型鏈和借用構造函數的缺陷,融合它們的優點。 2. 原型式繼承 可以在不必預先定義構造函數的情況下實現繼承,其本質是執行對給定對象的淺複製。而複製得到的副本還可以得到進一步的改 ...
  • 本文由雲+社區發表 作者:騰訊工蜂用戶:王二衛 從不一樣的視角瞭解git,以便更好的使用git 一、git & git 版本庫認識 git 是一個內容定址的文件系統,其核心部分是一個簡單的鍵值對資料庫(key value data store),可以向該資料庫插入任意類型的內容,它會返回一個40位長 ...
  • 有些小伙伴不熟悉Jenkins, 在mac上安裝,會選擇pkg 安裝包, 安裝後又想卸載,苦於卸載不幹凈,今天給到一個命令即可搞定. 對應qq群號:616961231打開終端輸入下麵命令'/Library/Application Support/Jenkins/Uninstall.command' ...
  • 目錄 0).簡單工廠模式 1).工廠方法模式 2).抽象工廠模式 3).單例模式 4).構建者模式 5).原型模式 6).適配器模式 7).修飾者模式 8).代理模式 9).外觀模式 10).橋接模式 11).組合模式 12).享元模式 13).策略模式 14).模板方法模式 15).觀察者模式 1 ...
  • 第一篇:數據倉庫的概述 1.數據倉庫基本概念 數據倉庫是一個面向主題的、集成的、不可更新的、隨時間變化的。 它用於支持企業或組織的決策分析處理。 2.數據分層 ODS(Operatitional data store)層:稱為源數據層,表結構與業務系統的表保持基本一致。通常在ODS層主要做一些欄位的 ...
  • GitHub AES 高級數據加密標準(Advanced Encryption Standard),簡稱AES,由美國政府於1997年開始公開徵集的新的數據加密標準演算法。經過三輪篩選,美國政府最終於2000年10月2日正式宣佈選中密碼學家Joan Daemen和Vincent Rijmen提出的RI ...
  • 最近做面試題,遇到一些問題,整理一下! 1、Overloaded的方法是否可以改變返回值的類型? 答案:可以。 overload是重載,overloaded是什麼?重載的過去式?我還以為是我沒見過的註解,也沒有給限定條件,代碼測試一下。 註釋部分報錯,很明顯,如果吧這個單詞也解釋為重載的話,重載的基 ...
  • operator 是 C++ 的(運算符的)重載操作符。用作擴展運算符的功能。 它和運算符一起使用,表示一個運算符函數,理解時應將 【operator+運算符】 整體上視為一個函數名。 要註意的是:一方面要使運算符的使用方法與其原來一致,另一方面擴展其功能只能通過函數的方式(c++中,“功能”都是由 ...
一周排行
    -Advertisement-
    Play Games
  • 移動開發(一):使用.NET MAUI開發第一個安卓APP 對於工作多年的C#程式員來說,近來想嘗試開發一款安卓APP,考慮了很久最終選擇使用.NET MAUI這個微軟官方的框架來嘗試體驗開發安卓APP,畢竟是使用Visual Studio開發工具,使用起來也比較的順手,結合微軟官方的教程進行了安卓 ...
  • 前言 QuestPDF 是一個開源 .NET 庫,用於生成 PDF 文檔。使用了C# Fluent API方式可簡化開發、減少錯誤並提高工作效率。利用它可以輕鬆生成 PDF 報告、發票、導出文件等。 項目介紹 QuestPDF 是一個革命性的開源 .NET 庫,它徹底改變了我們生成 PDF 文檔的方 ...
  • 項目地址 項目後端地址: https://github.com/ZyPLJ/ZYTteeHole 項目前端頁面地址: ZyPLJ/TreeHoleVue (github.com) https://github.com/ZyPLJ/TreeHoleVue 目前項目測試訪問地址: http://tree ...
  • 話不多說,直接開乾 一.下載 1.官方鏈接下載: https://www.microsoft.com/zh-cn/sql-server/sql-server-downloads 2.在下載目錄中找到下麵這個小的安裝包 SQL2022-SSEI-Dev.exe,運行開始下載SQL server; 二. ...
  • 前言 隨著物聯網(IoT)技術的迅猛發展,MQTT(消息隊列遙測傳輸)協議憑藉其輕量級和高效性,已成為眾多物聯網應用的首選通信標準。 MQTTnet 作為一個高性能的 .NET 開源庫,為 .NET 平臺上的 MQTT 客戶端與伺服器開發提供了強大的支持。 本文將全面介紹 MQTTnet 的核心功能 ...
  • Serilog支持多種接收器用於日誌存儲,增強器用於添加屬性,LogContext管理動態屬性,支持多種輸出格式包括純文本、JSON及ExpressionTemplate。還提供了自定義格式化選項,適用於不同需求。 ...
  • 目錄簡介獲取 HTML 文檔解析 HTML 文檔測試參考文章 簡介 動態內容網站使用 JavaScript 腳本動態檢索和渲染數據,爬取信息時需要模擬瀏覽器行為,否則獲取到的源碼基本是空的。 本文使用的爬取步驟如下: 使用 Selenium 獲取渲染後的 HTML 文檔 使用 HtmlAgility ...
  • 1.前言 什麼是熱更新 游戲或者軟體更新時,無需重新下載客戶端進行安裝,而是在應用程式啟動的情況下,在內部進行資源或者代碼更新 Unity目前常用熱更新解決方案 HybridCLR,Xlua,ILRuntime等 Unity目前常用資源管理解決方案 AssetBundles,Addressable, ...
  • 本文章主要是在C# ASP.NET Core Web API框架實現向手機發送驗證碼簡訊功能。這裡我選擇是一個互億無線簡訊驗證碼平臺,其實像阿裡雲,騰訊雲上面也可以。 首先我們先去 互億無線 https://www.ihuyi.com/api/sms.html 去註冊一個賬號 註冊完成賬號後,它會送 ...
  • 通過以下方式可以高效,並保證數據同步的可靠性 1.API設計 使用RESTful設計,確保API端點明確,並使用適當的HTTP方法(如POST用於創建,PUT用於更新)。 設計清晰的請求和響應模型,以確保客戶端能夠理解預期格式。 2.數據驗證 在伺服器端進行嚴格的數據驗證,確保接收到的數據符合預期格 ...