2017-11-25 340 views
0

我是Python的新手,并试图了解机器学习。以下是我从Udacity任务获得的代码块。python文件名,_ = urlretrieve(url +文件名,dest_filename,reporthook = download_progress_hook)

def maybe_download(filename, expected_bytes, force=False): 
    """Download a file if not present, and make sure it's the right size.""" 
    dest_filename = os.path.join(data_root, filename) 
    if force or not os.path.exists(dest_filename): 
    print('Attempting to download:', filename) 
    filename, _ = urlretrieve(url + filename, dest_filename, reporthook=download_progress_hook) 
    print('\nDownload Complete!') 
    statinfo = os.stat(dest_filename) 
    if statinfo.st_size == expected_bytes: 
    print('Found and verified', dest_filename) 
    else: 
    raise Exception(
     'Failed to verify ' + dest_filename + '. Can you get to it with a browser?') 
    return dest_filename 

我可以理解大部分的部分。但是,我很困惑filename, _ = urlretrieve(...)部分。这个分配是什么?我在调试器中追踪它,发现在此表达式之前或之后filename = '.\\notMNIST_large.tar.gz'保持不变。

所以我的问题这个filename, _ = urlretrieve(...)究竟意味着什么?这是一种先进的技术来分配隐藏表达中的价值吗?

+0

'urlretrieve'函数返回2个值。通话后'_'的价值是多少? – gcw

回答

0

Python有一个名为“元组拆包”,其允许分配一个tuple的元件(或只是任何实际序列)变量特征。所以,如果你有为例一(width, height)元组,并希望将其指定的元素,单个变量,你可以做它在一个单一的声明,即:

size = (42, 124) 
width, height = size 
print width 
print height 

某些功能使用这个返回一个元组,这是平时解压的函数调用返回,即:

def foo(): 
    return "a", 42 

letter, answer = foo() 

,有时呼叫者只是不关心这些值之一,因此分配不必要的值_是一种常见的约定,意思是“我不关心这个价值“(FWIW'_'不是什么特别的或魔术,它是一个有效的变量名称,就像'a'或'foo'或其他任何东西)。

urlretrieve()恰好是这些功能之一 - 它实际上

返回一个元组(文件名,标题),其中文件名是在该对象可以找到本地文件名,标题是无论信息()通过的urlopen返回的对象的()方法返回(远程对象,可能缓存)

https://docs.python.org/2/library/urllib.html#urllib.urlretrieve

其原因返回本地文件名urlretrieve可以在没有filename参数的情况下被调用,在这种情况下,它将内容保存在带有生成名称的临时文件中,并返回该名称,以便调用者可以访问该文件。

在你的代码片段中,实际上没有真正的理由将这个值重新分配到现有的filename,因为它应该是同一个名字,所以它最好是混淆。检查头文件(在这里忽略)以查明我们得到的是否真的是我们所期望的(内容类型,编码等)将是一个更好的主意。

+0

谢谢!你的帮助太棒了!现在我懂了。 –

0

在Python中,_变量是“我对此返回值不感兴趣”的成语。 urlretrieve函数returns a tuple(一系列不可分割的值)包含两个值:包含请求结果的文件的文件名以及返回文档的标题。所以标题基本上被“扔掉”,因为函数不想关心它们。

这里是一个小玩具的例子,进一步说明了这一概念:

def myFunction(): 
    return(1,2) 

a, _ = myFunction() 
print a