首页 > 编程语言 > 详细

Python 易错点

时间:2019-08-21 20:07:32      阅读:124      评论:0      收藏:0      [点我收藏+]

1. Python查找一个变量时会按照“局部作用域”, “嵌套作用域”, “全局作用域”,“内置作用域”的顺序进行搜索。

在实际开发中,我们应该尽量减少对全局变量的使用,因为全局变量的作用域和影响过于广泛,可能会发生意料之外的修改和使用,除此之外全局变量比局部变量拥有更长的生命周期,可能导致对象占用的内存长时间无法被垃圾回收。事实上,减少对全局变量的使用,也是降低代码之间耦合度的一个重要举措,同时也是对迪米特法则的践行。减少全局变量的使用就意味着我们应该尽量让变量的作用域在函数的内部,但是如果我们希望将一个局部变量的生命周期延长,使其在函数调用结束后依然可以访问,这时候就需要使用闭包,这个我们在后续的内容中进行讲解。

说了那么多,其实结论很简单,从现在开始我们可以将Python代码按照下面的格式进行书写,这一点点的改进其实就是在我们理解了函数和作用域的基础上跨出的巨大的一步。

main()函数定义的变量不是全局变量所以没法直接被其他地方调用。

def main():
    # Todo: Add your code here
    pass


if __name__ == __main__:
    main()

 

2. 对list用加法并不是让两个list内部元素相加,而是将两个list里面的元素叠加。

 

3. python 赋值:

  • 直接赋值:其实就是对象的引用(别名)。

  • 浅拷贝(copy):拷贝父对象,不会拷贝对象的内部的子对象。

  • 深拷贝(deepcopy): copy 模块的 deepcopy 方法,完全拷贝了父对象及其子对象。

对于python的基本类型和不可变类型来说,如int, float, double, str等,对他们的赋值直接用=号就可以使得接下来的操作独立互补干扰;而对于list, tuple, dict等赋值操作,变量之间的操作一般都不是独立的,如果我们希望他们之间独立的话,我们需要使用copy module的deepcopy()来进行深拷贝。

 

4. list(tuple)生成式:

f = [x + y for x in ABCDE for y in 1234567]  # 直接生成一个列表,耗费较多空间
f = (x ** 2 for x in range(1, 1000))    # 生成一个生成器,不占用存储空间,不过需要通过一些方法来取用里里面的元素

yield生成器 ??

 

5. set: set.add(), set.update(list)将列表中元素加入set中,set.discard(), set&set, set|set, set1-set2,set^set,交集,并集,差集,对称差运算

    # 集合的交集、并集、差集、对称差运算
    print(set1 & set2)
    # print(set1.intersection(set2))
    print(set1 | set2)
    # print(set1.union(set2))
    print(set1 - set2)
    # print(set1.difference(set2))
    print(set1 ^ set2)
    # print(set1.symmetric_difference(set2))
    # 判断子集和超集
    print(set2 <= set1)
    # print(set2.issubset(set1))
    print(set3 <= set1)
    # print(set3.issubset(set1))
    print(set1 >= set2)
    # print(set1.issuperset(set2))
    print(set1 >= set3)
    # print(set1.issuperset(set3))

 

6. dict:

 scores = {骆昊: 95, 白元芳: 78, 狄仁杰: 82}
    # 通过键可以获取字典中对应的值
    print(scores[骆昊])
    print(scores[狄仁杰])
    # 对字典进行遍历(遍历的其实是键再通过键取对应的值)
    for elem in scores:
        print(%s\t--->\t%d % (elem, scores[elem]))
    scores.update(冷面=67, 方启鹤=85)

 

7. 在Python的类中,属性和方法的访问权限只有两种,也就是公开的和私有的,如果希望属性是私有的,在给属性命名时可以用两个下划线作为开头。但是,Python并没有从语法上严格保证私有属性或方法的私密性,它只是给私有的属性和方法换了一个名字来“妨碍”对它们的访问,事实上如果你知道更换名字的规则仍然可以访问到它们,下面的代码就可以验证这一点。之所以这样设定,可以用这样一句名言加以解释,就是“We are all consenting adults here”。因为绝大多数程序员都认为开放比封闭要好,而且程序员要自己为自己的行为负责。

class Test:

    def __init__(self, foo):
        self.__foo = foo

    def __bar(self):
        print(self.__foo)
        print(__bar)


def main():
    test = Test(hello)
    test._Test__bar()
    print(test._Test__foo)


if __name__ == "__main__":
    main()

在实际开发中,我们并不建议将属性设置为私有的,因为这会导致子类无法访问(后面会讲到)。所以大多数Python程序员会遵循一种命名惯例就是让属性名以单下划线开头来表示属性是受保护的,本类之外的代码在访问这样的属性时应该要保持慎重。这种做法并不是语法上的规则,单下划线开头的属性和方法外界仍然是可以访问的,所以更多的时候它是一种暗示或隐喻。

Python 易错点

原文:https://www.cnblogs.com/pythonlearing/p/11390785.html

(0)
(0)
   
举报
评论 一句话评论(0
关于我们 - 联系我们 - 留言反馈 - 联系我们:wmxa8@hotmail.com
© 2014 bubuko.com 版权所有
打开技术之扣,分享程序人生!