我们如何在以下输入中使用argv作为字符串?

时间:2019-06-16 14:24:19

标签: python ipython argv

我正在尝试这样做,它似乎可以很好地使用整数,但是不能使用字符串。我检查了文档,找不到任何内容。

from sys import argv
a, b, c = input(argv)
print(a,b,c)

输出:

['C:\\Users\\mani\\Anaconda3\\lib\\site-packages\\ipykernel_launcher.py', '-f', 'C:\\Users\\mani\\AppData\\Roaming\\jupyter\\runtime\\kernel-24b5eda5-a584-417e-a9f5-1c58531db5ae.json']mn nn nj

-
ValueError                                Traceback (most recent call last)
<ipython-input-23-181e7bc5c5de> in <module>
      1 from sys import argv
----> 2 a, b, c = input(argv)
      3 print(a,b,c)

ValueError: too many values to unpack (expected 3)

2 个答案:

答案 0 :(得分:0)

from sys import argv 
a, b, c = input(argv) 
print(a,b,c)

有点错误,您不需要使用inputargv解压到变量中。

from sys import argv 
a, b, c = argv[:3]
print(a,b,c)

就足够了,如果您只需要将argv中的前三个元素解压缩到abc中。

检查python introduction并阅读有关切片的知识(神奇的[:3])。

答案 1 :(得分:0)

不清楚您要使用sys.argv做什么。这是由Shell和Python解释器创建的字符串列表。通常,它与任何列表一样都可以读取,但是也可以修改。

In [16]: import sys                                                                       
In [17]: sys.argv                                                                         
Out[17]: 
['/usr/local/bin/ipython3',
 '--pylab',
 'qt',
 '--nosep',
 '--term-title',
 '--InteractiveShellApp.pylab_import_all=False']
In [18]: input(sys.argv)                                                                  
['/usr/local/bin/ipython3', '--pylab', 'qt', '--nosep', '--term-title', '--InteractiveShellApp.pylab_import_all=False']1 2 3
Out[18]: '1 2 3'

用作input的参数时,它仅用作提示字符串。这样做有什么意义?我们从input得到的是一个字符串(至少在Py3中; Py2不同)。

a,b,c = ...

像这样拆包是没有道理的。如果RHS上的物品数量错误,则会引发错误。

In [19]: a,b,c = input('3 items: ').split()   # split input string on space                                            
3 items: a b c
In [20]: a,b,c = input('3 items: ').split()                                               
3 items: d e
---------------------------------------------------------------------------
ValueError                                Traceback (most recent call last)
<ipython-input-20-7dacf1e93e8c> in <module>
----> 1 a,b,c = input('3 items: ').split()

ValueError: not enough values to unpack (expected 3, got 2)
In [21]: a,b,c = input('3 items: ').split()                                               
3 items: 1 2 3 4
---------------------------------------------------------------------------
...
ValueError: too many values to unpack (expected 3)

所以我看到三个问题:

  • 关于sys.argv是什么以及如何使用的疑问
  • input的论点是什么
  • 开箱的脆弱用途

===

我认为您对input的功能以及拆包的工作方式感到困惑:

In [67]: a,b,c = input('3 numbers: ')                                                     
3 numbers: 123
In [68]: a                                                                                
Out[68]: '1'
In [69]: b                                                                                
Out[69]: '2'
In [70]: c                                                                                
Out[70]: '3'
In [71]: a,b,c = input('3 numbers: ')                                                     
3 numbers: 1 2 3
...
ValueError: too many values to unpack (expected 3)

In [74]: a,b,c = input('3 numbers: ')                                                     
3 numbers: 1234
...
ValueError: too many values to unpack (expected 3)

使用input等效于:

In [72]: a,b,c='123' 

字符串中的3个字符分布在3个变量中。如果您提供更长(或更短)的字符串,则说明解压缩所需的3个变量不匹配。


或者在输入“ mn nn nj”的地方复制示例:

In [75]: input(['a','list','of','strings'])                                               
['a', 'list', 'of', 'strings']mn nn nj                        
Out[75]: 'mn nn nj'

In [76]: a,b,c=_        # trying to unpack that string to 3 variables                                                                  
...
ValueError: too many values to unpack (expected 3)

In [77]: a,b,c=_.split()    # split on white space                                                                  
In [78]: a,b,c                                                                            
Out[78]: ('mn', 'nn', 'nj')