【python小技巧2】星号(*)和斜杠(/)的妙用

先来自测一下:
答案:
如果你感到犹豫,请接着往下看吧。

一、星号的用途
a * b 代表乘法,如 3 * 2 得到 6
a ** b 代表乘方,如 3 ** 2 得到 9
x ** y <==> pow(x, y) x ** y % z <==> pow(x, y, z)
细节:先算乘方后算乘法,且同为乘法从左向右,同为乘方从右向左。所以开头的 c 的值是 512 而不是 128,更不是 65536
函数定义时:
*args 这种写法,称为可变长位置参数。
额外的位置参数将“吸入”这个args,args是一个元组。
**kwargs 这种写法,称为可变长关键字参数。
额外的关键字参数将以键值对的形式“吸入”这个kwargs中,kwargs是一个字典。
注意:可变长关键字参数 和 可变长位置参数都至多存在一个
以上两种参数,统称可变长参数
且 *args 必须在 **kwargs 前面
def f(a, *, b): pass这种写法
将后面的所有参数设置为 keyword only argument,即只能用关键字传参。
这里的 a 两种传参都可以,而 b 只能使用关键字传参。为什么?因为这个 * 虽然没有参数名字,但它将所有额外的位置参数都“吸入”这个 * 里,所以 b 只能用关键字传参
序列解包 / 拆包
*args 将一个序列展开
**kwargs 将一个字典以键值对形式展开(其实不止字典,任何 mapping 都可以,常见的还有 collections.defaultdict, collections.OrderedDict 以及 collections.Counter 等)
e.g.
不仅可以在函数调用时解包传参,也可用在赋值语句等。e.g.
也可写在左值,用于拆包哦
注意: 这样写出来的 b 是一个列表,不是元组
5. 正则表达式
匹配前面的子表达式 0 次或多次

二、斜杠的用途
a / b 代表 truediv,emmm...将其译为真除吧(网上没找到更好的翻译),返回浮点数,如 11 / 2 得到 5.5
a // b 代表floordiv,即整除,返回整数,如 11 // 2 得到 5
函数定义时,斜杠前面的参数成为 positional only argument,只能使用位置传参,不能使用关键字。e.g.
总结:
* 用于乘法、乘方等;也用于序列解包拆包;函数定义时作可变长参数标志,将其后面的参数设置为仅关键字参数
/ 用于 2 种除法;函数定义时将其前面的参数设置为仅位置参数
END

参考资料:
https://docs.python.org/3.8/tutorial/controlflow.html