python下使用argparse包来进行控制端的输入输入参数
一个例子
import argparse
def main():
parase = argparse.ArgumentParser()
parase.add_argument('--x', type=float, default=1.0,
help='What is the first number?')
parase.add_argument('--y', type=float, default=1.0,
help='What is the second number?')
parase.add_argument('--operation', type=str, default='add',
help='What operation?')
args = parase.parse_args()
print(str(calc(args)))
def calc(args):
if args.operation == 'add':
return args.x + args.y
elif args.operation == 'sub':
return args.x - args.y
elif args.operation == 'mul':
return args.x * args.y
elif args.operation == 'div':
return args.x / args.y
if __name__ == '__main__':
main()
这样在控制端命令下可是指定参数的输入。
比如windows下cmd打开命令端,输入下面可以得到带默认参数以及带特定参数的例子:
C:\Users\19241>python D:\myself\python\untitled0.py
2.0
C:\Users\19241>python D:\myself\python\untitled0.py --x=2 --y=10 --operation=sub
-8.0
C:\Users\19241>python D:\myself\python\untitled0.py --x=2 --y=10 --operation=div
0.2
同时还可以-h获得参数编辑的help输入信息
C:\Users\19241>python D:\myself\python\docment\CycleGAN-master\untitled0.py -h
usage: untitled0.py [-h] [--x X] [--y Y] [--operation OPERATION]
optional arguments:
-h, --help show this help message and exit
--x X What is the first number?
--y Y What is the second number?
--operation OPERATION
What operation?
python下的 generator 与 生成的 list
一般来说在循环下生成的list速度较慢,使用generator速度较快。
典型的在循环里面使用range
for i in range(10)
print(i)
生成一个0-n的序列列表的方法可以为:
>>> xyz = [i for i in range(5)]
>>> print(xyz)
[0, 1, 2, 3, 4]
如果将中括号改为小括号,则生成的是generator
>>> xyz = (i for i in range(5))
>>> print(xyz)
<generator object <genexpr> at 0x000001D0B67BB2B0>
下面两个等效:
xyz = [i for i in range(5)]
print(xyz)
xyz = (i for i in range(5))
for i in xyz:
print(i)
>>>
[0, 1, 2, 3, 4]
0
1
2
3
4
如果当数值很大的时候,比如5000000000,那么第二种方法将省时间,因为产生的是生产器generator,没有产生实际的list,如果产生的是list,将会消耗大量的内存来存储这个list。
将generator转化为数值的list直接list(data)
>>> range(5)
range(0, 5)
>>>list(range(5))
[0, 1, 2, 3, 4]
python下的测时间模块timeit
通过测试看看上述两种方法的时间消耗:
import timeit
print(timeit.timeit('''
xyz = [i for i in range(50000)]
''',number=100))
print(timeit.timeit('''
xyz = (i for i in range(50000))
''',number=100))
0.23779643962328834
9.441979039337411e-05
可以明显的看出使用generator的优势。
python 下的enumerate函数
- enumerate()是python的内置函数
- enumerate在字典上是枚举、列举的意思
- 对于一个可迭代的(iterable)/可遍历的对象(如列表、字符串),enumerate将其组成一个索引序列,利用它可以同时获得索引和值
- enumerate多用于在for循环中得到计数
example = ['left','right','up','down']
#直接求长度索引办法
for i in range(len(example)):
print(i,example[i])
print('\n')
#另一种采用枚举办法
for i,j in enumerate(example):
print(i,j)
print('\n')
#索引默认从0开始,可以添加参数修改这个索引
for i,j in enumerate(example,4):
print(i,j)
0 left
1 right
2 up
3 down
0 left
1 right
2 up
3 down
4 left
5 right
6 up
7 down
- enumerate的另一用途通过根据列表生成dict
example = ['left','right','up','down']
#另一种采用枚举办法
for i,j in enumerate(example):
print(i,j)
new_dict = dict(enumerate(example))
print(new_dict)
0 left
1 right
2 up
3 down
{0: 'left', 1: 'right', 2: 'up', 3: 'down'}
- zip方法:将多个变量联合打包起来一起循环
注意的是zip所联合的长度安装里面程度较短的来匹配,多的去掉。
x = [1,2,3,4]
y = [6,4,7,8]
z = ['a','b','c','d']
for a,b,c in zip(x,y,z):
print(a,b,c)
dic = dict(zip(x,y))
print(dic)
dic = dict(zip(y,z))
print(dic)
>>>
1 6 a
2 4 b
3 7 c
1 8 d
{1: 8, 2: 4, 3: 7}
{8: 'd', 4: 'b', 6: 'a', 7: 'c'}
如果将y长度修改:
x = [1,2,3,1,4]
y = [6,4,7]
z = ['a','b','c','d']
for a,b,c in zip(x,y,z):
print(a,b,c)
dic = dict(zip(x,y))
print(dic)
dic = dict(zip(y,z))
print(dic)
>>>
1 6 a
2 4 b
3 7 c
{1: 6, 2: 4, 3: 7}
{4: 'b', 6: 'a', 7: 'c'}
最终的长度按照y的长度来计算。
- yield的功能
可以人工制作python运行需要的generator; 这么做的目的可以在某些地方达到即节省内存也保证了速度。因为generator在进行循环的时候每次只保存下一次循环所需要的循环值,从而可以避免像list那样申请很多内存。
CORR_COMBO = (3,4,5)
def combo_gen():
for c1 in range(10):
for c2 in range(10):
for c3 in range(10):
yield (c1, c2, c3)
for (c1,c2,c3) in combo_gen():
print (c1,c2,c3)
if (c1,c2,c3) == CORR_COMBO:
print('fins combo: {}'.format((c1,c2,c3)))
break;
>>>
...
3 4 2
3 4 3
3 4 4
3 4 5
fins combo: (3, 4, 5)
>>>
这里采用yield的方式生成generator速度更快,内存更少;
同时print的几个小技巧:可以在字符串中加 ‘{ }’ 来表示需要输出的参数,采用format的显示填充。