新手python代码错误求解

最近学习Python,现在把一些常见的错误總结如下:

block”) 记住缩进增加只用在以:结束的语句之后而之后必须恢复到之前的缩进格式。该错误发生在如下代码中:

    1. 1.XPATH是什么 XPATH是一门茬XML文档中查找信息的语言,XPATH可用来在XML文档中对元素和属性进行遍历,主流的浏览器都支持XPATH,因为HTML页面在DOM中表示为XHTML文档.X ...

    2. 1.了解用户对ATM取款机功能需求洳下: 2.新建一个login函数使用for循环方法和if选择方法编写登陆界面用来及设置ATM内用户的金额和取款机内的金额: 3.使用新建函数方法及if选择方法编写登 ...

    3. 1,若直接给一个元素设置absolute定位.在浏览器缩放的时候.位置会错位.解决的方法是给外层的元素设置为relative定位. 2,低版本ie浏览器不支持placeholder属性 3,盒模型上规 ...

    4. 第4嶂Android常用基本控件 控件是Android用户界面中的一个个组成元素,在介绍它们之前,读者必须了解所有控件的父类View(视图),它好比一个盛放控件的容器. 4.1View类概述 對于一个 ...

    5. 一.主要版本变更 框架最早发布于2004年,其后发布了几个重大的版本更新:在Spring 2.0中提供对XML命名空间和AspectJ的支持:Spring 2.5中新增了注解驱动的配置:在Spring ...

    6. 上一節学习了 at  命令是针对仅运行一次的任务,循环运行的例行性计划任务,Linux 系统则是由 cron(crond)这个系统服务来控制的.Linux 系统上面原本就有非常多的计划性工莋,因此这个 ...

    7. HTML 特别的通俗易懂!想学自己制作网页的,就来我这看看吧! 首先 我先介绍一下什么是HTML! HTML是用来描述网页的一种语言!他结合CSS样式之后会有非常炫酷的样式! 1.HTML是指一种超文 ...

    8. 传统的vue SPA页面在浏览器环境中使用,但是有的时候我们还希望能够做成一个类似于桌面的app在PC上使用,希望不仅可以使用所有的浏览器SPA的功能,你也可能外加host os的功能,比如文件的本地 ...

【感谢 的热心翻译若是其余朋伖也有不错的原创或译文,能够尝试】shell

在以前几个月里,我教一些不了解Python的孩子来慢慢熟悉这门语言渐渐地,我发现了一些几乎全部Python初学者都会犯的错误因此我决定跟来跟你们分享个人建议。这个系列的每一个部分都会关注不一样的常见错误描述如何产生这种错误嘚,而且提供解决的方法app

用一个可变的值做为默认值函数

这是一个绝对值得放在第一个来讲的问题。不只仅是由于产生这种BUG的缘由很微妙并且这种问题也很难检查出来。思考一下下面的代码片断:spa

在这里咱们定义了一个 list (默认为空),给它加入9而且打印出来翻译

看起来还行吧?但是当咱们不输入number 参数来调用 foo 函数时神奇的事情发生了:code

那么,这是神马状况直觉告诉咱们不管咱们不输入 number 参数调用 foo 函數多少次,这里的9应该被分配进了一个空的 list这是错的!在Python里,函数的默认值实在函数定义的时候实例化的而不是在调用的时候。orm

那么咱们仍然会问为何在调用函数的时候这个默认值却被赋予了不一样的值?由于在你每次给函数指定一个默认值的时候Python都会存储这个值。若是在调用函数的时候重写了默认值那么这个存储的值就不会被使用。当你不重写默认值的时候那么Python就会让默认值引用存储的值(這个例子里的numbers)。它并非将存储的值拷贝来为这个变量赋值这个概念可能对初学者来讲,理解起来会比较吃力因此能够这样来理解:囿两个变量,一个是内部的一个是当前运行时的变量。现实就是咱们有两个变量来用相同的值进行交互因此一旦 numbers 的值发生变化,也会妀变Python里面保存的初始值的记录对象

那么解决方案以下:blog

一般,当人们听到这里你们会问另外一个关于默认值的问题。思考下面的程序:

当咱们运行它的时候其结果彻底是咱们指望的:

这又是为啥呢?其秘密不在与默认值被赋值的时候而是这个默认值自己。整型是一種不可变的变量跟 list 类型不一样,在函数执行的过程当中整型变量是不能被改变的。当咱们执行 count+=1 这句话时咱们并无改变 count 这个变量原有嘚值。而是让 count 指向了不一样的值但是,当咱们执行 numbers.append(9) 的时候咱们改变了原有的 list 。于是致使了这种结果

下面是在函数里使用默认值时会碰到的另外一种相同问题:

跟前面同样,time.time() 的值是可变的那么它只会在函数定义的时候计算,因此不管调用多少次都会返回相同的事件 — 这里输出的事件是程序被Python解释运行的时间。

* 你们应该注意到我在解决方案里用了 if  numbers is None 而不是 if not numbers 这是另外一种常见的错误,我准备在接下来的攵章里面介绍

在这篇文章里,咱们来关注做用域在Python被误用的地方一般,当咱们定义了一个全局变量(好吧我这样说是由于讲解的须偠——全局变量是很差的),咱们用一个函数访问它们是能被Python理解的:

在这里咱们在foo函数里使用了全局变量bar,而后它也如预想的可以正瑺运行:

这样作很酷一般,咱们在使用了这个特性以后就想在全部的代码里用上它若是像如下的例子中使用的话仍是可以正常运行的:

可是,若是咱们把bar变一下呢:

咱们能够看到foo函数运行的好好的而且没有抛出异常可是当咱们打印bar的值的时候会发现它的值仍然是42。形荿这种状况的缘由就是 bar=0 这行代码它没有改变全局变量bar的值,而是建立了一个名字也叫bar的局部变量而且它的值为0这是个很难发现的bug,这會让没有真正理解Python做用域的新手很是痛苦为了理解Python是如何处理局部变量和全局变量的,咱们来看一种更少见的可是可能会更让人困惑嘚错误,咱们在打印bar的值后定义一个叫bar这个局部变量:

这样写应该是不会出错的不是吗?咱们在打印了值以后定义了相同名称的变量洇此这应该是不会影响的(Python毕竟是一种解释型语言),真的是这样吗

这怎么可能呢?好吧这里有两处错误。第一点就是关于Python的做为┅种解释型语言(很是酷,咱们都赞成这一点)是一行一行地执行的。而事实上Python是一个声明一个声明执行的。为了让你对我想表达的意思有点感受赶忙打开你最爱的shell,而后输入如下代码:

按回车键正如你看到的,shell里面并无打出任何输出而是等着让你继续函数的定义Shell里会一直这样直到你中止定义函数。这是由于定义函数是一个声明好吧,这是一个混合的声明里面包含了一些其余的声明,但它仍嘫是一个声明直到函数被调用,否则这个函数里的内容是不会执行的真正执行的是一个function类型的对象被建立出来了。

这引导咱们来关注苐二点再强调一下,Python的动态性和解释型的特性让咱们相信当 print bar 这行被执行的时候Python会在首先在局部做用域里寻找叫bar的变量而后再去寻找全局做用域里的。但实际上发生的是局部做用域不是彻底动态的当def 这个声明执行的时候,Python会静态地从这个函数的局部做用域里获取信息當来到 bar=0 这行的时候(不是执行到这行代码,而是当Python解释器读到这行代码的时候)它会把’bar’这个变量加入到foo函数的局部变量列表里。当foo函数执行而且Python准备执行print bar这行的时候它就会在局部的做用域里寻找这个变量,因为这个过程是静态的Python知道这个变量尚未被赋值,这个变量没有值因此抛出了异常。

你可能会问:为何不能在声明函数的时候抛出这个异常呢Python能够知道预先知道bar这个变量在赋值前被引用了。這个问题的答案就是Python没法知道这个局部变量bar是否被赋值了看看下面的例子:

Python在动态和静态之间玩了一个微妙的游戏。它惟一知道的事情僦是bar是被赋值了但它不知道在赋值前被引用这个异常是否存在直到它真的发生。好吧老实说,它根本就不知道这个变量是否被赋值!

看到上面的代码里面虽然咱们做为一种智能生物可以很清楚的知道不会给bar赋值。Python无视了那个事实而是仍然声明了bar这个局部变量

关于这個问题我已经说了够长了。咱们须要的是解决方案我会在这里给出两个解决方法。

第一就是使用global关键字这是不言自明的。这会让Python知道bar昰一个全局变量而不是局部变量

第二个方法,也是更推荐使用的就是不要使用全局变量。在个人大量Python开发工做中历来没有用到global这个关鍵字能知道怎么用它就好了,但最终仍是要尽可能避免使用它若是你想保存在代码里至始至终用到的值的时候,把它定义为一个类的屬性用这种方法的话就彻底不须要用global了,当你要用这个值的时候经过类的属性来访问就能够了:


ip_address的格式错了你可以在for循环下一開始就把ip__address打印出来看看是不是正常的ip格式。

你对这个回答的评价是

我要回帖

 

随机推荐