日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程语言 > python >内容正文

python

Python代码整洁之道勘误

發布時間:2023/12/10 python 29 豆豆
生活随笔 收集整理的這篇文章主要介紹了 Python代码整洁之道勘误 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.
  • 簡介:

本博文是對<Python代碼整潔之道>一書的一些錯誤進行矯正.
這本書英文名字是<Clean Python Elegant Coding int Python>
這本書的作者是Sunil Kapil. 這本書錯誤非常多, 真的是非常非常多

  • ps:

我由于沒有更多的精力來閱讀全本的英文版本,所以可能有些地方的錯誤需要大家
補充

p6

代碼清單1-10 以函數形式對字典排序

def get_sorted_dictionary(users):"""Sort the nested dictionary"""if not isinstance(users, dict):raise ValueError("Not a correct dictionary")if not len(users):raise ValueError("Empty dictionary")users_by_name = sorted(users, key=get_user_name)return users_by_name

這里的users此時是list實例, 所以應該是isinstance(users, list)


p7

代碼清單1-12 以更具可讀性的代碼讀取一個csv文件

import csv with open('employee.txt', mode='r') as csv_file:csv_reader = csv.DictReader(csv_file)line_count = 0process_salary(csv_reader)

這里是一個employee.txt的example, 可以寫入后改為csv文件
第一行第表頭columns,其余行是表信息

name,country,age,salary clarence,US,23,20k bob,Canada,29,40k ruby,Japan,28,16k

這里打開文件應該是employee.csv文件, 原著作者應該是創建并寫入employee.txt然后修改后綴名為csv, 所以寫代碼的時候忽略了


p11

7 比較類型時更偏向使用isintance()方法而不是type()

user_ages = {"Larry": 35, "Jon": 89, "Imli": 12} type(user_ages) == dict

這里最好是type(user_ages) is dict


p22

1.3.2 不要使用復雜的列表推導

ages = [1, 34, 5, 7, 3, 57, 356] old = [age for age in ages if 10 < age < 100 and age is not None]

如果要校驗,那么寫在and邏輯運算符前面,注意短路


p23

1.3.3 應該使用lambda嗎
關于函數功能描述有誤(原版和譯版)
這里如果是找到列表中含有最小值的元素,應該這樣

def min_val(data):"""Find minimum value from the data list."""return min(data, key=lambda x:len(x))

改為return min(data, key=lambda x: min(x))


p27

1.3.6 為什么range函數在Python3中更好
譯者翻譯有誤

原文是:

If you have worked with Python 2, you might have used xrange. In Python 3, xrange has been renamed to range with some extra features. range is similar to xrange and generate an iterable.

譯文里range類似于xrange并生成一個迭代器

應該是range與xrange相似, 并且產生一個可迭代對象, 這也許會對初中級的python使用者產生困擾.


p32

1.4.4 只處理特定的異常
如下是譯者自己附加的解釋, 但except Exception:并不是處理所有異常

(except: 或者except Exception將處理所有的異常, 它會導致代碼隱藏不想隱藏的關鍵錯誤 或異常.)
  • 官方文檔如下關于exception Exception的描述
exception Exception All built-in, non-system-exiting exceptions are derived from this class. All user-defined exceptions should also be derived from this class.
  • 異常結構圖
BaseException+-- SystemExit+-- KeyboardInterrupt+-- GeneratorExit+-- Exception+-- StopIteration+-- StopAsyncIteration+-- ArithmeticError| +-- FloatingPointError| +-- OverflowError| +-- ZeroDivisionError+-- AssertionError+-- AttributeError+-- BufferError+-- EOFError+-- ImportError| +-- ModuleNotFoundError+-- LookupError| +-- IndexError| +-- KeyError+-- MemoryError+-- NameError| +-- UnboundLocalError+-- OSError| +-- BlockingIOError| +-- ChildProcessError| +-- ConnectionError| | +-- BrokenPipeError| | +-- ConnectionAbortedError| | +-- ConnectionRefusedError| | +-- ConnectionResetError| +-- FileExistsError| +-- FileNotFoundError| +-- InterruptedError| +-- IsADirectoryError| +-- NotADirectoryError| +-- PermissionError| +-- ProcessLookupError| +-- TimeoutError+-- ReferenceError+-- RuntimeError| +-- NotImplementedError| +-- RecursionError+-- SyntaxError| +-- IndentationError| +-- TabError+-- SystemError+-- TypeError+-- ValueError| +-- UnicodeError| +-- UnicodeDecodeError| +-- UnicodeEncodeError| +-- UnicodeTranslateError+-- Warning+-- DeprecationWarning+-- PendingDeprecationWarning+-- RuntimeWarning+-- SyntaxWarning+-- UserWarning+-- FutureWarning+-- ImportWarning+-- UnicodeWarning+-- BytesWarning+-- EncodingWarning+-- ResourceWarning

except Exception:捕獲所有的非系統退出異常, 除此之外還有系統退出、鍵盤中斷、生成器退出異常
except: 捕獲所有類型的異常


p33

1.4.4 只處理特定的異常
這里描述錯誤, 應該是Get list of even numbers from given list

def get_even_list(num_list):"""Get list of odd numbers from given list."""# This can raise NoneType or TypeError exceptionsreturn [item for item in num_list if item%2==0]
p39

2.1.1 使用集合
集合是無序不重復元素, 不支持索引、切片以及任何序列行為
序列是字符串、列表和元組,集合不是序列

如下是原文和譯文

原文: They don’t allow duplicates. ? You can’t access set elements using an index. ? Sets can access elements in O(1) time since they use hashtables. ? Sets don’t allow some common operations that lists do like slicing and lookups. ? Sets can sort the elements at insertion time. 譯文: ? 集合元素不能重復 ? 不支持索引訪問集合里的元素 譯者翻譯錯誤,集合底層就是散列表,而不是使用散列表 ? 集合使用散列表之后,可以在O(1)時間內訪問元素 譯者翻譯錯誤,"糾正"了原文,很遺憾,也是錯誤的,集合不支持,原文是正確的 ? 集合支持一些常見的操作,如列表的切片和查詢 集合是無序的,這條是不成立的 ? 集合可以在插入元素時對元素進行排序
p39

代碼清單2-1 使用集合訪問數據
譯者對于描述信息出現了"直譯"
正確為該項在內存中的位置的因素之一是對象的哈希值

原文: Sets are implemented using hashtables, so whenever a new item is added to a set, the positioning of the item in memory is determined by the hash of the object. 譯文: 集合是使用散列表實現的,因此每當一個新項添加到集合中時, 該項在內存中的 位置由散列的對象確定.
p39

代碼清單2-2 使用集合去重
描述錯誤集合

原文: 集合可用作字典的鍵, 也可以使用集合用作其他數據結構的鍵, 如列表(list)

集合是可變的, 不可哈希,不能用于字典的鍵

In [1]: l = {1, 2, 3} In [2]: l.__hash__ is None Out[2]: True In [3]: getattr(l, "__hash__") is None Out[3]: True In [4]: callable(l.__hash__) Out[4]: False In [5]: hash(l) --------------------------------------------------------------------------- TypeError Traceback (most recent call last) Input In [5], in <cell line: 1>() ----> 1 hash(l) TypeError: unhashable type: 'set'
p45

代碼清單2-9 使用列表返回素數
代碼錯誤, 多出來一行
正確示例如下

#!usr/bin/python # -*- coding:utf8 -*- def get_prime_numbers(lower, higher):primes = []for num in range(lower, higher + 1):is_prime = Truefor item in range(2, int(num ** 0.5) + 1):if num % item == 0:is_prime = Falsebreakif is_prime:primes.append(num)return primesif __name__ == '__main__':print(get_prime_numbers(1, 7))
p45

代碼清單2-10 對素數使用生成器
is_prime函數比較奇怪,修改后如下

#!usr/bin/python # -*- coding:utf8 -*- import mathdef is_prime(num):for item in range(2, int(math.sqrt(num)) + 1):if num % item == 0:return False return True
p48

2.1.6 使用Python的內置函數
譯者對于csv模塊描述信息出現了"直譯"

正確譯文 csv Use csv for reading and writing CSV files. It will save you lot of time instead of writing your own methods while reading files. csv模塊用于讀寫csv文件. 它能幫助你讀寫時節省大量的時間,你不需要重復造輪子
p50

代碼清單2-15 使用__future__

from __future__ import division
p54

2.2.3 有序字典、默認字典、普通字典
對于描述部分有"直譯"

As of Python 3.6, dicts are now ordered by insertion order, which actually reduces the usefulness of ordereddict python3.6之后(包含), 字典根據插入順序排序, 所以ordereddict自然就基本上沒有 用武之地了,除非要兼容
p64

代碼清單3-5 引發一個異常而不是None
正確代碼如下

#!usr/bin/python # *- coding:utf8 -*- def read_lines_for_python(file_name, file_type):if file_type not in ("txt", "html"):raise ValueError("Not correct file format")if not file_name:raise IOError("File Not Found")filename = "".join([file_name, ".", file_type])with open(filename, "r") as fileread:for line in fileread:if "python" in line:return "Found Python"if __name__ == '__main__':if not read_lines_for_python("file_without_python_name", "pdf"):print("Python keyword doesn't exists in file")
p66

代碼清單3-11 顯示地返回None
譯文出現"直譯"

正確譯文如下 Here you expect the result to be a value in the sum function, which is misleading because it could return None or a sum of two numbers. So, you always need to check the result for None, which is too much noise in the code and makes the code more complex over time 你期望sum函數返回的是一個值, 如果返回None或者兩數之和會是一種誤導 在這種情況下,你需要不斷的檢查sum的返回結果是否為None. 代碼會隨著時間變得 混亂和復雜
p67

代碼清單3-13 顯示地返回None
代碼清單3-14 不顯示地返回None
原文判斷numbers是list及其子類的實例邏輯錯誤
對于函數功能描述錯誤
正確如下

def find_odd_number(numbers):odd_numbers = []if not isinstance(numbers, list):return Nonefor item in numbers:if item % 2 != 0:odd_numbers.append(item)return odd_numbersnum = find_odd_number([2, 4, 6, 7, 8, 10]) # return 7 num = find_odd_number((2, 4, 6, 7, 8, 10)) # return None num = find_odd_number([2, 4, 6, 8, 10]) # return [] """ This function by default returns None if it does not find an odd number. The function also returns None if the type of numbers is not a list. 如果numbers的類型不是list,那么返回的是[]空列表,不是None """
p68

3.1.5 編寫函數時注意防御
代碼清單3-15 Python中的日志記錄
代碼清單中代碼有好幾處錯誤,正確如下所示

#!usr/bin/python # *- coding:utf8 -*- import os import logging from logging import StreamHandlercurrent_filename = os.path.basename(__file__) logger = logging.getLogger(current_filename) handler = StreamHandler() handler.setLevel(logging.WARNING) format_c = logging.Formatter("%(name)s---%(levelname)s---%(message)s") handler.setFormatter(format_c) logger.addHandler(handler)def division(divident, divisor):try:return divident/divisorexcept ZeroDivisionError:logger.error("Zero Division Error")if __name__ == '__main__':num = division(4, 0) # 錯誤結果如下 # filename.py---ERROR---Zero Division Error

總結

以上是生活随笔為你收集整理的Python代码整洁之道勘误的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。

主站蜘蛛池模板: 女人久久久 | 女同久久另类69精品国产 | 国产精品久久久久毛片大屁完整版 | 国产精品视频免费观看 | 色婷婷亚洲 | 精品福利在线视频 | 性激烈视频在线观看 | 最新国产三级 | 国产三级在线免费观看 | 亚洲午夜久久久久久久久红桃 | 致单身男女免费观看完整版 | 98精品视频 | 欧美成人精品一区二区免费看片 | 久久久久国色av免费观看性色 | 中文在线一区二区三区 | 国产91色 | 九色91porny| 免费av资源 | 蜜桃网av| 日韩亚洲欧美中文字幕 | 黄色三级在线视频 | av自拍偷拍 | 中文字幕 亚洲一区 | 强行挺进皇后紧窄湿润小说 | 久久久久国产一区 | 国产精品美女久久久久图片 | av三级网站 | 国产妻精品一区二区在线 | 色中色av | 香蕉人妻av久久久久天天 | 久久av红桃一区二区小说 | 国内自拍99| av免费观看不卡 | 日韩一区二区免费播放 | 一级全黄少妇性色生活片 | 久久蜜臀| 性的免费视频 | 亚洲一区二区人妻 | 91在线导航| 亚洲黄色精品视频 | 日韩经典午夜福利发布 | 国产一区二区三区四区五区在线 | 九一av| 91精品国产99久久久久久 | 黄色av三级 | 91免费入口| 又黄又爽一区二区三区 | 欧美视频一区二区在线 | 欧美黑吊大战白妞欧美大片 | 一级片在线视频 | 亚洲欧美综合另类自拍 | 欧美日韩久久 | 污视频在线观看网址 | 亚洲精品一线二线三线 | 91丨porny丨 | 很黄很污的视频 | 97caoporn| 天天干天天草 | 黄色一级大片免费版 | 高跟丝袜av | 久久久久中文 | 日韩中文字幕av电影 | 四季av国产一区二区三区 | 美日韩丰满少妇在线观看 | 狠狠精品干练久久久无码中文字幕 | 97人妻精品一区二区三区动漫 | 欧美色哟哟 | 人成网站在线观看 | 日韩av免费在线播放 | 波多野结衣一区二区三区在线观看 | 久久久噜噜噜久久 | 国产调教打屁股xxxx网站 | www.久久久久久久久久 | 国产精品精品国产色婷婷 | 欧美视频在线一区 | 欧美日韩视频一区二区 | 亚洲国产第一区 | 亚洲AV无码国产日韩久久 | 黑人精品欧美一区二区蜜桃 | 成人在线免费小视频 | 丰满av| 啪啪啪一区二区 | 伦理片一区二区 | 国产精品污污 | 成人深夜网站 | www.rihan | 成人在线免费播放 | 老鸭窝视频在线观看 | 波多野吉衣中文字幕 | 91色多多| 成人动漫免费在线观看 | 免费h片网站 | 国产亚洲精久久久久久无码77777 | 亚洲无毛视频 | 特级西西人体444www | 激情四射网| 天天干夜夜干 | 日本三级韩国三级三级a级按摩 | 国产九九九九九 |