为什么python返回值处写两个变量a,b=fun()和一个变量a=fun()的结果类型不同?

import numpy as np

import scipy.stats as ss

np.random.seed(1000)

sample=ss.norm(1,1).rvs(100000)

print(ss.kurtosistest(sample),type(ss.kurtosistest(sample)))

print("-------------------")

a,b=ss.kurtosistest(sample)

print(a,type(a),"||",b,type(b))

为什么python返回值处写两个变量a,b=fun()和一个变量a=fun()的结果类型不同?

为什么ss.kurtosistest(sample)得到的对象类型是 <class 'scipy.stats.stats.KurtosistestResult'>
a,b=ss.kurtosistest(sample),得到的a和b就是float了呢?


回答:

python的赋值过程如下:

  1. 若赋值左边是一个正常的变量,则右边的表达式求值之后直接赋值给左边的表达式
  2. 若赋值左边含有 , 则赋值右边必须是一个iterable的值,此时把迭代器生成的值一一对应的赋值给对应的变量
  3. ... 其他 ... 略

class TestAssignment():

def __iter__(self):

# 原谅我直接使用 Tuple 的 __iter__ 生成迭代器

return (1, 2).__iter__()

def __str__(self):

return "TestAssignment"

obj = TestAssignment()

a = obj

print(a) # TestAssignment

a, b = obj

print(a, b) # 1 2

所以python里可以这样赋值a, b = 1, 2,不是因为规定了Tuple可以这样赋值,而是因为 Tuple是可迭代的


回答:

你这么看就容易理解了:a,b = rs = ss.kurtosistest(sample)

这涉及到Python的概念(拆包):
1、所谓拆包:对于函数中的多个返回数据, 去掉元组, 列表 或者字典,直接获取里面数据的过程。
2、即:函数有多个返回值时(或者是例如list,tuple等等),Python能自动进行拆包.
例如:

def test(x):

y1 = x + 1

y2 = x + 2

return y1, y2

result = test(2)

a, b = test(2)

print("这是返回实际结果:" + str(type(result)))

print("这是拆包后的a值:" + str(type(a)))

print("这么比较容易理解:a, b= result = test(2)")

结果:

这是返回实际结果:<class 'tuple'>

这是拆包后的a值:<class 'int'>

这么比较容易理解:a, b= result = test(2)

以上是 为什么python返回值处写两个变量a,b=fun()和一个变量a=fun()的结果类型不同? 的全部内容, 来源链接: utcz.com/p/937749.html

回到顶部