python

系列
Python:实例讲解 Python 中的魔法函数(高级语法)

1
2
3
4
5
6
# __name__是Python 的一个内置变量
if __name__ == "__main__":
main()

# 只有当前文件"被直接运行"时,下面代码才会执行
# 如果这个文件只是被当作模块导入到别的文件中,则不会执行这里的内容

简单知识

python中,main()只是起到提示作用,无实质约束力,代码依旧从上向下读取

lambda少使用,易造成错误

..双点表示父目录(上一级目录),.单点表示当前工作目录(current directory)

内置函数enumerate用于遍历可迭代对象(如列表、元组、迭代器)的同时,获取元素的索引和值

深度学习里常用于遍历DataLoader:
for batch_idx, (inputs, targets) in enumerate(train_loader):
ps:batch_idx是当前批次编号,inputs,targets是当前批次的数据

Python图像库中最重要的类是Image类,要从文件加载图像,使用Image模块的open()功能:
from PIL import Image
img = Image.open(“hopper.ppm”)
img.show() //显示刚刚加载的图像

命名规则_xxx表示内部使用,不直接给外部调用

[]+[]是创建一个新的列表(list),把两个列表的内容拼接在一起
插在原数组后面要用.extend(修改数组本身[1,2,3,4])或.append(把数组作为元素插入,属于嵌套数组[1,2,[3,4]])。

lstrip()移除字符串开头指定字符,rstrip()移除字符串末尾指定字符,strip()同时移除开头和末尾指定字符。不指定参数默认移除空白字符
原理(例如lstrip):从字符串最左侧开始,逐字符检查是否出现在参数中,连续移除所有匹配的字符,直到遇到第一个不匹配的字符

isdigit()检查字符串是否只包含数字字符,isalpha()检查字符串是否只包含字母字符

reverse()直接修改原列表,不返回任何值(返回None)。字符串不可变,不能使用reverse()

join()将序列中的元素连接成一个字符串,常用’’.join()拼接字符串

upper()转换为大写,lower()转换为小写,title()每个单词首字母大写,swapcase()互换大小写,capitalize()字符串首字母大写,其余小写

内置函数map()为序列中每个元素应用一个函数

and or 而不是 && ||✌

python支持链式比较(语法糖),如1<=n<=10,实质是1<=n and n<=10

集合中True数值上等于1,但作为不同的值存储。集合是无序的,可以包含混合数据类型,集合操作会自动去重

u|v(等价方法形式u.union(v))并集,u&v(u.intersection(v))交集,u-v(u.difference(v))差集,从u中移除v中的元素,u^v(u.symmetric_difference(v))对称差集,只属于一个集合的元素

内置函数eval()将字符串当作Python代码执行,由于其危险性很少使用

字典方法.get()用于安全地获取字典中的值。键存在则返回对应的值,键不存在则返回指定的默认值(而不是报错)。

字典可以={}创立,赋初值时字符串要加引号

epoch_loss=np.mean(losses) if losses else float(‘nan’)

在有损失值时计算平均损失,没有时返回NaN(Not a Number)以避免报错

装饰器(decorator)@staticmethod用于定义静态方法(static method)。表示以下方法属于类本身,而不是类的实例,不需要访问实例(self)或类(cls),就能被调用

内置函数isinstance()判断一个对象是否是指定类型(或其子类)的实例。isinstance(object,classinfo),object:要检查的对象,classinfo:可以是一个类型(例如int、list),也可以是一个类型元组(例如(int,float)),如果变量是这个类型则返回True,不是则返回False

Python列表支持布尔判断,原生容器判断真假不管元素内容,只管有没有元素
arr = []
if not arr:
print(“空”)
else:
print(“非空”)

hstack():水平堆叠,vstack():垂直堆叠,堆叠数组需要在一个序列(列表或元组)中传递。如hstack((arr1,arr2))或hstack([arr1,arr2])

Python中单引号’和双引号”的本质等价,在字符串中包含引号时使用对方引号更方便

CSV是逗号分隔值文件(Comma-Separated Values),纯文本,用于存储表格数据

jupyter

jupyter横着排在最上面的是列(columns),竖着往下排的是行(index)

1
2
3
4
5
6
df单独位于单元格最后一行,会自动以表格形式显示
Jupyter取单元格最后一个表达式的返回值,调用对象的富显示接口DataFrame._repr_html_(),用HTML渲染成表格
而print(df)只会输出文本版,而不是漂亮表格

Jupyter Notebook工作原理基于交互式计算和内存管理,允许每个单元格单独执行,
并且执行时会把定义的变量、函数、模块等保存在内存中,从而使得不同单元格间可以共享这些定义

正则表达式

从左到右记下连续匹配成功的子串,只匹配连续的一整段字符串

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
( 开始捕获
) 结束捕获
\s控制这里必须是空白字符(whitespace),包括普通空格" ",制表符\t,换行符\n,回车\r,其他Unicode空白字符

+是量词,表示前一个规则至少出现1次
如\s表示匹配1个空白字符,\s+表示匹配1个或多个空白字符,\s*表示匹配0个或多个空白字符

*是条件性规则,X*表示X是可选的,可以不存在,但如果存在则必须是X
.表示任意字符(除换行)

中括号[]表示当前位置是其中这些字符之一,永远只匹配1个字符,一个完整规则是不需要中括号的
.+?可以吃任意字符,但要尽量少吃,同时保证后面的规则还能成功。因为其是一个完整规则,不需要再包括号

正则引擎的基本策略是,先让当前规则尽可能成功,再考虑后面的规则,默认贪婪策略
?紧跟在量词后会把这个量词从贪婪改成非贪婪,通过回溯停在第一个满足后续规则的位置

贪婪量词:先尽可能多地匹配,需要时再回溯
非贪婪量词:先匹配最少字符,每增加一次就立刻测试后续条件

|表示或的意思
类别 写法 含义 关键说明
字面字符 a 匹配字符a 大小写敏感
任意字符 . 匹配任意单个字符 默认不含换行
字符集合 [abc] 匹配a/b/c中任意一个 只匹配1个字符
字符范围 [a-z] 匹配a到z 可组合使用
否定集合 [^abc] 匹配非a/b/c的字符 ^仅在集合内取反
数字 \d 匹配数字 等价[0-9]
非数字 \D 匹配非数字
空白 \s 匹配任意空白字符 含空格、换行、Tab
非空白 \S 匹配非空白字符
单词字符 \w 匹配字母/数字/下划线
非单词字符 \W 匹配非单词字符
捕获组 (abc) 捕获abc 可通过索引引用
非捕获组 (?:abc) 分组但不捕获 提升性能
行首 ^ 匹配字符串开始 多行模式行为不同
行尾 $ 匹配字符串结束
量词 * 0次或多次 贪婪
量词 + 1次或多次 贪婪
量词 ? 0或1次 可选
区间量词 {m,n} m到n次 默认贪婪
非贪婪修饰 *?+???{m,n}? 最小匹配 改变搜索策略
反向引用 \1 引用第1个捕获组 依赖捕获顺序
单词边界 \b 单词边界 不消耗字符
非边界 \B 非单词边界
转义 \. 匹配字面. 取消特殊含义

import os //创建文件夹、路径拼接
import time //计算运行时间
import random //导入Python标准库的随机模块,用于random.sample、random.sample等随机选择
import numpy as np //Numpy库(conda install numpy)
import cv2 //OpenCV库(conda install opencv)
import matplotlib.pyplot as plt //画图(conda install matplotlib)
import requests //发送HTTP请求,访问网页和接口的工具(conda install requests)
import pandas as pd //数据处理与数据分析(conda install pandas)