python

if name == ‘main

当文件被执行时,执行if中的语句
当文件被作为模块引入时,不执行

parser

parser.addarguement()

import argparse

parser = argparse.ArgumentParser(description='test')

parser.add_argument('--sparse', action='store_true', default=False, help='GAT with sparse version or not.')
parser.add_argument('--seed', type=int, default=72, help='Random seed.')
parser.add_argument('--epochs', type=int, default=10000, help='Number of epochs to train.')

args = parser.parse_args()
print(args.sparse)
print(args.seed)
print(args.epochs)

具体的格式为:
add_argument() 方法定义如何解析命令行参数

ArgumentParser.add_argument(name or flags...[, action][, nargs][, const][, default][, type][, choices][, required][, help][, metavar][, dest])

每个参数解释如下:
name or flags - 选项字符串的名字或者列表,例如 foo 或者 -f, --foo。
action - 命令行遇到参数时的动作,默认值是 store_true ,即如果触发了该参数,则为True,不然为False.
store_const,表示赋值为const;
append,将遇到的值存储成列表,也就是如果参数重复则会保存多个值;
append_const,将参数规范中定义的一个值保存到一个列表;
count,存储遇到的次数;此外,也可以继承 argparse.Action 自定义参数解析;
nargs - 应该读取的命令行参数个数,可以是具体的数字,或者是?号,当不指定值时对于 Positional argument 使用 default,对于 Optional argument 使用 const;或者是 * 号,表示 0 或多个参数;或者是 + 号表示 1 或多个参数。
const - action 和 nargs 所需要的常量值。
default - 不指定参数时的默认值。
type - 命令行参数应该被转换成的类型。
choices - 参数可允许的值的一个容器。
required - 可选参数是否可以省略 (仅针对可选参数)。
help - 参数的帮助信息,当指定为 argparse.SUPPRESS 时表示不显示该参数的帮助信息.
metavar - 在 usage 说明中的参数名称,对于必选参数默认就是参数名称,对于可选参数默认是全大写的参数名称.
dest - 解析后的参数名称,默认情况下,对于可选参数选取最长的名称,中划线转换为下划线.

action
parser.add_argument('--name',action='store_true')

这种情况下,如果没有提到该参数的name,则默认为False,如果提到了,则为True

一些常用的函数

函数的参数

awgs和**kawgs
当有一个
的时候,允许同时写入多个参数,会以元组的形式读取这些参数:

def func(a,*awgs):
	print(awgs)

func(1,2,3,4)
>>>output:
>>>(2,3,4)

当有* * 的时候,表示传入的是关键字参数 (即类似于 a=5这种)。
这时候会以字典的形式读取这些参数:

def f(**kargs):
    print(kargs)
    
f(a=1,b=2) # 实际传入参数是两个,但是给包裹在一起

>>>output:
>>>{'a': 1, 'b': 2}

同时,当向函数中输入参数时,形式为* , 则*后面必须跟着一个Iterable,然后分别读取参数。例如:

def func(a,b,c):
    print(a)
    print(b)
    print(c)
        
func(*[1,2,3])

>>>output
>1
>2
>3

map()

map(function,iterable)
建立一个映射,将iterable依次作为function的参数,返回对应的输出。因为其特性,所以经常和lambda在一起进行使用

list(map(lambda x: x ** 2, [1, 2, 3, 4, 5]))   # 使用 lambda 匿名函数
输出为:[1, 4, 9, 16, 25]

注:返回的类型实际也是一个迭代器。因此可以通过迭代的方式进行读取(但是不是生成器)

print(isinstance(map(lambda x: x*x,[y for y in range(10)]),Iterable))

for i in map(lambda x: x*x,[y for y in range(10)]):
    print(i)
'----------------------------'
True

0
1
4
9
16
25
36
49
64
81

reduce()

reduce(function, iterable)

python 中的 reduce 函数可以对 iterable 迭代地应用在 function 中
比如:

from functools import reduce

def add(x, y) :            # 两数相加
    return x + y
sum1 = reduce(add, [1,2,3,4,5])   # 计算列表和:1+2+3+4+5
sum2 = reduce(lambda x, y: x+y, [1,2,3,4,5])  # 使用 lambda 匿名函数
print(sum1)
print(sum2)

最终能够得到:

15
15

lambda

匿名函数,用于定义一些简单的单行函数,可以使代码看起来更加简洁
详见
因为lambda的特性,所以可以和filter,map,reduce等搭配使用
重点是lambda是函数,所以要用函数的使用方法

f = lambda x : x**2
print(f(2))
'--------------'
4

set(iterable)

输入可迭代的对象,返回一个集合
例:

set_list = [1,2,5,9,10]
print(set(set_list))
输出为: {1, 2, 5, 9, 10}

id()

id(object)
返回对象的唯一标识符:
返回对象的地址

filter()

过滤器,其参数与map()类似,都为(function,iterable)
filter是返回符合function条件的元素。
如:

def is_odd(n):
    return n % 2 == 1
 
newlist = filter(is_odd, [1, 2, 3, 4, 5, 6, 7, 8, 9, 10])
print(newlist)

dict()

自动把key 变成字符串。

a=1
b=2
c=3

d = dict(a=a,b=b,c=c)
print(d)

{'a': 1, 'b': 2, 'c': 3}

vars()

vars(object)
返回对象的属性和属性值的字典

defaultdict()

不同于通常的dict,在没有对应的key时,不会报错。而是会返回默认值。
其中的参数可以是工厂函数,如list,int,str 等等 str返回的是空字符串,int返回的是0,list返回的是空列表

from collections import defaultdict

dict1 = defaultdict(int)
dict2 = defaultdict(set)
dict3 = defaultdict(str)
dict4 = defaultdict(list)
dict1[2] ='two'

print(dict1[1])
print(dict2[1])
print(dict3[1])
print(dict4[1])
>>>output:
0
set()

[]


由于可以接函数,因此defaultdict中的参数也可以是自己设定的函数(匿名函数也可以)
例如:

c = defaultdict(lambda:2)
print(c[1])
>>>output:
2

operator 操作符(增加可读性)

通过函数实现相加,减,乘除等等操作
operator

for循环

有关for循环中的continue与break,continue是跳出当前并继续下一个,而break是跳出整个。举例说明:
break:

for i in range(5):
    for k in range(4):
        if k == 2:
            break
        print((i,k))
==> (0, 0)
	(0, 1)
	(1, 0)
	(1, 1)
	(2, 0)
	(2, 1)
	(3, 0)
	(3, 1)
	(4, 0)
	(4, 1)

continue:

for i in range(5):
    for k in range(4):
        if k == 2:
            continue
        print((i,k))
==> (0, 0)
	(0, 1)
	(0, 3)
	(1, 0)
	(1, 1)
	(1, 3)
	(2, 0)
	(2, 1)
	(2, 3)
	(3, 0)
	(3, 1)
	(3, 3)
	(4, 0)
	(4, 1)
	(4, 3)

For break else的用法

详见
也即如果break被执行,就不执行else中的句子,如果直到遍历结束break都没有被执行,那么执行else中的句子。

File

可以看看这个

with open … as

在执行该语句时,文件默认是打开的,在离开该代码块后,自动关闭该文件,防止资源的浪费。

f.read/readline/readlines

f = open()
f.read()
将文件内容以字符串的形式读取
f.readline()
每次读取一行
f.readlines()
返回一个列表,每行的内容为一个元素

open

用于打开文件,如果文件不存在则创造一个文件。通常会在with open as中进行使用
有r,w,t,x,b等多种打开方式

f = open('text.txt','r')
f.read()

对open的实例进行操作 此处

OS

os.system()

os.system(string),执行括号中字符串所写的命令。
比如 os.system(‘python xxx.py’)

os.chdir()

改变当前的工作mulu

os.makedirs() 创建目录

os.makedirs(path)
可以创建多级目录

os.mkdir() 创建最后一级目录

os.path.basename()

返回最后的文件名

>>> os.path.basename('c:\test.csv')
'test.csv'
#(这里csv被当作文件名处理了) csv是一个目录
>>> os.path.basename('c:\csv')
'csv'

os.walk(path)

遍历path下的文件
其中root是一个字符串,是当前遍历的文件夹的地址
dirs是一个list,包括当前文件夹下所有目录的名字(不包含子目录)
files是一个list,包括当前遍历的文件夹下所有文件的名字
os.walk返回的是一个生成器,也就是说必须要通过迭代遍历来进行读取。
每个root都对应一个dirs和一个files(即每个被遍历的文件夹的名字,和其中的目录,以及其中的文件)
详见

for root,dirs,files in os.walk(path):

os.rmdir() 删除空文件夹

os.remove() 删除单个文件

其中root是该path本身的地址
dirs是该目录下的子目录
files是除了子目录外的所有文件

os.path.join()

os.path.join(root,name)
将root和name合起来作为

os.path.splitext()

将文件名与扩展名分离,返回一个包含文件名与扩展名的元组
example:

path_01='E:\STH\Foobar2000\install.log'
path_02='E:\STH\Foobar2000'
res_01=os.path.splitext(path_01)
res_02=os.path.splitext(path_02)
print(root_01)
print(root_02)
输出为:
('E:\\STH\\Foobar2000\\install', '.log')
('E:\\STH\\Foobar2000', '')

glob

用于读取所有符合某种类型的文件
在DL中常用到来进行构造数据集
详见此处
有多种匹配方式,* [] [!] 等等

shutil

可以对文件,文件夹进行拷贝
参照此处

shutil.rmtree(path) 删除

可以递归地删除整个文件夹(非空)

yaml

YAML是一种直观的能够被电脑识别的的数据序列化格式,容易被人类阅读,并且容易和脚本语言交互。
在deep_learning中,常常用来存储opts(参数:文件的参数非模型)
格式为:

with open('%s/opts.yaml'%dir_name,'w') as fp:
    yaml.dump(vars(opt), fp, default_flow_style=False)

load()

读取yaml文件,例:
import yaml
with open(‘dir_name’) as f
y = yaml.load(f)

load_all()

返回一个迭代器,例:

import yaml
f = '''
---
name: James
age: 20
---
name: Lily
age: 19
'''
y = yaml.load_all(f)
for data in y:
    print(data)

执行结果:

{'name': 'James', 'age': 20}
{'name': 'Lily', 'age': 19}

dump()

yaml.dump(object,f)
将一个python对象生成为yaml文件
:第二个参数一定要是一个 打开的文本文档或二进制文件,yaml.dump()会将生成yaml文档写入到f中去:

import yaml

aproject = {'name': 'Silenthand Olleander',
            'race': 'Human',
            'traits': ['ONE_HAND', 'ONE_EYE']
            }
f = open(r'E:\AutomaticTest\Test_Framework\config\config.yml','w')
print(yaml.dump(aproject,f))

dump_all()

将多个object写入到一个文件中:

import yaml

obj1 = {"name": "James", "age": 20}
obj2 = ["Lily", 19]

with open(r'E:\AutomaticTest\Test_Framework\config\config.yml', 'w') as f:
    yaml.dump_all([obj1, obj2], f)

Json

给出的数据集形式通常都是json,因为json可以直接将字符串转换为字典
如某json文件内容为:

import json
string = '{"height": [30.0], "label": [5], "left": [43.0], "top": [7.0], "width": [19.0]}'
json.load(string)
输出为:
a = {"height": [30.0], "label": [5], "left": [43.0], "top": [7.0], "width": [19.0]}

这样就可以方便对数据进行操作了

面向对象

类的函数

python的类有三种函数:普通,静态,类函数
其中普通函数为常用的函数,即需要先对类进行实例化之后才能进行调用。
静态函数为直接即可调用
类函数同样可以直接调用或者实例化之后调用
详见

Item系列

setitem

用于实现 object[‘key’] = value
即定义__setitem__之后,可以直接通过对实例的属性进行 = 赋值 ( 前提是已经定义好了设置属性的函数)

class Class()
	def __setitem__(self,key,value):
		return self.put(key,value)
经过定义后可以实现:
a = Class()
a['key'] = value
即可以直接通过=来进行赋值

getitem

用于通过object[‘key’] 直接得到value

class Class()
	def __getitem__(self,key,value):
		return self.get(key,value)
经过定义后可以实现:
a = Class()
print(a['key'])
可以直接print value
即可以直接通过object['key'] 得到value

delitem

用于删除属性值,实现:
del object[key]

contains

用于实现直接通过 in 语句来判断是否存在 该key

setattr

setattr(object,name,value)
为类的属性赋予值

str

是对字符串表示形式的定义,用于实现直接print(obj)的时候显示内容

call()

在定义类时,可以定义__call__()函数,定义之后,可以将实例化对象当做函数使用

class A():
    def __init__(self, init_age):
        super().__init__()
        print('我年龄是:',init_age)
        self.age = init_age
 
    def __call__(self, added_age):
        
 
        res = self.forward(added_age)
        return res
 
    def forward(self, input_):
        print('forward 函数被调用了')
        
        return input_ + self.age
print('对象初始化。。。。')
a = A(10)
 
 
input_param = a(2)
print("我现在的年龄是:", input_param)
 
 

即pytorch中的forward函数也是通过__call__来实现的

迭代器

NotImplementedError

NotImplementedError: 子类没有实现父类要求一定要实现的接口。

在面向对象编程中,父类中可以预留一个接口不实现,要求在子类中实现。如果一定要子类中实现该方法,可以使用raise NotImplementedError报错。

具体实现方式:
如果子类没有实现父类中指定要实现的方法,则会自动调用父类中的方法,而父类方法又是raise将错误抛出。这样代码编写者就能发现是缺少了对指定接口的实现。

String

字符串的格式化

参考

strip() 去除首尾字符

去除字符串首尾字符

str = "00000003210Runoob01230000000"; 
print str.strip( '0' );  # 去除首尾字符 0

str2 = "   Runoob      ";   # 去除首尾空格
print str2.strip();

以上实例输出结果如下:

3210Runoob0123
Runoob

只要首尾包含就删去,无所谓顺序

字符串顺序反转

string = '123'
print(string[::-1])
输出为:
'321'

str.split() 分割字符

str.split(sep = ‘’ , num = )
对字符串进行分割,其中sep为分割符,默认为空字符
num为分割后的数量
例:

str = "Line1-abcdef \nLine2-abc \nLine4-abcd";
print str.split( );       # 以空格为分隔符,包含 \n
print str.split(' ', 1 ); # 以空格为分隔符,分隔成两个

以上实例输出结果如下:

['Line1-abcdef', 'Line2-abc', 'Line4-abcd']
['Line1-abcdef', '\nLine2-abc \nLine4-abcd']

num不为默认值时:

txt = "Google#Runoob#Taobao#Facebook" 

# 第二个参数为 1,返回两个参数列表
x = txt.split("#", 1)
 
print x

以上实例输出结果如下:

['Google', 'Runoob#Taobao#Facebook']
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值