冷知识

[TOC]

#省略号也是对象

在python中一切皆对象,省略号(**...**)也是一个对象**注意:只能是三个点的省略号**

在python中叫做Ellipsis

在python3中能直接得到它

```python
print(...)
print(type(...))
```

Ellipsis
<class 'ellipsis'>

而在python2中没有这个,只能通过Ellipsis来获取

```python
print Ellipsis
print type(Ellipsis)
```

 

它转成布尔值为真

```python
print(bool(...))
```

True

它还是一个单例

```python
print(id(...))
print(id(...))
print(id(...))
print(id(...))
```

1435611440
1435611440
1435611440
1435611440

这东西有啥用呢?据说它是Numpy的语法糖,不玩 Numpy 的人,可以说是没啥用的。

在网上只看到这个 用 … 代替 pass ,稍微有点用,但又不是必须使用的。

![img](https://imgconvert.csdnimg.cn/aHR0cHM6Ly91cGxvYWQtaW1hZ2VzLmppYW5zaHUuaW8vdXBsb2FkX2ltYWdlcy8xODgyOTg5Ni1lYTE1ZGU5MTAwNjQwNzM2LmpwZw?x-oss-process=image/format,png)

# 奇怪的字符串
示例一

![img](https://imgconvert.csdnimg.cn/aHR0cHM6Ly91cGxvYWQtaW1hZ2VzLmppYW5zaHUuaW8vdXBsb2FkX2ltYWdlcy8xODgyOTg5Ni1iNzAyYTJhNTFkMjRmM2M4LmpwZw?x-oss-process=image/format,png)

示例二

![img](https://imgconvert.csdnimg.cn/aHR0cHM6Ly91cGxvYWQtaW1hZ2VzLmppYW5zaHUuaW8vdXBsb2FkX2ltYWdlcy8xODgyOTg5Ni02NDgxNzViYmVhZjBkMzhmLmpwZw?x-oss-process=image/format,png)

示例三

![img](https://imgconvert.csdnimg.cn/aHR0cHM6Ly91cGxvYWQtaW1hZ2VzLmppYW5zaHUuaW8vdXBsb2FkX2ltYWdlcy8xODgyOTg5Ni1iZGE2YTc2ZDAyZThmMTUwLmpwZw?x-oss-process=image/format,png)

# and 和 or 的取值顺序
and 和 or 是我们再熟悉不过的两个逻辑运算符。而我们通常只用它来做判断,很少用它来取值。

如果一个or表达式中所有值都为真,Python会选择第一个值,而and表达式则会选择第二个。

```python
print(2 or 3)
print(2 and 3)
```

2
3

# 访问类中的私有方法
大家都知道,类中可供直接调用的方法,只有公有方法(protected类型的方法也可以,但是不建议)。也就是说,类的私有方法是无法直接调用的。但是是可以直接调用的

```python
class People:
def __speak(self):
print('hello')
def call_speak(self):
self.__speak()
tim=People()
tim.call_speak()
tim._People__speak()
```

hello
hello

 

 

# 时有时无的切片异常
这是个简单例子

```python
lis=[1,2,3]
print(lis[5])
```

执行一下,和我们预期的一样,会抛出索引异常。

![](https://img2018.cnblogs.com/blog/1751706/201909/1751706-20190919152929886-1767234316.png)

但是今天要说的肯定不是这个,而是一个你可能会不知道的冷知识。

来看看,如下这种写法就不会报索引异常,它会返回一个空列表:

```python
lis=[1,2,3]
print(lis[5:])
```

[]

# 两次 return
我们都知道,try…finally… 语句的用法,不管try里面是正常执行还是报异常,最终都能保证finally能够执行。

同时,我们又知道,一个函数里只要遇到 return 函数就会立马结束。

基于以上这两点,我们来看看这个例子,到底运行过程是怎么样的?

```python
def text():
try:
return 1
finally:
return 0

print(text())
```

0

惊奇的发现,在try 里的return居然不起作用。

原因是,在try…finally…语句中,try中的return会被直接忽视,因为要保证 finally 能够执行。

# for 死循环
for 循环可以说是 基础得不能再基础的知识点了。

但是如果让你用 for 写一个死循环,你会写吗?

这是个开放性的问题,在往下看之前,建议你先尝试自己思考,你会如何解答。

好了,如果你还没有思路,那就来看一下这个解法:

```python
for i in iter(int,1):
print('1')
```

 

是不是懵逼了。iter 还有这种用法?这为啥是个死循环?

这真的是个冷知识,关于这个知识点,你如果看中文网站,可能找不到相关资料。

还好你可以通过 IDE 看py源码里的注释内容,介绍了很详细的使用方法。

原来iter有两种使用方法,通常我们的认知是第一种,将一个列表转化为一个迭代器。

而第二种方法,他接收一个 callable对象,和一个sentinel 参数。第一个对象会一直运行,直到它返回 sentinel 值才结束。

那int 呢,这又是一个知识点,int 是一个内建方法。通过看注释,可以看出它是有默认值0的。你可以在终端上输入int() 看看是不是返回0。

![](https://img2018.cnblogs.com/blog/1751706/201909/1751706-20190919153022383-1248786093.png)

由于int() 永远返回0,永远返回不了1

![](https://img2018.cnblogs.com/blog/1751706/201909/1751706-20190919153042188-870554576.png)

所以这个 for 循环会没有终点。一直运行下去。

 

 

# intern机制
字符串类型作为Python中最常用的数据类型之一,Python解释器为了提高字符串使用的效率和使用性能,做了很多优化.

例如:Python解释器中使用了 intern(字符串驻留)的技术来提高字符串效率,什么是intern机制?就是同样的字符串对象仅仅会保存一份,放在一个字符串储蓄池中,是共用的,当然,肯定不能改变,这也决定了字符串必须是不可变对象。

![img](https://imgconvert.csdnimg.cn/aHR0cHM6Ly91cGxvYWQtaW1hZ2VzLmppYW5zaHUuaW8vdXBsb2FkX2ltYWdlcy8xODgyOTg5Ni1jNzQzZmViMTBhZmRiNTlhLmpwZw?x-oss-process=image/format,png)

转载于:https://www.cnblogs.com/gongsla/p/11550194.html

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值