Python语法与C++相差较大 遇到了还是稍微记一下
逻辑运算
&与运算
|或运算
Slicing - 语法Python List
1 | 0,1,2,3,4]) a = ([ |
数组的裁切(相当于列表和元组的切片)
Python中的裁切是指将元素从一个给定的索引带到另一个给定的索引,也就是切片的意思,以冒号“:”来传递,包含开始索引start,但是不包含结束索引end。
我们像这样定义切片而不是索引:[start:end]。
我们还可以定义步长,如下所示:[start:end:step]。
如果我们不设置 start,则将其视为 0,即从索引号为0的元素开始索引。
如果我们不设置 end,则视为该维度内数组的长度,即一直索引到该维度的最后一个元素。
如果我们不设置start和end,则视为从索引号0的元素开始一直到最后一个元素
如果我们不设置 step,则视为 1。
二维数组的裁切
- 从第二个元素开始,对从索引 1 到索引 4(不包括)的元素进行切片
arr = np.array([[1, 2, 3, 4, 5], [6, 7, 8, 9, 10]])
print(arr[1, 1:4])
[7 8 9]
即 第一维度的第二个元素(即[6, 7, 8, 9, 10])的索引号从1到4(不包括4)的元素
- 从两个元素中返回索引 2:
arr = np.array([[1, 2, 3, 4, 5], [6, 7, 8, 9, 10]])
print(arr[0:2, 2]) # [3 8],即第一维度的第1个元素和第2个元素的各自的索引号为2的元素
- 从两个元素裁切索引 1 到索引 4(不包括),这将返回一个 2-D 数组:
arr = np.array([[1, 2, 3, 4, 5], [6, 7, 8, 9, 10]])
print(arr[0:2, 1:4]) # [[2 3 4] ,即维度的索引从0:2(2不包括)的元素 的各自的索引号从1到[7 8 9]
Python数组$
numpy中所有运算都是围绕着数组进行的
- numpy.array() 创建数组
控制流语句
try…except
try…except
1 | try: |
但这还不是try/except的所有用法
except后面还能跟表达式的! 所谓的表达式,就是错误的定义。也就是说,我们可以捕捉一些我们想要捕捉的异常。而不是什么异常都报出来。
异常分为两类:
- python标准异常
- 自定义异常
try…finally
用于无论执行过程中有没有异常,都要执行清场工作。1
2
3
4
5
6
7
8
9
10
11
12try:
execution block ##正常执行模块
except A:
exc A block ##发生A错误时执行
except B:
exc B block ##发生B错误时执行
except:
other block ##发生除了A,B错误以外的其他错误时执行
else:
if no exception, jump to here ##没有错误时执行
finally:
final block ##总是执行with…as..
1
2with expression [as variable]:
with-blockPython循环语句
查看类的方法
除了给类定义一些属性之外,还可以定义类的方法。也就是允许对类的内容有哪些操作,最直观的方法就是用dir()函数来看一个类的属性和方法。比如要查看字符串类有哪些属性和方法:
1 | dir(str) |
有无下划线定义:下划线
包,模块
把很多函数分组,分别放到不同的文件(.py)里。每个文件包含的代码就相对较少。在Python中,一个.py文件就称之为一个模块(Module)。
使用模块还可以避免函数名和变量名冲突。相同名字的函数和变量完全可以分别存在不同的模块中,因此,我们自己在编写模块时,不必考虑名字会与其他模块冲突。但是也要注意,尽量不要与内置函数名字冲突。
如果不同的人编写的模块名相同怎么办?为了避免模块名冲突,Python又引入了按目录来组织模块的方法,称为包(Package)。
1 | myPackage |
模块名:myPackage.module1
html VS. xml
__main__
注意到这两行代码
1 | if __name__ == '__main__' |
当在命令行直接运行.py文件时,解释器会将一个特殊变量__name__置为’main‘, 但是当次文件被导入时,此行判断为false(name != ‘main‘)
因此,这种if测试可以让一个模块通过命令行运行时执行一些额外的代码,最常见的就是运行测试。
Python 面向对象
Keywords:
* 方法重写:如果从父类继承的方法不能满足子类的需求,可以对其进行改写,这个过程叫方法的覆盖(override),也称为方法的重写。
* 实例变量:在类的声明中,属性是用变量来表示的,这种变量就称为实例变量,实例变量就是一个用 self 修饰的变量。
* 类变量:类变量在整个实例化的对象中是公用的。类变量定义在类中且在函数体之外。类变量通常不作为实例变量使用。
类对象
self代表类的实例,而非类
map函数
map() 会根据提供的函数对指定序列做映射。第一个参数 function 以参数序列中的每一个元素调用 function 函数,返回包含每次 function 函数返回值的新列表。
1 | map(function, iterable, ...) |
原地刷新输出 指针向上移动
1 | sys.stdout.write("\033[F") # Cursor up one line |
for in - 循环语句的一种
((但是还可以用来快速生成列表
- 普通的循环其中, y可以是字典/列表/字符串
1
2for i in y:
cycle
with语句
为了避免忘记或者为了避免每次都要手动关闭文件,我们可以使用with语句(一种语法糖,语法糖语句通常是为了简化某些操作而设计的)。with语句会在其代码块执行完毕之后自动关闭文件。因此我们可以这样来改写上面的程序:
1 | with open('song.txt', 'r', encoding='utf-8') as f: |
with语句会帮我们自动处理异常信息吗?
要回答这个问题就要提到“上下文管理器” 和 with语句的工作流程。
with语句不仅仅可以用于文件操作,它实际上是一个很通用的结构,允许使用所谓的上下文管理器(context manager)。上下文管理器是一种支持__enter__()和__exit__()这两个方法的对象。enter()方法不带任何参数,它在进入with语句块的时候被调用,该方法的返回值会被赋值给as关键字之后的变量。exit()方法带有3个参数:type(异常类型), value(异常信息), trace(异常栈),当with语句的代码块执行完毕或执行过程中因为异常而被终止都会调用__exit__()方法。正常退出时该方法的3个参数都为None,异常退出时该方法的3个参数会被分别赋值。如果__exit__()方法返回值(真值测试结果)为True则表示异常已经被处理,命令执行结果中就不会抛出异常信息了;反之,如果__exit__()方法返回值(真值测试结果)为False,则表示异常没有被处理并且会向外抛出该异常。
现在我们应该明白了,异常信息会不会被处理是由with后的语句返回对象的__exit__()方法决定的。文件可以被用作上下文管理器。它的__enter__方法返回文件对象本身,__exit__方法会关闭文件并返回None。我们看下file类中关于这两个方法的实现:
https://www.cnblogs.com/yyds/p/6186621.html