本文总结了一些细节性的语法知识
__init__
的作用:
-
Python中package的标识,不能删除
-
定义
__all__
用来模糊导入:
在__init__
文件中:__all__
= [“模块名”,“函数名”,“变量名”]from 模块 import *
会从__all__
中逐个导入 -
批量导入外部目录的包
- 在__init__文件中:
import os
imoprt sys
- 在所需引用的文件中:
import __init__所在的包名 as na
想使用init的包需要在包前加入命名空间na
-
定义类时,相当于构造函数,自动调用forward的函数
super(ConvBNLayer, self).__init__() #父类对象调用自已的init函数,来初始化子类 #父类的__call__会调用forward
参数类型
- *args表示可变参数(元组) ps:
*
的作用:1.函数实参,2.序列解包 - **kwargs表示关键字参数(字典)
惰性序列(迭代器):
迭代至某个元素才会去计算,节省了内存资源
list与array:
- list的元素类型不必相同,但需存储指针与元素类型;array的元素类型必须相同
range与np.arange:
- range返回类型range,可用于迭代;arange返回类型numpy.ndarray,且步长可以是小数,可用于向量使用
zip:
- zipped=zip(a,b)打包;a,b=zip(*zipped)解包
eval与ravel、flatten:
- ravel()与flatten()都是将多维数组降为一维,其中flatten()不会对原矩阵产生影响;eval()执行字符串表达式并返回值
判值或判指向
x == y
#两引用对象是否有相同值x is y
#两引用是否指向同一对象
os与sys:
__file__
获取当前脚本路径
-
os.system()
运行命令 -
os处理文件
-
增
os.mkdir()
创建单个目录os.makedirs()
创建多级目录
-
删
os.remove
删除一个文件os.removedirs
删除多个文件夹
-
改
os.renames(old,new)
递归重命名目录或文件
os.path.split()
分离文件名,返回两个值os.path.splitext()
分离扩展名,返回两个值os.path.join(dir,filename)
拼接目录名和文件名
-
查
os.getcwd()
获取所在文件夹路径os.listdir
返回指定目录下的所有文件和文件夹
os.path.abspath()
获取文件的绝对路径os.path.realpath()
获取文件的绝对路径(这是快捷方式对应文件的路径,而非软链接所在的路径)os.path.basename()
获取文件名称os.path.dirname()
获取所在文件夹路径,可嵌套使用os.path.isfile()
检验路径是否为文件os.path.isdir()
检验路径是否为文件夹os.path.exists()
检验路径是否真实存在
-
-
sys.path
获取列表形式的文件路径、sys.argv
获取脚本参数
读写文件
将内容写入文件中:
方法一:
print('test1','test2',2022,sep='\n',file=open('hello.txt','w',encoding='utf-8'))
方法二:
import json
filename = "infos.jsonl" #jsonl格式可每行存储字典
with open(filename, 'a', encoding='utf-8') as f:
json.dump(data_json, f, ensure_ascii=False)
f.write('\n')
读取文件并整体输出:
def read_file(filename):
# with可以自动释放缓存
with open(filename,'r',encoding='utf-8')as f:
content=f.readlines()
print(content)
序列化pickle与json
- api
- dump写入文件
- dumps生成序列化字符串
- load文件加载
- loads把序列化的字符串反向解析
- 不同
- json --> 实现Python数据类型与通用(json)字符串之间的转换
所有语言都支持
只支持常规数据类型,如str、int、tuple、list、set、dict - pickle --> 实现Python数据类型与Python特定二进制格式之间的转换
支持python
支持py的所有数据类型
- json --> 实现Python数据类型与通用(json)字符串之间的转换
json序列化
数据类型对应关系
Python | Json |
---|---|
dict | Object |
list,tuple | array |
str | string |
int,float,int- | numbers |
True | true |
False | false |
None | null |
Python | Json |
---|---|
Object | dict |
array | list |
string | str |
number(int) | int |
number(real) | float |
true | True |
false | False |
null | None |
注意自定义的数据类型需要转换:
序列化:Python对象 --> dict --> JSON object
反序列化:JSON object -> dict --> Python对象
#序列化
#indent缩进:JSON的array元素和object成员会以相应的缩进级别进行打印输出
#separators的值必须是tuple,通过赋值(',',':')来消除空白字符
#ensure_ascii设置为False,中文可显示
import json
a=json.dumps({'a': '中国 ', 'c': True, 'e': 10, 'b': 11.1, 'd': None, 'f':[1, 2, 3], 'g': (4, 5, 6)},sort_keys=True,separators=(',',':'),ensure_ascii=False)
print("a:",a)
#反序列化
b=json.loads(a)
print("b:",b)
#序列化到文件中
with open('test.json', 'w') as fp:
json.dump({'a': 'str中国', 'c': True, 'e': 10, 'b': 11.1, 'd': None, 'f': [1, 2, 3], 'g': (4, 5, 6)}, fp,indent=4)
#反序列化文件中的内容
with open('test.json', 'r') as fp:
print(json.load(fp))
pickle序列化
import pickle
text = {'a':'str', 'c': True, 'e': 10, 'b': 11.1, 'd': None, 'f': [1, 2, 3], 'g':(4, 5, 6)}
#序列化
a = pickle.dumps(text)
print(a)
#反序列化
b = pickle.loads(a)
print(b)
#持久化到文件
with open('pickle.txt', 'wb') as f:
pickle.dump(text , f)
# 从文件中读取数据
with open('pickle.txt', 'rb') as f:
b = pickle.load(f)
print(b)
...
详见:https://www.cnblogs.com/yyds/p/6563608.html
参数解析
import argparse
parser = argparse.ArgumentParser() # 初始化解析器
parser.add_argument("--picture",default='a',help="图片名") # 值不能用单引号, 参数名称可不全输入,但区分大小写
parser.add_argument("-image",default='b', help="图片名") # 当-i和--image同时存在的时候,只会有args.image而没有args.i
parser.add_argument("abc",default='c', help="图片名") # 位置参数,[不需要写参数名称,参数输入的顺序必须与程序中定义的顺序一致]
args = parser.parse_args() # 解析参数
args.pic=1 #会新增pic参数
args.abc=3 #命令行必须要有参数
–与-的异同之处:
-
相同点:
==–与-==的值不能用单引号, 参数名称可不全输入形如:
--pic aa
,但区分大小写 -
不同点:
当==–image和-i==同时存在的时候,只能args.image而不能args.i
优先级
- args.picture = aaa 参数名称必须输全
- 命令行参数
- default字段值
pip库用法
自行安装:
从官网上(https://bootstrap.pypa.io/get-pip.py)直接下载get-pip.py,然后直接运行python get-pip.py脚本即可
增删升查:
-
增
pip install package-name
-
下载不安装:
pip download package_name -d "path"
-
指定国内源安装:
pip install -i https://pypi.douban.com/simple/ package_name
-
批量安装:
pip install -r requirements.txt
-
生成已安装的库包:
pip freeze > requirements.txt
-
打包:
pip wheel package-name
-
-
删
pip uninstall package_name
-
升
pip install -U package_name
-
查
pip show -f package_name
- 查看版本兼容问题:
pip check
- 查看已安装的库包:
pip list
- 查看版本兼容问题:
国内源:
清华:https://pypi.tuna.tsinghua.edu.cn/simple
阿里云:http://mirrors.aliyun.com/pypi/simple/
中国科技大学 https://pypi.mirrors.ustc.edu.cn/simple/
华中理工大学:http://pypi.hustunique.com/
山东理工大学:http://pypi.sdutlinux.org/
豆瓣:http://pypi.douban.com/simple/
collections库用法
a=[10, 10, 12, 12, 10, 13, 13, 14]
# 统计列表中元素的频率
print(dict(collections.Counter(a))) #{10: 3, 12: 2, 13: 2, 14: 1}
# 创建
iterable1 = [10, 10, 12, 12, 10, 13, 13, 14]
iterable2 = [10, 14, 14, 14, 14, 14]
counter1 = collections.Counter(iterable1) # Counter({10: 3, 12: 2, 13: 2, 14: 1})
counter2 = collections.Counter(iterable2) # Counter({14: 5, 10: 1})
print(counter1)
print(counter2)
print('key出现频次:', counter1[10]) # key出现频次
print('返回n个出现频次最高的元素和其对应出现频次:', counter1.most_common(2))
# counter加减
print(counter1+counter2)
print(counter1-counter2)
# 检查两个字符串的组成元素是否相同
print(collections.Counter(iterable1) == collections.Counter(iterable2))
loguru库用法
下载并导入
pip install loguru
from loguru import logger
使用
add()
方法对logger
进行简单的配置:
logger.add('runlog.log', encoding='utf-8')
logger.add("runtime_{time}.log", rotation="10 MB", encoding='utf-8') # 文件过大于10M就会重新生成一个文件
logger.add("test_4.log", retention="5 days", encoding='utf-8') # 只保留最近五天的日志文件
logger.add("test_5.log", compression="zip", encoding='utf-8') # 以zip格式对日志进行保存
根据等级写入日志
logger.debug("debug message")
logger.info("info level message")
logger.warning("warning level message")
logger.error("error level message")
logger.critical("critical level message")
https://zhuanlan.zhihu.com/p/514838075
元类
# property装饰器用于将被装饰的方法伪装成一个数据属性,在使用时可以不用加括号而直接引用
class PersonInfo:
def __init__(self, name, sex):
self.name = name
self.sex = sex
# 默认生成实例方法,输入参数至少有一个:实例对象self
# @classmethod 类方法,输入参数至少有一个:类本身cls
# @staticmethod 类静态方法,无法调用任何类属性和类方法,就是普通方法
numpy
返回前N大数及其索引
np.partition
与np.argpartition
import numpy as np
a_list = [7, 10, 12, 0, 6, 8, 9, 1, 16, 4, 6, 100]
a_array = np.array([7, 10, 12, 0, 6, 8, 9, 1, 16, 4, 6, 100])
index_big = np.argpartition(a_list, -3)[-3:]
print('前k大元素索引:', np.argpartition(a_list, -3)[-3:])
print(a_array[index_big])
print('前k小元素索引:', np.argpartition(a_list, 3)[:3])
print('-------------------------------')
print('前k大元素:', np.partition(a_array, -3)[-3:])
print('前k小元素:', np.partition(a_array, 3)[:3])
返回满足特定条件的元素索引
where
y = np.array([1, 5, 6, 8, 1, 7, 3, 6, 9])
print(y[np.where(y > 5)])
print(np.where(y > 5, "Hit", "Miss")) #['Miss' 'Miss' 'Hit' 'Hit' 'Miss' 'Hit' 'Miss' 'Hit' 'Hit']
operator
用符号代替函数
import operator
# add,sub这些函数入参只有两个
action = {
"+": operator.add,
"-": operator.sub,
"/": operator.truediv,
"*": operator.mul,
"**": pow
}
print(action['/'](50, 5)) # 25