Maison >développement back-end >Tutoriel Python >Comment comprendre les expressions de déballage complexes en 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 # 错误 -- 拆包的值太多了
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')
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)
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!