Python教程

当前位置:小码王 > 学习教程 > Python教程

少儿学Python编程要注意三个错误
导读:小码王少儿编程培训机构​老师为大家总结了之前学员在学习Python时容易犯的三个错误,写下来给新学习的朋友们,希望少儿学习的时候能注意并避免这三个错误,进一步提高学习效率。一起来了解一下。

对于学习来说,发现错误,解决错误,从犯错中总结学习知识才是正确的提升方式。学习Python编程同样如此,今天小码王少儿编程培训机构老师为大家总结了之前学员在学习Python时容易犯的三个错误,写下来给新学习的朋友们,希望少儿学习的时候能注意并避免这三个错误,进一步提高学习效率。一起来了解一下。

p1.jpg

错误一、在函数定义中,将可变数据类型作为默认参数


现在让我们来看一下这个简单的函数,我们将从当前页面抓取连接并将其添加到另一个列表中。

def search_for_links(page, add_to=[]):

    new_links = page.search_for_links()

    add_to.extend(new_links)

    return add_to


从表面来看,运行的很好,而事实也的确如此,它的确能运行。然而其中却有许多问题,如果我们用add_to作为参数,它可以如我们所想一样运行。然而如果我们使用默认参数,那么就会发生一些有趣的事情。


以下面的代码为例

def fn(var1, var2=[]):

    var2.append(var1)

    print var2

fn(3)

fn(4)

fn(5)


你可能以为我们能看到这样的结果

[3]

[4]

[5]


然而事实却是这样的

[3]

[3, 4]

[3, 4, 5]


为什么?你可以看到同样的列表被调用了三次,而在Python中,我们写出那样的函数,列表将实例化并作为函数定义的一部分,而并不是在每次函数运行的时候实例化。这说明了函数将会使用同样的列表内对象一遍又一遍,除非我们将函数修改成这样:


fn(3, [4])

[4, 3]


如我们所想的,正确的方式是这样的:

def fn(var1, var2=None):

    if not var2:

        var2 = []

    var2.append(var1)


或者以我们一个例子为例:

def search_for_links(page, add_to=None):

    if not add_to:

        add_to = []

    new_links = page.search_for_links()

    add_to.extend(new_links)

    return add_to


这一步将实例化从模块读取的时间中移出,这样实例化才能在每次函数运行的时候同步发生。而对于不可变数据类型则没有必要,只要做以下两步即可


def func(message="my message"):

    print message


错误二、将可变数据类型作为变量


紧随其后的错误就很普遍了,让我们来看一下:

class URLCatcher(object):

    urls = []

    def add_url(self, url):

        self.urls.append(url)


代码看起来没有任何问题是不是?这段代码将调用add_url来把连接储存到urls列表里去,那么接下来让我们来看下一步:

a = URLCatcher()

a.add_url('http://www.google.')

b = URLCatcher()

b.add_url('http://www.bbc.co.')

b.urls

['http://www.google.com', 'http://www.bbc.co.uk']

a.urls

['http://www.google.com', 'http://www.bbc.co.uk']


等等!为什么两个列表都有2个链接?我们不是分别将他储存进不同的列表了吗?


看起来其实和之前的问题有一点像,同样是将url列表编入了类的定义里,所以为了避免这种情况,我们可以通过这种方式来分别储存。

class URLCatcher(object):

    def __init__(self):

        self.urls = []


    def add_url(self, url):

        self.urls.append(url)

现在我们就可以将两个链接分别储存了。


错误三、用可变数据类型来赋值


这个问题困扰了不少人,现在让我们看一下如果使用字典会产生什么问题吧。


a = {'1': "one", '2': 'two'}


现在假设我们要将字典用在其他地方并且保留原字典内容


b = a


b['3'] = 'three'


是不是很简单?


那么回过头来再让我们看一下字典a里的内容

{'1': "one", '2': 'two', '3': 'three'}


现在字典a和字典b完全一样了,而如果我们用不可变数据类型来做结果就完全不同,以元组为例:

c = (2, 3)

d = c

d = (4, 5)


现在c是:

(2, 3)

元组d是:

(4, 5)


这次就成功地达到了我们的目的。那么为什么在例子中我们会失败?因为对于Python来说,当我们输入b=a,那么a与b之间会形成一个相互引用的关系,这其实就和我们之前的2个问题非常相似,这也是所有可变数据类型非常可能造成的麻烦。


如果我们真的很需要将部分列表调用出来来处理的话,那么我们可以用以下方法来做:

b = a[:]


通过这行代码,我们可以得到一个崭新的列表,但是如果在列表中的对象是可变数据类型而不是单纯的数据,那么同样会造成相同的问题。


正如A和B同时看着一份列表,而通过这行代码,A和B可以拥有各自的列表,然而如果列表中含有可变的数据类型,那么当A修改这个对象时,B同样会看到数据的改变。


字典也可以通过这行代码来实现这个目的。

b = a.copy()


同样的,如果按照刚刚的问题来修改的话,也会得到相同的结果。可变数据类型的麻烦的确很大,所以我们在平时编程时更要注重细节,避免类似错误的发生。


以上这三点就是Python编程过程中容易犯的几个错误,小朋友们学习的时候一定要引起注意,避免入坑。这毕竟是一门专业的计算机程序设计语言,学起来有一定难度,多学习别人的经验,多总结,才能更快提升实力。目前南京小码王少儿编程培训机构开设有Python课程,还有免费试听训练营,欢迎小朋友们前来试学了解,还能获得免费Python教程和课程资料,带你感受编程的乐趣,我们等你来!