diff --git "a/Day01-15/Day09/\351\235\242\345\220\221\345\257\271\350\261\241\350\277\233\351\230\266.md" "b/Day01-15/Day09/\351\235\242\345\220\221\345\257\271\350\261\241\350\277\233\351\230\266.md" index 168884d23..bf9fd4af1 100644 --- "a/Day01-15/Day09/\351\235\242\345\220\221\345\257\271\350\261\241\350\277\233\351\230\266.md" +++ "b/Day01-15/Day09/\351\235\242\345\220\221\345\257\271\350\261\241\350\277\233\351\230\266.md" @@ -4,6 +4,8 @@ ### @property装饰器 +https://www.jianshu.com/p/29e436ff48c8 + 之前我们讨论过Python中属性和方法访问权限的问题,虽然我们不建议将属性设置为私有的,但是如果直接将属性暴露给外界也是有问题的,比如我们没有办法检查赋给属性的值是否有效。我们之前的建议是将属性命名以单下划线开头,通过这种方式来暗示属性是受保护的,不建议外界直接访问,那么如果想访问属性可以通过属性的getter(访问器)和setter(修改器)方法进行对应的操作。如果要做到这点,就可以考虑使用@property包装器来包装getter和setter方法,使得对属性的访问既安全又方便,代码如下所示。 ```Python diff --git "a/Day01-15/Day11/\346\226\207\344\273\266\345\222\214\345\274\202\345\270\270.md" "b/Day01-15/Day11/\346\226\207\344\273\266\345\222\214\345\274\202\345\270\270.md" index ae8bdc74b..44c0c5b93 100644 --- "a/Day01-15/Day11/\346\226\207\344\273\266\345\222\214\345\274\202\345\270\270.md" +++ "b/Day01-15/Day11/\346\226\207\344\273\266\345\222\214\345\274\202\345\270\270.md" @@ -51,6 +51,7 @@ def main(): if f: f.close() +//if __name__ == '__main__'的意思是:当.py文件被直接运行时,if __name__ == '__main__'之下的代码块将被运行;当.py文件以模块形式被导入时,if __name__ == '__main__'之下的代码块不被运行。 if __name__ == '__main__': main() @@ -111,6 +112,7 @@ from math import sqrt def is_prime(n): """判断素数的函数""" + """ assert,检查条件,不符合就退出程序""" assert n > 0 for factor in range(2, int(sqrt(n)) + 1): if n % factor == 0: @@ -263,4 +265,4 @@ if __name__ == '__main__': main() ``` -在Python中要实现序列化和反序列化除了使用json模块之外,还可以使用pickle和shelve模块,但是这两个模块是使用特有的序列化协议来序列化数据,因此序列化后的数据只能被Python识别。关于这两个模块的相关知识可以自己看看网络上的资料。另外,如果要了解更多的关于Python异常机制的知识,可以看看segmentfault上面的文章[《总结:Python中的异常处理》](https://segmentfault.com/a/1190000007736783),这篇文章不仅介绍了Python中异常机制的使用,还总结了一系列的最佳实践,很值得一读。 \ No newline at end of file +在Python中要实现序列化和反序列化除了使用json模块之外,还可以使用pickle和shelve模块,但是这两个模块是使用特有的序列化协议来序列化数据,因此序列化后的数据只能被Python识别。关于这两个模块的相关知识可以自己看看网络上的资料。另外,如果要了解更多的关于Python异常机制的知识,可以看看segmentfault上面的文章[《总结:Python中的异常处理》](https://segmentfault.com/a/1190000007736783),这篇文章不仅介绍了Python中异常机制的使用,还总结了一系列的最佳实践,很值得一读。 diff --git "a/Day01-15/Day12/\345\255\227\347\254\246\344\270\262\345\222\214\346\255\243\345\210\231\350\241\250\350\276\276\345\274\217.md" "b/Day01-15/Day12/\345\255\227\347\254\246\344\270\262\345\222\214\346\255\243\345\210\231\350\241\250\350\276\276\345\274\217.md" index 418d0391b..97f6ada83 100644 --- "a/Day01-15/Day12/\345\255\227\347\254\246\344\270\262\345\222\214\346\255\243\345\210\231\350\241\250\350\276\276\345\274\217.md" +++ "b/Day01-15/Day12/\345\255\227\347\254\246\344\270\262\345\222\214\346\255\243\345\210\231\350\241\250\350\276\276\345\274\217.md" @@ -6,7 +6,7 @@ 我们可以考虑下面一个问题:我们从某个地方(可能是一个文本文件,也可能是网络上的一则新闻)获得了一个字符串,希望在字符串中找出手机号和座机号。当然我们可以设定手机号是11位的数字(注意并不是随机的11位数字,因为你没有见过“25012345678”这样的手机号吧)而座机号跟上一段中描述的模式相同,如果不使用正则表达式要完成这个任务就会很麻烦。 -关于正则表达式的相关知识,大家可以阅读一篇非常有名的博客叫[《正则表达式30分钟入门教程》](https://deerchao.net/tutorials/regex/regex.htm),读完这篇文章后你就可以看懂下面的表格,这是我们对正则表达式中的一些基本符号进行的扼要总结。 +关于正则表达式的相关知识,大家可以阅读一篇非常有名的博客叫[《正则表达式30分钟入门教程》](https://deerchao.net/tutorials/regex/regex.htm),读完这篇文章后你就可以看懂下面的表格,这是我们对正则表达式中的一些基本符号进行的扼要总结。https://www.cnblogs.com/deerchao/archive/2006/08/24/zhengzhe30fengzhongjiaocheng.html | 符号 | 解释 | 示例 | 说明 | | ------------------ | ----------------------------------------- | ---------------- | -------------------------------------------------- | @@ -177,4 +177,4 @@ if __name__ == '__main__': ### 后话 -如果要从事爬虫类应用的开发,那么正则表达式一定是一个非常好的助手,因为它可以帮助我们迅速的从网页代码中发现某种我们指定的模式并提取出我们需要的信息,当然对于初学者来收,要编写一个正确的适当的正则表达式可能并不是一件容易的事情(当然有些常用的正则表达式可以直接在网上找找),所以实际开发爬虫应用的时候,有很多人会选择[Beautiful Soup](https://www.crummy.com/software/BeautifulSoup/)或[Lxml](http://lxml.de/)来进行匹配和信息的提取,前者简单方便但是性能较差,后者既好用性能也好,但是安装稍嫌麻烦,这些内容我们会在后期的爬虫专题中为大家介绍。 \ No newline at end of file +如果要从事爬虫类应用的开发,那么正则表达式一定是一个非常好的助手,因为它可以帮助我们迅速的从网页代码中发现某种我们指定的模式并提取出我们需要的信息,当然对于初学者来收,要编写一个正确的适当的正则表达式可能并不是一件容易的事情(当然有些常用的正则表达式可以直接在网上找找),所以实际开发爬虫应用的时候,有很多人会选择[Beautiful Soup](https://www.crummy.com/software/BeautifulSoup/)或[Lxml](http://lxml.de/)来进行匹配和信息的提取,前者简单方便但是性能较差,后者既好用性能也好,但是安装稍嫌麻烦,这些内容我们会在后期的爬虫专题中为大家介绍。 diff --git "a/Day16-20/Python\350\257\255\350\250\200\350\277\233\351\230\266.md" "b/Day16-20/Python\350\257\255\350\250\200\350\277\233\351\230\266.md" index ab7c6fc68..2781ac5a6 100644 --- "a/Day16-20/Python\350\257\255\350\250\200\350\277\233\351\230\266.md" +++ "b/Day16-20/Python\350\257\255\350\250\200\350\277\233\351\230\266.md" @@ -767,7 +767,55 @@ main() ``` - - 对象的复制(深复制/深拷贝/深度克隆和浅复制/浅拷贝/影子克隆) + - 对象的复制(深复制/深拷贝/深度克隆和浅复制/浅拷贝/影子克隆)https://www.cnblogs.com/xueli/p/4952063.html: + (1)直接赋值,默认浅拷贝传递对象的引用而已,原始列表改变,被赋值的b也会做相同的改变 + >>> b=alist + >>> print b + [1, 2, 3, ['a', 'b']] + >>> alist.append(5) + >>> print alist;print b + [1, 2, 3, ['a', 'b'], 5] + [1, 2, 3, ['a', 'b'], 5] + + (2)copy浅拷贝,没有拷贝子对象(共享子对象),所以原始数据改变,子对象会改变 + + >>> import copy + + >>> c=copy.copy(alist) + >>> print alist;print c + [1, 2, 3, ['a', 'b']] + [1, 2, 3, ['a', 'b']] + >>> alist.append(5) + >>> print alist;print c + [1, 2, 3, ['a', 'b'], 5] + [1, 2, 3, ['a', 'b']] + + >>> alist[3] + ['a', 'b'] + >>> alist[3].append('cccc') + >>> print alist;print c + [1, 2, 3, ['a', 'b', 'cccc'], 5] + [1, 2, 3, ['a', 'b', 'cccc']] 里面的子对象被改变了 + + (3)深拷贝,包含对象里面的自对象的拷贝,所以原始对象的改变不会造成深拷贝里任何子元素的改变 + + >>> import copy + + >>> d=copy.deepcopy(alist) + >>> print alist;print d + [1, 2, 3, ['a', 'b']] + [1, 2, 3, ['a', 'b']]始终没有改变 + >>> alist.append(5) + >>> print alist;print d + [1, 2, 3, ['a', 'b'], 5] + [1, 2, 3, ['a', 'b']]始终没有改变 + >>> alist[3] + ['a', 'b'] + >>> alist[3].append("ccccc") + >>> print alist;print d + [1, 2, 3, ['a', 'b', 'ccccc'], 5] + [1, 2, 3, ['a', 'b']] 始终没有改变 + - 垃圾回收、循环引用和弱引用