Python 데이터 구조: 과소평가된 명명된 튜플(1)
Python 튜토리얼 열에서는 Python 데이터 구조의 Namedtuple을 소개합니다.
이 기사에서는 Python에서 namedtuple
의 주요 사용법에 대해 설명합니다. namedtuple
의 개념을 더 얕은 것부터 더 깊은 것까지 소개하겠습니다. 이를 사용하는 이유와 사용 방법을 배우면 더 깔끔한 코드가 생성됩니다. 이 가이드를 공부한 후에는 즐겨 사용하게 될 것입니다. namedtuple
的重点用法。我们将由浅入深的介绍namedtuple
的各概念。您将了解为什么要使用它们,以及如何使用它们,从而是代码更简洁。在学习本指南之后,你一定会喜欢上使用它。
学习目标
在本教程结束时,您应该能够:
- 了解为什么以及何时使用它
- 将常规元组和字典转换为
Namedtuple
- 将
Namedtuple
转化为字典或常规元组 - 对
Namedtuple
列表进行排序 - 了解
Namedtuple
和数据类(DataClass)之间的区别 - 使用可选字段创建
Namedtuple
- 将
Namedtuple
序列化为JSON - 添加文档字符串(docstring)
为什么要使用namedtuple
?
namedtuple
是一个非常有趣(也被低估了)的数据结构。我们可以轻松找到严重依赖常规元组和字典来存储数据的Python代码。我并不是说,这样不好,只是有时候他们常常被滥用,且听我慢慢道来。
假设你有一个将字符串转换为颜色的函数。颜色必须在4维空间RGBA中表示。
def convert_string_to_color(desc: str, alpha: float = 0.0): if desc == "green": return 50, 205, 50, alpha elif desc == "blue": return 0, 0, 255, alpha else: return 0, 0, 0, alpha复制代码
然后,我们可以像这样使用它:
r, g, b, a = convert_string_to_color(desc="blue", alpha=1.0)复制代码
好的,可以。但是我们这里有几个问题。第一个是,无法确保返回值的顺序。也就是说,没有什么可以阻止其他开发者这样调用
convert_string_to_color: g, b, r, a = convert_string_to_color(desc="blue", alpha=1.0)复制代码
另外,我们可能不知道该函数返回4个值,可能会这样调用该函数:
r, g, b = convert_string_to_color(desc="blue", alpha=1.0)复制代码
于是,因为返回值不够,抛出ValueError
학습 목표
이 튜토리얼이 끝나면 다음을 수행할 수 있어야 합니다.문자열을 색상으로 변환하는 함수가 있다고 가정해보세요. 색상은 4차원 공간 RGBA로 표현되어야 합니다.
- 이 튜토리얼을 사용하는 이유와 시기 이해
- 일반 튜플과 사전을
Namedtuple
로 변환Namedtuple
을 사전이나 일반 튜플로 변환- 을
Namedtuple
목록 정렬Namedtuple
과 데이터 클래스(DataClass)의 차이점 이해- 선택 필드 Namedtuple을 사용하여
code>만들기
Namedtuple
을 JSON으로 직렬화- 문서 문자열(docstring) 추가
namedtuple
을 사용하는 이유는 무엇입니까?
namedtuple
은 매우 흥미롭고 과소평가된 데이터 구조입니다. 데이터를 저장하기 위해 일반 튜플과 사전에 크게 의존하는 Python 코드를 쉽게 찾을 수 있습니다. 그게 나쁘다고 말하는 게 아니라, 가끔 학대를 당하는 경우가 많다는 점을 말씀드리겠습니다.
def convert_string_to_color(desc: str, alpha: float = 0.0): if desc == "green": return {"r": 50, "g": 205, "b": 50, "alpha": alpha} elif desc == "blue": return {"r": 0, "g": 0, "b": 255, "alpha": alpha} else: return {"r": 0, "g": 0, "b": 0, "alpha": alpha}复制代码
color = convert_string_to_color(desc="blue", alpha=1.0)复制代码
from collections import namedtuple ... Color = namedtuple("Color", "r g b alpha") ...def convert_string_to_color(desc: str, alpha: float = 0.0): if desc == "green": return Color(r=50, g=205, b=50, alpha=alpha) elif desc == "blue": return Color(r=50, g=0, b=255, alpha=alpha) else: return Color(r=50, g=0, b=0, alpha=alpha)复制代码
{"r": 0, “g”: 0, “b”: 0, “alpha”: alpha}
为{”red": 0, “green”: 0, “blue”: 0, “a”: alpha}
,则在访问字段时会得到KeyError
返回,因为键r,g,b
和alpha
不再存在。字典的第二个问题是它们不可散列。这意味着我们无法将它们存储在set或其他字典中。假设我们要跟踪特定图像有多少种颜色。如果我们使用collections.Counter
计数,我们将得到TypeError: unhashable type: ‘dict’
。
而且,字典是可变的,因此我们可以根据需要添加任意数量的新键。相信我,这是一些很难发现的令人讨厌的错误点。
好的,很好。那么现在怎么办?我可以用什么代替呢?
namedtuple
!对,就是它!
将我们的函数转换为使用namedtuple
:
color = convert_string_to_color(desc="blue", alpha=1.0) ... has_alpha = color.alpha > 0.0... is_black = color.r == 0 and color.g == 0 and color.b == 0复制代码
与dict的情况一样,我们可以将值分配给单个变量并根据需要使用。无需记住顺序。而且,如果你使用的是诸如PyCharm和VSCode之类的IDE ,还可以自动提示补全。
>>> blue = Color(r=0, g=0, b=255, alpha=1.0)>>> blue.e = 0--------------------------------------------------------------------------- AttributeError Traceback (most recent call last) <ipython-input-13-8c7f9b29c633> in <module> ----> 1 blue.e = 0AttributeError: 'Color' object has no attribute 'e'复制代码
最重要的是namedtuple
是不可变的。如果团队中的另一位开发人员认为在运行时添加新字段是个好主意,则该程序将报错。
>>> Counter([blue, blue])>>> Counter({Color(r=0, g=0, b=255, alpha=1.0): 2})复制代码
不仅如此,现在我们可以使用它Counter来跟踪一个集合有多少种颜色。
>>> c = {"r": 50, "g": 205, "b": 50, "alpha": alpha}>>> Color(**c)>>> Color(r=50, g=205, b=50, alpha=0)复制代码
如何将常规元组或字典转换为 namedtuple
现在我们了解了为什么使用namedtuple,现在该学习如何将常规元组和字典转换为namedtuple了。假设由于某种原因,你有包含彩色RGBA值的字典实例。如果要将其转换为Color namedtuple
,则可以按以下步骤进行:
>>> c = {"r": 50, "g": 205, "b": 50, "alpha": alpha}>>> Color = namedtuple("Color", c)>>> Color(**c) Color(r=50, g=205, b=50, alpha=0)复制代码
我们可以利用该**
结构将包解压缩dict
为namedtuple
를 호출하는 것을 막을 방법이 없습니다. 게다가 우리는 함수가 4개의 값을 반환한다는 것을 모르고 다음과 같이 함수를 호출할 수도 있습니다. 값이 충분하지 않아 ValueError
오류가 발생하고 호출이 실패했습니다.
맞습니다. 하지만 사전을 사용하면 어떨까?
Python의 사전은 매우 다양한 데이터 구조입니다. 여러 값을 저장하는 편리한 방법입니다. 그러나 사전에도 단점이 없는 것은 아닙니다. 유연성 때문에 사전은 쉽게 남용됩니다. 허락하다 사전을 사용하여 예를 살펴보겠습니다.
>>> blue = Color(r=0, g=0, b=255, alpha=1.0)>>> blue._asdict() {'r': 0, 'g': 0, 'b': 255, 'alpha': 1.0}复制代码
좋아, 이제 다음과 같이 하나의 값만 반환될 것으로 예상하여 다음과 같이 사용할 수 있습니다.
>>> tuple(Color(r=50, g=205, b=50, alpha=0.1)) (50, 205, 50, 0.1)复制代码
{"r": 0, "g": 0, "b": 0, "alpha": alpha}
에서 {"red": 0, "green으로 변경하면 ”: 0, “blue”: 0, “a”: alpha}
, 키가 r, g, bKeyError
가 발생합니다. /code> code> 및 alpha
는 더 이상 존재하지 않습니다. 🎜🎜사전의 두 번째 문제점은 해시 가능하지 않다는 것입니다. 즉, 세트나 다른 사전에 저장할 수 없습니다. 특정 이미지에 얼마나 많은 색상이 있는지 추적하고 싶다고 가정해 보겠습니다. collections.Counter
를 사용하여 계산하면 TypeError: unhashable type: 'dict'
가 발생합니다. 🎜🎜또한 사전은 변경 가능하므로 필요한 만큼 새 키를 추가할 수 있습니다. 저를 믿으십시오. 이것은 발견하기 어려운 불쾌한 버그 지점입니다. 🎜🎜알겠습니다. 그럼 이제 어떡하지? 대신 무엇을 사용할 수 있나요? 🎜🎜네임튜플
! 예, 바로 그거예요! 🎜🎜 namedtuple
을 사용하도록 함수를 변환합니다. 🎜from operator import attrgetter ... colors = [ Color(r=50, g=205, b=50, alpha=0.1), Color(r=50, g=205, b=50, alpha=0.5), Color(r=50, g=0, b=0, alpha=0.3) ] ...>>> sorted(colors, key=attrgetter("alpha")) [Color(r=50, g=205, b=50, alpha=0.1), Color(r=50, g=0, b=0, alpha=0.3), Color(r=50, g=205, b=50, alpha=0.5)]复制代码
>>> blue = Color(r=0, g=0, b=255, alpha=1.0)>>> import json>>> json.dumps(blue._asdict())'{"r": 0, "g": 0, "b": 255, "alpha": 1.0}'复制代码
namedtuple
이 변경 불가능하다는 것입니다. 팀의 다른 개발자가 런타임에 새 필드를 추가하는 것이 좋다고 생각하면 프로그램에서 오류를 보고합니다. 🎜_Color = namedtuple("Color", "r g b alpha") class Color(_Color): """A namedtuple that represents a color. It has 4 fields: r - red g - green b - blue alpha - the alpha channel """ >>> print(Color.__doc__) A namedtuple that represents a color. It has 4 fields: r - red g - green b - blue alpha - the alpha channel >>> help(Color) Help on class Color in module __main__: class Color(Color) | Color(r, g, b, alpha) | | A namedtuple that represents a color. | It has 4 fields: | r - red | g - green | b - blue | alpha - the alpha channel | | Method resolution order: | Color | Color | builtins.tuple | builtins.object | | Data descriptors defined here: | | __dict__ | dictionary for instance variables (if defined)复制代码
>>> Color.__doc__ = """A namedtuple that represents a color. It has 4 fields: r - red g - green b - blue alpha - the alpha channel """复制代码
일반 튜플이나 사전을 네임드튜플로 변환하는 방법
🎜이제 네임드튜플이 사용되는 이유를 이해했으므로 일반 튜플과 사전을 네임드튜플로 변환하는 방법을 알아볼 차례입니다. . 어떤 이유로 색상이 지정된 RGBA 값을 포함하는 사전 인스턴스가 있다고 가정해 보겠습니다.Color namestuple
로 변환하려면 아래 단계를 따르세요. 🎜rrreee🎜 **
구조를 사용하여 dict는 <code>namedtuple
입니다. 🎜🎜🎜dict에서 네임드튜페를 만들고 싶다면 어떻게 해야 하나요? 🎜🎜🎜문제 없습니다. 다음과 같이 하세요: 🎜rrreee🎜 dict 인스턴스를 명명된 튜플 팩토리 함수에 전달하면 필드가 생성됩니다. 그런 다음 Color는 위의 예와 같이 사전 c의 압축을 풀고 새 인스턴스를 만듭니다. 🎜如何将 namedtuple 转换为字典或常规元组
我们刚刚学习了如何将转换namedtuple
为dict
。反过来呢?我们又如何将其转换为字典实例?
实验证明,namedtuple它带有一种称为的方法._asdict()
。因此,转换它就像调用方法一样简单。
>>> blue = Color(r=0, g=0, b=255, alpha=1.0)>>> blue._asdict() {'r': 0, 'g': 0, 'b': 255, 'alpha': 1.0}复制代码
您可能想知道为什么该方法以_
开头。这是与Python的常规规范不一致的一个地方。通常,_
代表私有方法或属性。但是,namedtuple
为了避免命名冲突将它们添加到了公共方法中。除了_asdict
,还有_replace
,_fields
和_field_defaults
。您可以在这里找到所有这些。
要将namedtupe
转换为常规元组,只需将其传递给tuple构造函数即可。
>>> tuple(Color(r=50, g=205, b=50, alpha=0.1)) (50, 205, 50, 0.1)复制代码
如何对namedtuples列表进行排序
另一个常见的用例是将多个namedtuple
实例存储在列表中,并根据某些条件对它们进行排序。例如,假设我们有一个颜色列表,我们需要按alpha强度对其进行排序。
幸运的是,Python允许使用非常Python化的方式来执行此操作。我们可以使用operator.attrgetter
运算符。根据文档,attrgetter
“返回从其操作数获取attr的可调用对象”。简单来说就是,我们可以通过该运算符,来获取传递给sorted函数排序的字段。例:
from operator import attrgetter ... colors = [ Color(r=50, g=205, b=50, alpha=0.1), Color(r=50, g=205, b=50, alpha=0.5), Color(r=50, g=0, b=0, alpha=0.3) ] ...>>> sorted(colors, key=attrgetter("alpha")) [Color(r=50, g=205, b=50, alpha=0.1), Color(r=50, g=0, b=0, alpha=0.3), Color(r=50, g=205, b=50, alpha=0.5)]复制代码
现在,颜色列表按alpha强度升序排列!
如何将namedtuples序列化为JSON
有时你可能需要将储存namedtuple
转为JSON。Python的字典可以通过json模块转换为JSON。那么我们可以使用_asdict方法将元组转换为字典,然后接下来就和字典一样了。例如:
>>> blue = Color(r=0, g=0, b=255, alpha=1.0)>>> import json>>> json.dumps(blue._asdict())'{"r": 0, "g": 0, "b": 255, "alpha": 1.0}'复制代码
如何给namedtuple添加docstring
在Python中,我们可以使用纯字符串来记录方法,类和模块。然后,此字符串可作为名为的特殊属性使用__doc__
。话虽这么说,我们如何向我们的Color namedtuple
添加docstring的?
我们可以通过两种方式做到这一点。第一个(比较麻烦)是使用包装器扩展元组。这样,我们便可以docstring在此包装器中定义。例如,请考虑以下代码片段:
_Color = namedtuple("Color", "r g b alpha") class Color(_Color): """A namedtuple that represents a color. It has 4 fields: r - red g - green b - blue alpha - the alpha channel """ >>> print(Color.__doc__) A namedtuple that represents a color. It has 4 fields: r - red g - green b - blue alpha - the alpha channel >>> help(Color) Help on class Color in module __main__: class Color(Color) | Color(r, g, b, alpha) | | A namedtuple that represents a color. | It has 4 fields: | r - red | g - green | b - blue | alpha - the alpha channel | | Method resolution order: | Color | Color | builtins.tuple | builtins.object | | Data descriptors defined here: | | __dict__ | dictionary for instance variables (if defined)复制代码
如上,通过继承_Color
元组,我们为namedtupe添加了一个__doc__
属性。
添加的第二种方法,直接设置__doc__
属性。这种方法不需要扩展元组。
>>> Color.__doc__ = """A namedtuple that represents a color. It has 4 fields: r - red g - green b - blue alpha - the alpha channel """复制代码
注意,这些方法仅适用于Python 3+
。
限于篇幅,先到这下篇继续。
相关免费学习推荐:python教程(视频)
위 내용은 Python 데이터 구조: 과소평가된 명명된 튜플(1)의 상세 내용입니다. 자세한 내용은 PHP 중국어 웹사이트의 기타 관련 기사를 참조하세요!

핫 AI 도구

Undresser.AI Undress
사실적인 누드 사진을 만들기 위한 AI 기반 앱

AI Clothes Remover
사진에서 옷을 제거하는 온라인 AI 도구입니다.

Undress AI Tool
무료로 이미지를 벗다

Clothoff.io
AI 옷 제거제

AI Hentai Generator
AI Hentai를 무료로 생성하십시오.

인기 기사

뜨거운 도구

메모장++7.3.1
사용하기 쉬운 무료 코드 편집기

SublimeText3 중국어 버전
중국어 버전, 사용하기 매우 쉽습니다.

스튜디오 13.0.1 보내기
강력한 PHP 통합 개발 환경

드림위버 CS6
시각적 웹 개발 도구

SublimeText3 Mac 버전
신 수준의 코드 편집 소프트웨어(SublimeText3)

뜨거운 주제











깃털 통제의 열쇠는 점진적인 성격을 이해하는 것입니다. PS 자체는 그라디언트 곡선을 직접 제어하는 옵션을 제공하지 않지만 여러 깃털, 일치하는 마스크 및 미세 선택으로 반경 및 구배 소프트를 유연하게 조정하여 자연스럽게 전이 효과를 달성 할 수 있습니다.

이 기사는 MySQL 데이터베이스의 작동을 소개합니다. 먼저 MySQLworkBench 또는 명령 줄 클라이언트와 같은 MySQL 클라이언트를 설치해야합니다. 1. MySQL-Uroot-P 명령을 사용하여 서버에 연결하고 루트 계정 암호로 로그인하십시오. 2. CreateABase를 사용하여 데이터베이스를 작성하고 데이터베이스를 선택하십시오. 3. CreateTable을 사용하여 테이블을 만들고 필드 및 데이터 유형을 정의하십시오. 4. InsertInto를 사용하여 데이터를 삽입하고 데이터를 쿼리하고 업데이트를 통해 데이터를 업데이트하고 DELETE를 통해 데이터를 삭제하십시오. 이러한 단계를 마스터하고 일반적인 문제를 처리하는 법을 배우고 데이터베이스 성능을 최적화하면 MySQL을 효율적으로 사용할 수 있습니다.

MySQL에는 무료 커뮤니티 버전과 유료 엔터프라이즈 버전이 있습니다. 커뮤니티 버전은 무료로 사용 및 수정할 수 있지만 지원은 제한되어 있으며 안정성이 낮은 응용 프로그램에 적합하며 기술 기능이 강합니다. Enterprise Edition은 안정적이고 신뢰할 수있는 고성능 데이터베이스가 필요하고 지원 비용을 기꺼이 지불하는 응용 프로그램에 대한 포괄적 인 상업적 지원을 제공합니다. 버전을 선택할 때 고려 된 요소에는 응용 프로그램 중요도, 예산 책정 및 기술 기술이 포함됩니다. 완벽한 옵션은없고 가장 적합한 옵션 만 있으므로 특정 상황에 따라 신중하게 선택해야합니다.

PS 페더 링은 이미지 가장자리 블러 효과로, 가장자리 영역에서 픽셀의 가중 평균에 의해 달성됩니다. 깃털 반경을 설정하면 흐림 정도를 제어 할 수 있으며 값이 클수록 흐려집니다. 반경을 유연하게 조정하면 이미지와 요구에 따라 효과를 최적화 할 수 있습니다. 예를 들어, 캐릭터 사진을 처리 할 때 더 작은 반경을 사용하여 세부 사항을 유지하고 더 큰 반경을 사용하여 예술을 처리 할 때 흐릿한 느낌을줍니다. 그러나 반경이 너무 커서 가장자리 세부 사항을 쉽게 잃을 수 있으며 너무 작아 효과는 분명하지 않습니다. 깃털 효과는 이미지 해상도의 영향을받으며 이미지 이해 및 효과 파악에 따라 조정해야합니다.

MySQL 성능 최적화는 설치 구성, 인덱싱 및 쿼리 최적화, 모니터링 및 튜닝의 세 가지 측면에서 시작해야합니다. 1. 설치 후 innodb_buffer_pool_size 매개 변수와 같은 서버 구성에 따라 my.cnf 파일을 조정해야합니다. 2. 과도한 인덱스를 피하기 위해 적절한 색인을 작성하고 Execution 명령을 사용하여 실행 계획을 분석하는 것과 같은 쿼리 문을 최적화합니다. 3. MySQL의 자체 모니터링 도구 (showprocesslist, showstatus)를 사용하여 데이터베이스 건강을 모니터링하고 정기적으로 백업 및 데이터베이스를 구성하십시오. 이러한 단계를 지속적으로 최적화함으로써 MySQL 데이터베이스의 성능을 향상시킬 수 있습니다.

MySQL 데이터베이스 성능 최적화 안내서 리소스 집약적 응용 프로그램에서 MySQL 데이터베이스는 중요한 역할을 수행하며 대규모 트랜잭션 관리를 담당합니다. 그러나 응용 프로그램 규모가 확장됨에 따라 데이터베이스 성능 병목 현상은 종종 제약이됩니다. 이 기사는 일련의 효과적인 MySQL 성능 최적화 전략을 탐색하여 응용 프로그램이 고 부하에서 효율적이고 반응이 유지되도록합니다. 실제 사례를 결합하여 인덱싱, 쿼리 최적화, 데이터베이스 설계 및 캐싱과 같은 심층적 인 주요 기술을 설명합니다. 1. 데이터베이스 아키텍처 설계 및 최적화 된 데이터베이스 아키텍처는 MySQL 성능 최적화의 초석입니다. 몇 가지 핵심 원칙은 다음과 같습니다. 올바른 데이터 유형을 선택하고 요구 사항을 충족하는 가장 작은 데이터 유형을 선택하면 저장 공간을 절약 할 수있을뿐만 아니라 데이터 처리 속도를 향상시킬 수 있습니다.

MySQL이 시작을 거부 했습니까? 당황하지 말고 확인합시다! 많은 친구들이 MySQL을 설치 한 후 서비스를 시작할 수 없다는 것을 알았으며 너무 불안했습니다! 걱정하지 마십시오.이 기사는 침착하게 다루고 그 뒤에있는 마스터 마인드를 찾을 수 있습니다! 그것을 읽은 후에는이 문제를 해결할뿐만 아니라 MySQL 서비스에 대한 이해와 문제 해결 문제에 대한 아이디어를 향상시키고보다 강력한 데이터베이스 관리자가 될 수 있습니다! MySQL 서비스는 시작되지 않았으며 간단한 구성 오류에서 복잡한 시스템 문제에 이르기까지 여러 가지 이유가 있습니다. 가장 일반적인 측면부터 시작하겠습니다. 기본 지식 : 서비스 시작 프로세스 MySQL 서비스 시작에 대한 간단한 설명. 간단히 말해서 운영 체제는 MySQL 관련 파일을로드 한 다음 MySQL 데몬을 시작합니다. 여기에는 구성이 포함됩니다

MySQL 설치 실패의 주된 이유는 다음과 같습니다. 1. 권한 문제, 관리자로 실행하거나 Sudo 명령을 사용해야합니다. 2. 종속성이 누락되었으며 관련 개발 패키지를 설치해야합니다. 3. 포트 충돌, 포트 3306을 차지하는 프로그램을 닫거나 구성 파일을 수정해야합니다. 4. 설치 패키지가 손상되어 무결성을 다운로드하여 확인해야합니다. 5. 환경 변수가 잘못 구성되었으며 운영 체제에 따라 환경 변수를 올바르게 구성해야합니다. 이러한 문제를 해결하고 각 단계를 신중하게 확인하여 MySQL을 성공적으로 설치하십시오.
