最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

python代碼規(guī)范之異常,規(guī)則,函數(shù)返回值使用解讀

 更新時(shí)間:2025年12月31日 09:14:57   作者:StanwenRen  
文章主要介紹了Python的集合、自定義哈希對(duì)象、數(shù)據(jù)類、字符串格式化、容器、異常處理、函數(shù)返回建議以及Django框架中的AnonymousUser等知識(shí)點(diǎn)

一:python的規(guī)則

1:集合的規(guī)則

  • 規(guī)則: 如果要把一個(gè)東西裝到集合中去,這個(gè)東西必須是可以哈希的
  • 可變類型都是不可哈希的。(列表, 集合,字典),本質(zhì)就是哈希值不固定。
  • 思維1: 對(duì)于存在A,不存在B等問(wèn)題,思維定式就是采用集合思維處理。
  • 思維2: 我們可以自定義哈希對(duì)象。

案例:

給定兩個(gè)列表套字典的數(shù)據(jù),數(shù)據(jù)內(nèi)容是人員(姓名,電話相同,則默認(rèn)就是同一個(gè)人),我們要求是找出存在A列表,但是不存在B列表的人員。

list_a = [
    {'first_name': 'Ren', 'last_name': 'shanshan', 'phone_num': '12345678'},
  {'first_name': 'Wang', 'last_name': 'gang', 'phone_num': '12323338'},
    {'first_name': 'Li', 'last_name': 'ruixue', 'phone_num': '123389278'},
]

list_b = [
    {'first_name': 'Ren', 'last_name': 'shanshan', 'phone_num': '12345678'},
    {'first_name': 'Wang', 'last_name': 'gang', 'phone_num': '12323338'},
    {'first_name': 'Xu', 'last_name': 'daer', 'phone_num': '125545678'},
]


class People(object):

    def __init__(self, first_name, last_name, phone_num):
        self.first_name = first_name
        self.last_name = last_name
        self.phone_num = phone_num

    def __hash__(self):
        # 默認(rèn)是內(nèi)存地址的哈希,這里我們改成名字+電話這樣的一個(gè)元組的哈希值。
        return hash(
            (self.first_name, self.last_name, self.phone_num)
        )

    def __eq__(self, other):
        # 如果傳入的對(duì)象是當(dāng)前類的對(duì)象,并且哈希值兩者相等,則返回True。
        if isinstance(other, People) and hash(other) == hash(self):
            return True
        return False

# 將字典構(gòu)造成哈希對(duì)象,然后加入集合中
set_1 = set(People(**p) for p in list_a)
set_2 = set(People(**p) for p in list_b)
# 使用集合的差
end_set = set_1 - set_2

for item in end_set:
    print(item.first_name, item.last_name, item.phone_num)
    # Li ruixue 123389278

使用python3.7版本之后的數(shù)據(jù)類: dataclasses。

from dataclasses import dataclass

@dataclass(unsafe_hash=True)
class People(object):
    first_name: str
    last_name: str
    phone_num: str


set_1 = set(People(**p) for p in list_a)
set_2 = set(People(**p) for p in list_b)

end_set = set_1 - set_2

for item in end_set:
    print(item.first_name, item.last_name, item.phone_num)
    # Li ruixue 123389278

2:__format__對(duì)象字符串格式化

1: 需求: 對(duì)于自己定義的People對(duì)象,打印出不同的信息。

class People(object):

    def __init__(self, name, age):
        self.name = name
        self.age = age

    def __format__(self, format_spec):
        if format_spec == 'long':
            return f'{self.name} is {self.age} years old!'
        elif format_spec == 'simple':
            return f'{self.name} ({self.age})'
        raise ValueError('invalid format spec')


p = People(name='liangshan', age=23)
print('{0:simple}'.format(p))
# liangshan (23)
print('{0:long}'.format(p))
# liangshan is 23 years old!

3:__getitem__方法定義容器

1: 如果我想定義一個(gè)容器,那么肯定要考慮的就是容器取長(zhǎng)度的方法,容器取第幾個(gè)元素方法。

class Events:
    def __init__(self, events):
        self.events = events

    def __len__(self):
        """自定義長(zhǎng)度,將會(huì)被用來(lái)做布爾判斷"""
        return len(self.events)

    def __getitem__(self, index):
        """自定義切片方法"""
        # 直接將 slice 切片對(duì)象透?jìng)鹘o events 處理
        return self.events[index]


events = Events([
    'computer started',
    'os launched',
    'docker started',
    'os stopped',
])

# 理解: if events 對(duì)調(diào)用里面的__len__方法,通過(guò)返回是否是0來(lái)判斷是否是None
# events使用切片的時(shí)候,會(huì)調(diào)用events的__getitem__方法,
# 而我們直接調(diào)用self的切片操作,相當(dāng)于又調(diào)用了list中的__getitem__方法。也就是說(shuō)
# 只要是實(shí)例化Events的時(shí)候,是可以使用切片的,則這個(gè)類的對(duì)象也是可以使用切片的。
if events:
    print(events[1:3])

二:python異常處理三個(gè)習(xí)慣

1: 只做最精準(zhǔn)的異常捕獲,每個(gè)異常捕獲只處理一個(gè)容易錯(cuò)的地方。

2:避免拋出高于當(dāng)前抽象級(jí)別的異常外,我們同樣應(yīng)該避免泄露低于當(dāng)前抽象級(jí)別的異常。

3:連續(xù)異常,注意使用上下文管理器。

def upload_avatar(request):
    """用戶上傳新頭像"""
    try:
        avatar_file = request.FILES['avatar']
    except KeyError:
        raise error_codes.AVATAR_FILE_NOT_PROVIDED

    try:
       resized_avatar_file = resize_avatar(avatar_file)
    except FileTooLargeError as e:
        raise error_codes.AVATAR_FILE_TOO_LARGE
    except ResizeAvatarError as e:
        raise error_codes.AVATAR_FILE_INVALID

    try:
        request.user.avatar = resized_avatar_file
        request.user.save()
    except Exception:
        raise error_codes.INTERNAL_SERVER_ERROR
    return HttpResponse({})

下面代碼連續(xù)的異常,讓我們看到眼花繚亂。

使用上下文管理器管理異常:

class Resource(object):

    def __enter__(self):
        print("連接資源")
        return self

    def __exit__(self, exc_type, exc_val, exc_tb):
        print("關(guān)閉資源")
        return True

    def operate(self):
        1 / 0


with Resource() as res:
    res.operate()
# 不會(huì)報(bào)錯(cuò)
  • 什么是上下文管理器?
  • 答: 一個(gè)類實(shí)現(xiàn)了__enter__方法和__exit__方法,則這個(gè)類的實(shí)例就是上下文管理器。
  • 上下文管理器的強(qiáng)大在于__exit__中你可以決定是拋出異常還是在這里解決。

三:函數(shù)返回建議

1: 單個(gè)函數(shù),返回值不要有多種類型。

2: partial函數(shù)構(gòu)造函數(shù)

def multiply(x, y):
    return x * y
def double(value):
    # 返回另一個(gè)函數(shù)調(diào)用結(jié)果
    return multiply(2, value)
from functools import partial
# partial函數(shù)是專門(mén)用來(lái)基于一個(gè)函數(shù)來(lái)構(gòu)造一個(gè)新的函數(shù)的。
# 參數(shù)1: 函數(shù)名
# 其余參數(shù)就是被基于的函數(shù)的參數(shù)。
def multiply(x, y):
    return x * y


double = partial(multiply, 2)

3: 不要返回結(jié)果和錯(cuò)誤,而是選擇拋出異常。

4:謹(jǐn)慎使用None返回

  • None作為默認(rèn)返回值(沒(méi)有問(wèn)題)
  • None作為意料之中的返回值(沒(méi)有問(wèn)題)
  • None作為調(diào)用失敗返回值, 不推薦使用,更改為異常捕獲方式。

5:合理返回空對(duì)象

  • 對(duì)于返回為None的地方,我們?cè)诮邮芊祷刂档牡胤骄鸵褂卯惓2东@,判斷是否為None,這非常的麻煩。
  • Django 框架里的 AnonymousUser 就是一個(gè)典型的 null object。

原理:

就是使用一個(gè)符合正常結(jié)果接口的“空類型”來(lái)替代空值返回/拋出異常,以此來(lái)降低調(diào)用方處理結(jié)果的成本。

案例:

class Account:
    # def __init__ 已省略... ...
    
    @classmethod
    def from_string(cls, s):
        """從字符串初始化一個(gè)賬號(hào)

        :returns: 如果輸入合法,返回 Account object,否則返回 NullAccount
        """
        try:
            username, balance = s.split()
            balance = decimal.Decimal(float(balance))
        except ValueError:
            return NullAccount()

        if balance < 0:
            return NullAccount()
        return cls(username=username, balance=balance)


class NullAccount:
    username = ''
    balance = 0

    @classmethod
    def from_string(cls, s):
        raise NotImplementedError

6:返回生成器,而不是返回列表。

# 返回列表
def test01(my_list):
    res_list = []
    for item in my_list:
        res_list.append(item * 2)
    return res_list


# 返回生成器
def test02(my_list):
    for item in my_list:
        yield item * 2


my_list = [1, 2, 3, 4, 5]
print(test01(my_list))
# [2, 4, 6, 8, 10]
print(test02(my_list))
# <generator object test02 at 0x000001A6C693A2A0>
for item in test02(my_list):
    print(item)

7:盡量不要使用遞歸

  • python不支持尾遞歸優(yōu)化。
  • python遞歸有最大層數(shù)限制。

總結(jié)

以上為個(gè)人經(jīng)驗(yàn),希望能給大家一個(gè)參考,也希望大家多多支持腳本之家。

相關(guān)文章

  • Python讀取TIF影像的多種方法

    Python讀取TIF影像的多種方法

    Python提供了豐富的庫(kù)來(lái)讀取和處理TIFF文件,其中PIL庫(kù)是最常用的,本文給大家介紹Python讀取TIF影像的幾種方法,需要的朋友可以參考下
    2023-07-07
  • Python 排序最長(zhǎng)英文單詞鏈(列表中前一個(gè)單詞末字母是下一個(gè)單詞的首字母)

    Python 排序最長(zhǎng)英文單詞鏈(列表中前一個(gè)單詞末字母是下一個(gè)單詞的首字母)

    這篇文章主要介紹了Python 排序最長(zhǎng)英文單詞鏈(列表中前一個(gè)單詞末字母是下一個(gè)單詞的首字母),列表中每個(gè)元素相當(dāng)于一個(gè)單詞,要實(shí)現(xiàn)列表中前一個(gè)單詞末字母是下一個(gè)單詞的首字母,并且這個(gè)鏈?zhǔn)亲铋L(zhǎng)的。感興趣的可以了解一下
    2020-12-12
  • Python中SQLite數(shù)據(jù)庫(kù)的使用

    Python中SQLite數(shù)據(jù)庫(kù)的使用

    SQLite是一種輕型關(guān)系型數(shù)據(jù)庫(kù),常用于嵌入式設(shè)備和移動(dòng)應(yīng)用中。Python中內(nèi)置了SQLite模塊,可用于連接和操作SQLite數(shù)據(jù)庫(kù)。通過(guò)Python SQLite模塊,可以方便地創(chuàng)建、查詢和修改數(shù)據(jù)庫(kù)中的數(shù)據(jù),支持事務(wù)處理和數(shù)據(jù)庫(kù)操作的原子性保證
    2023-04-04
  • 使用Python在Excel文檔中創(chuàng)建表格并應(yīng)用表格樣式

    使用Python在Excel文檔中創(chuàng)建表格并應(yīng)用表格樣式

    本文介紹了使用FreeSpire.XLS for Python在Excel中創(chuàng)建表格并應(yīng)用各種內(nèi)置樣式的方法,通過(guò)編程實(shí)現(xiàn)數(shù)據(jù)的自動(dòng)格式化,提升報(bào)表的專業(yè)性和效率,涵蓋淺色、中等和深色樣式系列,以及配置總計(jì)行、行條紋、列條紋和篩選功能,需要的朋友可以參考下
    2026-04-04
  • Python如何按單元格讀取復(fù)雜電子表格(Excel)的數(shù)據(jù)

    Python如何按單元格讀取復(fù)雜電子表格(Excel)的數(shù)據(jù)

    這篇文章主要介紹了Python如何按單元格讀取復(fù)雜電子表格(Excel)的數(shù)據(jù)問(wèn)題,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教
    2023-06-06
  • python用faker庫(kù)批量生成假數(shù)據(jù)

    python用faker庫(kù)批量生成假數(shù)據(jù)

    這篇文章主要介紹了python用faker庫(kù)批量生成假數(shù)據(jù),幫助大家更好的理解和學(xué)習(xí)使用python,感興趣的朋友可以了解下
    2021-03-03
  • Django報(bào)錯(cuò)TemplateDoesNotExist的問(wèn)題及解決

    Django報(bào)錯(cuò)TemplateDoesNotExist的問(wèn)題及解決

    這篇文章主要介紹了Django報(bào)錯(cuò)TemplateDoesNotExist的問(wèn)題及解決方案,具有很好的參考價(jià)值,希望對(duì)大家有所幫助,如有錯(cuò)誤或未考慮完全的地方,望不吝賜教
    2023-08-08
  • python 如何讀取列表中字典的value值

    python 如何讀取列表中字典的value值

    這篇文章主要介紹了python 如何讀取列表中字典的value值,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教
    2022-02-02
  • 解決pandas無(wú)法在pycharm中使用plot()方法顯示圖像的問(wèn)題

    解決pandas無(wú)法在pycharm中使用plot()方法顯示圖像的問(wèn)題

    今天小編就為大家分享一篇解決pandas無(wú)法在pycharm中使用plot()方法顯示圖像的問(wèn)題,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。一起跟隨小編過(guò)來(lái)看看吧
    2018-05-05
  • Django def clean()函數(shù)對(duì)表單中的數(shù)據(jù)進(jìn)行驗(yàn)證操作

    Django def clean()函數(shù)對(duì)表單中的數(shù)據(jù)進(jìn)行驗(yàn)證操作

    這篇文章主要介紹了Django def clean()函數(shù)對(duì)表單中的數(shù)據(jù)進(jìn)行驗(yàn)證操作,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。一起跟隨小編過(guò)來(lái)看看吧
    2020-07-07

最新評(píng)論

扬州市| 洛川县| 车险| 富蕴县| 即墨市| 府谷县| 巴东县| 城市| 汉寿县| 成武县| 海门市| 南靖县| 宁海县| 同江市| 法库县| 顺昌县| 马鞍山市| 西安市| 凤山市| 略阳县| 平昌县| 秦皇岛市| 永修县| 察雅县| 肥东县| 莒南县| 香港| 调兵山市| 屏边| 交城县| 得荣县| 沙洋县| 循化| 池州市| 教育| 贡山| 甘德县| 大埔区| 南漳县| 阳原县| 磐石市|