为什么python返回值处写两个变量a,b=fun()和一个变量a=fun()的结果类型不同?
import numpy as npimport 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))
为什么ss.kurtosistest(sample)
得到的对象类型是 <class 'scipy.stats.stats.KurtosistestResult'>
而a,b=ss.kurtosistest(sample)
,得到的a和b就是float了呢?
回答:
python的赋值过程如下:
- 若赋值左边是一个正常的变量,则右边的表达式求值之后直接赋值给左边的表达式
- 若赋值左边含有
,
则赋值右边必须是一个iterable
的值,此时把迭代器生成的值一一对应的赋值给对应的变量 - ... 其他 ... 略
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