python下generator等高级功能

本文介绍了Python中的高级用法,包括使用argparse进行命令行参数解析、对比generator与list的性能差异、利用enumerate和zip增强循环操作,以及使用yield创建自定义生成器。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

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那样申请很多内存。

Python yield 使用浅析 :参考解释

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的显示填充

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值