关于本节for in循环在不使用items()方法时如果使用key,value接收值,会分别获得关键字名的第一个和第二个字符的问题原因记录

来源:8-8 关键字可变参数

不啦啦啦

2019-05-27

个人测试

情况1:

# 直接使用key,value接收 
def demo4(**param):
    for key,value in param:
        print(key,':',value)
# 第一条可以正常执行,分别显示关键字的第一个和第二个字符
demo4(ab=1,cd=2,cd=5)
# 第二条会报错 too many values to unpack (expected 2)
demo4(abc=1,cde=2,cd=5)

继续测试,看使用4个参数接收会出现什么情况
情况2:

def demo5(**param):
    for k1,k2,k3,k4 in param:
        print(k1,':',k2,":",k3,":",k4)
# 关键字都是4个字符,不报错 
demo5(aaaa=1,bbbb=2,cccc:3)
# >>> 执行结果

a : a : a : a
b : b : b : b
c : c : c : c
a : a : a : a
b : b : b : b

# 当关键字不是4位时,会报错
demo5(aaaa=1,bbbb=2,ccc:3)

对demo5做一个小的修改,就可以明白时为什么了

def demo5(**param):
    for key in param:
        k1,k2,k3,k4 = key
        print(k1,':',k2,":",k3,":",k4)
# 关键字都是4个字符,不报错
demo5(aaaa=1,bbbb=2,cccc=3)
# demo5(aaaa=1,bbbb=2,ccc=3)
demo5(aaaa=1,bbbb=2,ccccc=3)

执行结果与未修改前完全一致,可以看到for in如果不是使用items(),就直接使用key,value接收, 类似于序列解包操作
下面单独在做一个测试

k1,k2,k3,k4 = "1234"
print("k1",':',k1)
print("k2",':',k2)
print("k3",':',k3)
print("k4",':',k4)
#会输出:
k1 : 1
k2 : 2
k3 : 3
k4 : 4

所以对于字符串也是可以进行序列解包操作的,接收值得变量个数必须等于字符串的长度

问题:请教下老师,对字符串进行序列解包时,程序的操作过程是一个怎么样的过程呢?是先将字符串分割成一个一个字符吗?

写回答

4回答

7七月

2019-05-29

for in如果要遍历key:value 需要调用 param.items()

0
0

7七月

2019-05-29

//img.mukewang.com/szimg/5cee768100018f8411620502.jpg两个同名关键字参数直接是错误语法啊,如何能运行?

0
1
不啦啦啦
老师好,这个是编写问题时的手误,第三个的参数名应该是ed
2019-05-29
共1条回复

7七月

2019-05-29

**param不是 接收一组关键字么?

0
0

7七月

2019-05-29

你第一个情况1,我都没看明白,这两个测试调用,不就是参数名不同吗?为什么第二个会报错吗?

0
1
不啦啦啦
是的,参数名的长度不同,只有长度为2的时候不会报错
2019-05-29
共1条回复

Python3.8系统入门+进阶 (程序员必备第二语言)

语法精讲/配套练习+思考题/原生爬虫实战

14598 学习 · 4469 问题

查看课程