白日依山尽,黄河入海流。欲穷千里目,更上一层楼。 -- 唐·王之涣

python字符串切片转换成多级路径(星号*的打包和解包)

实现

知识点

1、函数参数 *args**kwargs的作用
2、参数解包

其中每个非空部分后面都紧跟一个目录分隔符,最后一个部分除外,这意味着如果最后一个部分为空,则结果将以分隔符结尾

1、星号* 的基础用法

1
2
3
4
5
6
7
>>> 9 * 9
81
>>> 2 ** 3
8
>>> 'Hello World -> ' * 3
'Hello World -> Hello World -> Hello World -> '
>>>

2、星号*的高级用法之打包

1
2
3
4
5
6
7
8
def pack(a, *b, **c):
print(f"a: {a}; a's type: {type(a)}")
print(f"b: {b}; b's type: {type(b)}")
print(f"c: {c}; c's type: {type(c)}")


if __name__ == '__main__':
pack(1, 2, 3, 4, 5, 6, x=7, y=8, z='z')

执行该函数

1
2
3
4
5
# python3 demo_pack_unpack.py
====> 打包演示 <====
a: 1; a's type: <class 'int'>
b: (2, 3, 4, 5, 6); b's type: <class 'tuple'>
c: {'x': 7, 'y': 8, 'z': 'z'}; c's type: <class 'dict'>

这里看到pack函数有9个参数,6个位置参数和3个关键字参数

在函数内部,

  • 通过 *b 获取除了明确的位置参数(这里的1)之外的其他所有的位置参数(2,3,4,5,6)
  • 通过 **c 获取所有的关键字参数

另外这里需要注意几个规范

1)*b 一般用 *args 来表示, **c 一般用 **kwargs 来表示,
2)位置参数一般在关键字参数的前面,

3、星号*的高级用法之解包

参数和打包pack一样, 这里通过函数名做区分

1
2
3
4
5
6
7
8
9
10
11
12
def unpack(a, *b, **c):
"""解包: 和打包刚好相反,是在传参数的时候,按照`整体`来传参,比如字典"""
print(f"a: {a}; a's type: {type(a)}")
print(f"b: {b}; b's type: {type(b)}")
print(f"c: {c}; c's type: {type(c)}")

if __name__ == '__main__':

print("====> 解包演示 <====")
str_1 = "abc"
dict_1 = {'name': 'eagle', 'website': 'http://blog.colinspace.com'}
unpack(*str_1, **dict_1)

执行结果如下

1
2
3
4
5
# python3 demo_pack_unpack.py
====> 解包演示 <====
a: a; a's type: <class 'str'>
b: ('b', 'c'); b's type: <class 'tuple'>
c: {'name': 'eagle', 'website': 'http://blog.colinspace.com'}; c's type: <class 'dict'>

从结果我们知道:

1、*str_1 被解包 成了 元组 (‘a’, ‘b’, ‘c’),但是在 *str_1 前面还有个位置参数,所以把元组第一个元素给了a 参数,

2、**dict_1 被解包 成了dict类型,

3、Python中类路径对象的概念
参考 https://docs.python.org/zh-cn/3/glossary.html#term-path-like-object
4、os.path.join() 中 关于路径的拼接说明

python字符串切片转换成多级路径(星号*的打包和解包)

http://blog.colinspace.com/2022/11/04/python字符串切片转换成多级路径/

作者

Colin

发布于

2022-11-04

许可协议