python 学习笔记

前言

虽然用python的各种库解决了很多有趣的问题。
但对于一些基础的语法知识一直没有系统性地学习过,也成为了进一步更深发展的桎梏。
可我对于一些文字或视频教程都感觉无比枯燥,后来偶然发现了实验楼这个有趣的平台,对于喜欢动手实践辅助学习的我来说真的是无比欣喜。

所以准备在实验楼平台系统性学习一下Python的语法,但并不准备写总结性的记录博客,因为个人认为对于python这种实用性极强的语言,基础语法其实并不是关键性的重点,需要用时可以随时查文档。

故此博客只简单记录一下学习过程中遇到的一些零散但个人感觉很有趣的知识点~


有趣问题大汇总

#!/usr/bin/env python与#!/usr/bin/python的区别

参考博客

在很多python代码里,我们常常会见到:

#!/usr/bin/env python3

首先这行代码中的#!称为Shebang,目的是告诉shell使用指定路径的Python解释器来执行代码。

而上述两种Shebang代码的区别在于:
#!/usr/bin/python是告诉操作系统执行这个脚本的时候,调用/usr/bin下的python解释器;

#!/usr/bin/env python这种用法是为了防止操作系统用户没有将python装在默认的/usr/bin路径里。当系统看到这一行的时候,首先会到env设置里查找python的安装路径,再调用对应路径下的解释器程序完成操作。

故综上可见:
#!/usr/bin/python相当于写死了python路径;
#!/usr/bin/env python会去环境设置寻找python目录,推荐这种写法


逻辑运算符 and、or

知乎:python中and、or的计算规则是怎样的

运算规则:
1. 在纯and语句中,如果每一个表达式都不是假的话,那么返回最后一个,因为需要一直匹配直到最后一个。如果有一个是假,那么返回假。
2. 在纯or语句中,只要有一个表达式不是假的话,那么就返回这个表达式的值。只有所有都是假,才返回假。
3. 在or和and语句比较难表达,总而言之,碰到and就往后匹配,碰到or如果or左边的为真,那么就返回or左边的那个值,如果or左边为假,继续匹配or右边的参数。

优先级:
1. 在不加括号时候, and优先级大于or
2. x or y 的值只可能是x或y. x为真就是x, x为假就是y
3. x and y 的值只可能是x或y. x为真就是y, x为假就是x

Python定义的Flase value有哪些
1. None
2. False
3. 任何形式的0,如:0、0L、0.0…
4. 如何空序列,如:[]、()、{}…
5. 用户自定义的class实现了nonzero等等

多种需求的print()

输出结构
对于print()除了打印提供的字符串之外,还默认打印一个换行符,所以每调用一次print()就会换一次行。
如果需要循环打印1~10在同一行,以空格隔开,我们可以这样写:

cnt = 1
while cnt <= 10:
    print(cnt,end = ' ')

故使用规定的end参数来替换换行符即可。

数据的格式化输出
使用format()即可。
其规则类似于C语言的格式化输出,而在python中使用 : 代替 %

如:

import math
print("e = {:.5f}".format(math.e))

列表的切片

现在有一个列表a:

>>> a = [ 1, 342, 223, 'India', 'Fedora']
>>> a
[1, 342, 223, 'India', 'Fedora']

求切片可以看成取子集的拓展功能
注意所求区间为左闭右开!
使用举例如下:

>>> a[0:-1]
[1, 342, 223, 'India']
>>> a[2:-2]
[223]

对于缺省值:
缺省的第一个索引默认为0,而第二个索引默认为列表的长度。

>>> a[:-2]
[1, 342, 223]
>>> a[-2:]
['India', 'Fedora']

无意义的切片索引处理
python能优雅地处理没有意义的切片索引:
过大的索引值将被列表实际长度所代替,而当上边界大于下边界时,将返回空列表。

设置步长
举例:

>>> a[1::2]
[342, 'India']

可见,其所取元素的索引为:1、3、5…
即步长为2。

关于set的pop()和add()顺序

参考:stackoverflow

python中的set与C++中的set在实现上是存在差别的。
对于C++中的set,是基于平衡二叉树实现,其存取操作均为O(logn)的时间复杂度,但我们可以以确定的顺序对树进行遍历,对于任意节点,我们均可以很方便地找到其前驱和后继节点。

而对于python中的set,是严格的无序,以至于当你同样的代码使用不同的机器运行时,其顺序均有可能不同。
其实现是基于哈希表实现,存取时间可以看成O(1),但也失去了查找前驱后继节点的能力。

列表推导式

input().split()

str.rjust()