Python零散知识点

如何保留小数点两位

对于除法或者浮点数我们如果想保留小数点两位可以使用下面方法

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
In [1]: a = 1

In [2]: b = 3

In [3]: print(a/b)
0.3333333333333333

In [4]: print(a//b)
0

方法一:使用round
In [5]: print(round(a/b, 2))
0.33

方法二:使用format
In [7]: print(format(float(a)/float(b), '.2f'))
0.33

方法三:使用 %
In [8]: print('%.2f' %(a/b))
0.33
and和or的取值顺序

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

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

1
2
In [1]: ( 3 or 4) * ( 5 and 6)
Out[1]: 18
类首字母不一定是大写

在正常情况下,我们所编写的所见到的代码,好像都默许了类名首字母大写,而实例用小写的这一准则。但这并不是强制性的,即使你反过来的也没有关系。

但有一些内置的类,首字母都是小写,而实例都是大写。

比如 bool 是类名,而 True,False 是其实例; 比如 ellipsis是类名,Ellipsis是实例; 还有 int,string,float,list,tuple,dict等一系列数据类型都是类名,它们都是小写。

两次 return

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

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

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

1
2
3
4
5
6
7
8
9
In [7]: def func():
...: try:
...: return "try"
...: finally:
...: return "finally"
...:

In [8]: func()
Out[8]: 'finally'

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

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

for死循环

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

但是如果让你用 for 写一个死循环,你会写吗?(问题来自群友 陈**)

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

好了,如果你还没有思路,那就来看一下 一个海外 MIT 群友的回答:

1
2
for i in iter(int, 1):
pass

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

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

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

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

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

image-20180906162122715

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

image-20180906162140098

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

intern机制

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

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

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
In [10]: s1="hello"

In [11]: s2="hello"

In [12]: s1 is s2
Out[12]: True

# 如果有空格 不启用itern
In [13]: s1="hell o"

In [14]: s2="hell o"

In [15]: s1 is s2
Out[15]: False

In [16]: s1 = "a" * 20

In [17]: s2 = "a" * 20

In [18]: s1 is s2
Out[18]: True

# 如果一个字符串长度超过20个字符,不启动intern机制
In [19]: s1 = "a" * 21

In [20]: s2 = "a" * 21

In [21]: s1 is s2
Out[21]: False

In [22]: s1 = "ab" * 10

In [23]: s2 = "ab" * 10

In [24]: s1 is s2
Out[24]: True

In [25]: s1 = "ab" * 11

In [26]: s2 = "ab" * 11

In [27]: s1 is s2
Out[27]: False

参考文章:https://juejin.im/post/5b8d4f7651882542d14dab2b?utm_source=gold_browser_extension

列表的insert函数

列表的insert函数的偏移量是可以超过列表的长度的。

1
2
3
4
5
6
In [1]: test_list = [1,2,3,4]

In [2]: test_list.insert(10, 5)

In [3]: test_list
Out[3]: [1, 2, 3, 4, 5]

这时候就相当于append函数了。

包含空列表的列表的布尔表达式是真

1
2
3
4
5
6
7
8
In [19]: if []:
...: print("False")
...:

In [20]: if [[]]:
...: print("True")
...:
True
知识就是财富
如果您觉得文章对您有帮助, 欢迎请我喝杯水!