python函数注释参数省略号_这些Python冷知识,你了解吗?
1. 省略号也是对象
...这是省略号,在Python中,⼀切皆对象。它也不例外。
在 Python 中,它叫做 Ellipsis 。
在 Python 3 中你可以直接写…来得到这玩意。
>>> ...
Ellipsis
>>> type(...)
⽽在 2 中没有…这个语法,只能直接写Ellipsis来获取。
>>> Ellipsis
Ellipsis
>>> type(Ellipsis)
>>>
它转为布尔值时为真
>>> bool(...)
True
python新手函数最后,这东西是⼀个单例。
>>> id(...)
4362672336
>>> id(...)
4362672336
这东西有啥⽤呢?据说它是Numpy的语法糖,不玩 Numpy 的⼈,可以说是没啥⽤的。
在⽹上只看到这个 ⽤...代替 pass ,稍微有点⽤,但⼜不是必须使⽤的。
try:
1/0
except ZeroDivisionError:
...
2. 类⾸字母不⼀定是⼤写
在正常情况下,我们所编写的所见到的代码,好像都默许了类名⾸字母⼤写,⽽实例⽤⼩写的这⼀准则。但这并不是强制性的,即使你反过来的也没有关系。
但有⼀些内置的类,⾸字母都是⼩写,⽽实例都是⼤写。
⽐如 bool 是类名,⽽ True,False 是其实例;
⽐如 ellipsis 是类名,Ellipsis是实例;
还有 int,string,float,list,tuple,dict 等⼀系列数据类型都是类名,它们都是⼩写。
3. 增量赋值的性能更好
诸如+=和*=这些运算符,叫做 增量赋值运算符。
这⾥使⽤⽤ += 举例,以下两种写法,在效果上是等价的。
# 第⼀种a = 1 ; a += 1# 第⼆种a = 1; a = a + 1
+=其背后使⽤的魔法⽅法是 __iadd__,如果没有实现这个⽅法则会退⽽求其次,使⽤ __add__ 。
这两种写法有什么区别呢?
⽤列表举例 a += b,使⽤ __iadd__ 的话就像是使⽤了a.extend(b),如果使⽤ __add__ 的话,则是 a = a+b,前者是直接在原列表上进⾏扩展,⽽后者是先从原列表中取出值,在⼀个新的列表中进⾏扩展,然后再将新的列表对象返回给变量,显然后者的消耗要⼤些。
所以在能使⽤增量赋值的时候尽量使⽤它。
4. and 和 or 的取值顺序
and 和 or 是我们再熟悉不过的两个逻辑运算符。⽽我们通常只⽤它来做判断,很少⽤它来取值。
如果⼀个or表达式中所有值都为真,Python会选择第⼀个值,⽽and表达式则会选择第⼆个。
5. 如何修改解释器提⽰符
这个当做今天的⼀个⼩彩蛋吧。应该算是⽐较冷门的,估计知道的⼈很少了吧。
正常情况下,我们在 终端下 执⾏Python 命令是这样的。
>>> for i in range(2):
...    print (i)
...
1
你是否想过>>>和...这两个提⽰符也是可以修改的呢?
>>> import sys
>>> sys.ps1
>>>
>>> sys.ps2
...
>>>
>>> sys.ps2 = ................
>>> sys.ps1 = Python编程时光>>>
Python编程时光>>>for i in range(2):
................    print (i)
................
1
06. 默认参数最好不为可变对象
函数的参数分三种
可变参数
默认参数
关键字参数
这三者的具体区别,和使⽤⽅法在 廖雪峰的教程 ⾥会详细的解释。这⾥就不搬运了。
今天要说的是,传递默认参数时,新⼿很容易踩雷的⼀个坑。
先来看⼀个⽰例
def func(item, item_list=[]):item_list.append(item)
print(item_list)
func(iphone)
func(xiaomi, item_list=[oppo,vivo])
func(huawei)
在这⾥,你可以暂停⼀下,思考⼀下会输出什么?
思考过后,你的答案是否和下⾯的⼀致呢
[ iphone ]
[ oppo ,  vivo ,  xiaomi ]
[ iphone ,  huawei ]
如果是,那你可以跳过这部分内容,如果不是,请接着往下看,这⾥来分析⼀下。
Python 中的 def 语句在每次执⾏的时候都初始化⼀个函数对象,这个函数对象就是我们要调⽤的函数,可以把它当成⼀个⼀般的对象,只不过这个对象拥有⼀个可执⾏的⽅法和部分属性。
对于参数中提供了初始值的参数,由于 Python 中的函数参数传递的是对象,也可以认为是传地址,在第⼀次初始化 def 的时候,会先⽣成这个可变对象的内存地址,然后将这个默认参数 item_list 会与这个内存地址绑定。在后⾯的函数调⽤中,如果调⽤⽅指定了新的默认值,就会将原来的默认值覆盖。如果调⽤⽅没有指定新的默认值,那就会使⽤原来的默认值。
07. 访问类中的私有⽅法
⼤家都知道,类中可供直接调⽤的⽅法,只有公有⽅法(protected类型的⽅法也可以,但是不建议)。也就是说,类的私有⽅法是⽆法直接调⽤的。
这⾥先看⼀下例⼦
class Kls():def public(self):
print(Hello public world!)
def __private(self):
print(Hello private world!)
def call_private(self):
self.__private()
ins = Kls()
# 调⽤公有⽅法,没问题
ins.public()
# 直接调⽤私有⽅法,不⾏
ins.__private()
# 但你可以通过内部公有⽅法,进⾏代理
ins.call_private()
既然都是⽅法,那我们真的没有⽅法可以直接调⽤吗?
当然有啦,只是建议你千万不要这样弄,这⾥只是普及,让你了解⼀下。
# 调⽤私有⽅法,以下两种等价
ins._Kls__private()
ins.call_private()
08. 时有时⽆的切⽚异常
这是个简单例⼦
my_list = [1, 2, 3, 4, 5]
print(my_list[5])
执⾏⼀下,和我们预期的⼀样,会抛出索引异常。
Traceback (most recent call last):
File "F:/Python Script/test.py", line 2, in
print(my_list[5])
IndexError: list index out of range
但是今天要说的肯定不是这个,⽽是⼀个你可能会不知道的冷知识。
来看看,如下这种写法就不会报索引异常,执⾏my_list[5:],会返回⼀个新list:[]。my_list = [1, 2, 3]
print(my_list[5:])
09. 哪些情况下不需要续⾏符
在写代码时,为了代码的可读性,代码的排版是尤为重要的。
为了实现⾼可读性的代码,我们常常使⽤到的就是续⾏符。
>>> a = talk is cheap,
...    show me the code.
>>>
>>> print(a)
talk is cheap,show me the code.
那有些情况下,是不需要写续⾏符的呢?
经过总结,在这些符号中间的代码换⾏可以省略掉续⾏符:[],(),{}
>>> my_list=[1,2,3,
...          4,5,6]
>>> my_tuple=(1,2,3,
...          4,5,6)
>>> my_dict={"name": "MING",
...          "gender": "male"}
另外还有,在多⾏⽂本注释中,续⾏符也是可以不写的。
>>> text = talk is cheap,...          show me the code
上⾯只举了⼀些简单的例⼦。
但你要学会举⼀反三。⼀样的,在以下这些场景也同样适⽤
类,和函数的定义。
列表推导式,字典推导式,集合推导式,⽣成器表达式
10. Py2 也可以使⽤ print()
我相信应该有不少⼈,思维定式,觉得只有 Py3 才可以使⽤ print(),⽽ Py2 只能使⽤print  。今天,⼩明要为 Py2 正名⼀次。
在Python 2.6之前,只⽀持
print "hello"
在Python 2.6和2.7中,可以⽀持如下三种
print "hello"print("hello")
print ("hello")
在Python3.x中,可以⽀持如下两种
print("hello")
print ("hello")

版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系QQ:729038198,我们将在24小时内删除。