Azus

Never be a sad song with nothing to say.

0%

Python 语法笔记

Python语法与C++相差较大 遇到了还是稍微记一下

逻辑运算

&与运算
|或运算

Slicing - 语法Python List

1
2
3
>>> a = ([0,1,2,3,4])
>>> a[0:2]
[0, 1]

数组的裁切(相当于列表和元组的切片)

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]

s

Python数组$

numpy中所有运算都是围绕着数组进行的

  1. numpy.array() 创建数组

控制流语句

try…except

try…except

1
2
3
4
5
6
7
8
try:  
## normal block
except A:
## exc A block
except:
## exc other block
else:
## noError block

但这还不是try/except的所有用法

except后面还能跟表达式的! 所谓的表达式,就是错误的定义。也就是说,我们可以捕捉一些我们想要捕捉的异常。而不是什么异常都报出来。
异常分为两类:

  • python标准异常
  • 自定义异常

    try…finally

    用于无论执行过程中有没有异常,都要执行清场工作。
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    try:  
    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
    2
    with expression [as variable]:  
    with-block

    Python循环语句

查看类的方法

除了给类定义一些属性之外,还可以定义类的方法。也就是允许对类的内容有哪些操作,最直观的方法就是用dir()函数来看一个类的属性和方法。比如要查看字符串类有哪些属性和方法:

1
2
>>> dir(str)
['__add__', '__class__', '__contains__', .... 'upper', 'zfill']

有无下划线定义:下划线

包,模块

把很多函数分组,分别放到不同的文件(.py)里。每个文件包含的代码就相对较少。在Python中,一个.py文件就称之为一个模块(Module)

使用模块还可以避免函数名和变量名冲突。相同名字的函数和变量完全可以分别存在不同的模块中,因此,我们自己在编写模块时,不必考虑名字会与其他模块冲突。但是也要注意,尽量不要与内置函数名字冲突。

如果不同的人编写的模块名相同怎么办?为了避免模块名冲突,Python又引入了按目录来组织模块的方法,称为包(Package)。

包(myPackage), 模块(module1.py, module2.py)

1
2
3
4
myPackage
├─ __init__.py
├─ module1.py
└─ module2.py

模块名:myPackage.module1

html VS. xml

Dif

__main__

注意到这两行代码

1
2
if __name__ == '__main__'
test()

当在命令行直接运行.py文件时,解释器会将一个特殊变量__name__置为’main‘, 但是当次文件被导入时,此行判断为false(name != ‘main‘)

因此,这种if测试可以让一个模块通过命令行运行时执行一些额外的代码,最常见的就是运行测试。

Python 面向对象

Keywords:
* 方法重写:如果从父类继承的方法不能满足子类的需求,可以对其进行改写,这个过程叫方法的覆盖(override),也称为方法的重写。
* 实例变量:在类的声明中,属性是用变量来表示的,这种变量就称为实例变量,实例变量就是一个用 self 修饰的变量。
* 类变量:类变量在整个实例化的对象中是公用的。类变量定义在类中且在函数体之外。类变量通常不作为实例变量使用。

类对象

self代表类的实例,而非类

map函数

map() 会根据提供的函数对指定序列做映射。第一个参数 function 以参数序列中的每一个元素调用 function 函数,返回包含每次 function 函数返回值的新列表。

1
2
3
map(function, iterable, ...)
# function -- 函数
# iterable -- 一个或多个序列

原地刷新输出 指针向上移动

1
sys.stdout.write("\033[F")  # Cursor up one line

for in - 循环语句的一种

((但是还可以用来快速生成列表

  • 普通的循环
    1
    2
    for i in y:
    cycle
    其中, y可以是字典/列表/字符串

with语句

为了避免忘记或者为了避免每次都要手动关闭文件,我们可以使用with语句(一种语法糖,语法糖语句通常是为了简化某些操作而设计的)。with语句会在其代码块执行完毕之后自动关闭文件。因此我们可以这样来改写上面的程序:

1
2
3
with open('song.txt', 'r', encoding='utf-8') as f:
print(f.read())
print(f.closed)

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