Maison > développement back-end > Tutoriel Python > Comment comprendre les expressions de déballage complexes en Python ?

Comment comprendre les expressions de déballage complexes en Python ?

Patricia Arquette
Libérer: 2024-12-05 15:11:11
original
485 Les gens l'ont consulté

How to Understand Complex Unpacking Expressions in Python?

Comprendre les expressions de décompression complexes

Considérez l'expression suivante :

a, b = 1, 2                          # 简单序列赋值
a, b = ['green', 'blue']             # 列表赋值
a, b = 'XY'                          # 字符串赋值
a, b = range(1,5,2)                  # 任何可迭代对象都可以

                                     # 嵌套序列赋值

(a,b), c = "XY", "Z"                 # a = 'X', b = 'Y', c = 'Z' 

(a,b), c = "XYZ"                     # 错误 -- 太多值需要拆包
(a,b), c = "XY"                      # 错误 -- 需要拆包的数值太少

(a,b), c, = [1,2],'this'             # a = '1', b = '2', c = 'this'
(a,b), (c,) = [1,2],'this'           # 错误 -- 太多值需要拆包


                                     # 扩展序列拆包

a, *b = 1,2,3,4,5                    # a = 1, b = [2,3,4,5]
*a, b = 1,2,3,4,5                    # a = [1,2,3,4], b = 5
a, *b, c = 1,2,3,4,5                 # a = 1, b = [2,3,4], c = 5

a, *b = 'X'                          # a = 'X', b = []
*a, b = 'X'                          # a = [], b = 'X'
a, *b, c = "XY"                      # a = 'X', b = [], c = 'Y'
a, *b, c = "X...Y"                   # a = 'X', b = ['.','.','.'], c = 'Y'

a, b, *c = 1,2,3                     # a = 1, b = 2, c = [3]
a, b, c, *d = 1,2,3                  # a = 1, b = 2, c = 3, d = []

a, *b, c, *d = 1,2,3,4,5             # 错误 -- 赋值中出现了两个星号表达式

(a,b), c = [1,2],'this'              # a = '1', b = '2', c = 'this'
(a,b), *c = [1,2],'this'             # a = '1', b = '2', c = ['this']

(a,b), c, *d = [1,2],'this'          # a = '1', b = '2', c = 'this', d = []
(a,b), *c, d = [1,2],'this'          # a = '1', b = '2', c = [], d = 'this'

(a,b), (c, *d) = [1,2],'this'        # a = '1', b = '2', c = 't', d = ['h', 'i', 's']

*a = 1                               # 错误 -- 目标必须在一个列表或元组中
*a = (1,2)                           # 错误 -- 目标必须在一个列表或元组中
*a, = (1,2)                          # a = [1,2]
*a, = 1                              # 错误 -- 'int' 对象不可迭代
*a, = [1]                            # a = [1]
*a = [1]                             # 错误 -- 目标必须在一个列表或元组中
*a, = (1,)                           # a = [1]
*a, = (1)                            # 错误 -- 'int' 对象不可迭代

*a, b = [1]                          # a = [], b = 1
*a, b = (1,)                         # a = [], b = 1

(a,b),c = 1,2,3                      # 错误 -- 太多值需要拆包
(a,b), *c = 1,2,3                    # 错误 - 'int' 对象不可迭代
(a,b), *c = 'XY', 2, 3               # a = 'X', b = 'Y', c = [2,3]


                                     # 扩展序列拆包 -- 嵌套

(a,b),c = 1,2,3                      # 错误 -- 太多值需要拆包
*(a,b), c = 1,2,3                    # a = 1, b = 2, c = 3

*(a,b) = 1,2                         # 错误 -- 目标必须在一个列表或元组中
*(a,b), = 1,2                        # a = 1, b = 2

*(a,b) = 'XY'                        # 错误 -- 目标必须在一个列表或元组中
*(a,b), = 'XY'                       # a = 'X', b = 'Y'

*(a, b) = 'this'                     # 错误 -- 目标必须在一个列表或元组中
*(a, b), = 'this'                    # 错误 -- 拆包的值太多了
*(a, *b), = 'this'                   # a = 't', b = ['h', 'i', 's']

*(a, *b), c = 'this'                 # a = 't', b = ['h', 'i'], c = 's'

*(a,*b), = 1,2,3,3,4,5,6,7           # a = 1, b = [2, 3, 3, 4, 5, 6, 7]

*(a,*b), *c = 1,2,3,3,4,5,6,7        # 错误 -- 赋值中出现了两个星号表达式
*(a,*b), (*c,) = 1,2,3,3,4,5,6,7     # 错误 -- 'int' 对象不可迭代
*(a,*b), c = 1,2,3,3,4,5,6,7         # a = 1, b = [2, 3, 3, 4, 5, 6], c = 7
*(a,*b), (*c,) = 1,2,3,4,5,'XY'      # a = 1, b = [2, 3, 4, 5], c = ['X', 'Y']

*(a,*b), c, d = 1,2,3,3,4,5,6,7      # a = 1, b = [2, 3, 3, 4, 5], c = 6, d = 7
*(a,*b), (c, d) = 1,2,3,3,4,5,6,7    # 错误 -- 'int' 对象不可迭代
*(a,*b), (*c, d) = 1,2,3,3,4,5,6,7   # 错误 -- 'int' 对象不可迭代
*(a,*b), *(c, d) = 1,2,3,3,4,5,6,7   # 错误 -- 赋值中出现了两个星号表达式


*(a,b), c = 'XY', 3                  # 错误 -- 需要拆包的数值太少
*(*a,b), c = 'XY', 3                 # a = [], b = 'XY', c = 3
(a,b), c = 'XY', 3                   # a = 'X', b = 'Y', c = 3

*(a,b), c = 'XY', 3, 4               # a = 'XY', b = 3, c = 4
*(*a,b), c = 'XY', 3, 4              # a = ['XY'], b = 3, c = 4
(a,b), c = 'XY', 3, 4                # 错误 -- 拆包的值太多了
Copier après la connexion

Dérivez manuellement les résultats de ces expressions

Les généraliser n'est pas difficile une fois que l'on a quelques règles de base. Je ferai de mon mieux pour expliquer avec quelques exemples. Puisque vous avez mentionné l'évaluation "manuelle" de ces expressions, je suggérerais quelques règles de remplacement simples. Fondamentalement, il vous sera plus facile de comprendre les expressions où tous les itérables sont formatés de la même manière.

À des fins de déballage uniquement, les substitutions suivantes sont valides dans les rvalues ​​​​(c'est-à-dire les objets itérables) :

'XY' -> ('X', 'Y')
['X', 'Y'] -> ('X', 'Y')
Copier après la connexion

Si vous trouvez une valeur est pas déballé, vous devez alors annuler la substitution. (Voir ci-dessous pour plus d'explications.)

De plus, lorsque vous voyez une virgule "nue", imaginez qu'il y a un tuple en haut. Faites ceci sur les côtés gauche et droit (c'est-à-dire itérable et itérable à droite) :

'X', 'Y' -> ('X', 'Y')
a, b -> (a, b)
Copier après la connexion

Ce qui précède est le contenu détaillé de. pour plus d'informations, suivez d'autres articles connexes sur le site Web de PHP en chinois!

source:php.cn
Déclaration de ce site Web
Le contenu de cet article est volontairement contribué par les internautes et les droits d'auteur appartiennent à l'auteur original. Ce site n'assume aucune responsabilité légale correspondante. Si vous trouvez un contenu suspecté de plagiat ou de contrefaçon, veuillez contacter admin@php.cn
Derniers articles par auteur
Tutoriels populaires
Plus>
Derniers téléchargements
Plus>
effets Web
Code source du site Web
Matériel du site Web
Modèle frontal