从接触Python到现在也有四五年时间了,由于平时代码写的少,一直处于打游击的新手状态,缺乏系统的、原理的学习。这段时间陆续收藏了一些干货,借这个时间review一遍。
Python 3 正在毁灭 Python
Python 3打破了对Python 2向后兼容性,“Python 2的字节字符串(str)和Python 3的字节字符串(bytes)之间的根本不同。事实上会很难移植,并且需要一点移植技巧”。但从目前来看许多关键的第三方库都已经成功移植到3.3上。知乎上也对这个问题有着激烈的讨论:http://www.zhihu.com/question/23928496 。Python 3弥补了一些设计上的失误,大部分Python高手还是倾向于转战Python 3的。但是新的语法和规则的引入让我觉得完全在接触一个新的语言,带来的是太多学习的成本。虽然文章有一些危言耸听的成份,但转战Python 3对我来说还有有一些遥远。。
Python闭包详解
简单来说,这种内部函数可以使用外部函数变量的行为,就叫闭包。这篇文章通过字节码的层面解析了Python closure,非常赞。闭包减少了代码的对于参数传递一些依赖性,提高了代码的可复用性,在函数式编程中非常常用。
Python装饰器学习(九步入门)
Decorator是closure的一种,这篇文章从循序渐进的例子引入。
Python修饰器的函数式编程
CoolShell上的精彩文章,一如既往的赞。文章后还引入了几个非常实用的例子.
理解python的staticmethod与classmethod实现
类中的@staticmethod和@classmethod指的是类的静态方法和类方法。二者可以不需要实例化,直接类名.方法名()来调用。
Python的动态语言特性决定了类在创建后就动态生成了一个”类”对象,而类实例化后生成一个“类实例”对象。staticmethod声明下面的函数是一个静态方法,类似于一个Python中需要加上类前缀的全局函数,和静态面向对象语言中的类方法对应。静态方法可以帮助减少对全局函数的依赖,避免命名空间污染的问题。
而classmethod是Python这种类语言独有的东西,它将该类对象(非类实例对象)作为第一个参数传入。例如
1 2 3 4 5 6 7 8 |
class A(): bar = 1 def foo(self): print 'foo' @classmethod def class_foo(class_obj): print class_obj.bar print class_obj().foo() |
类方法需要先根据类名实例化,避免了硬编码等问题。
Python 新手常犯错误(第二部分)
其中有一个作用域的问题,虽然也理解作用域的机制,但是咋一看果然中招。同类Python中的默认参数值 http://blog.jobbole.com/40088/
1 2 3 4 5 6 7 8 9 |
>>> bar = 1 >>> def foo(): ... bar=0 ... print bar ... >>> foo() 0 >>>print bar 1 |
# 由于foo()函数中有bar=0的定义,这里的函数foo()会首先创建bar这个局部变量,并没有起到修改全局变量的效果。正确的做法如下所示:
1 2 3 4 5 6 7 8 9 |
>>> def foo(): ... global bar ... bar = 0 ... print bar ... >>> foo() 0 >>> print bar 0 |
推荐的做法是使用类变量来取代全局变量,避免这种修改的歧义。
Python 新手常犯错误(第一部分)
避免使用一个可变的值作用默认值:”在Python里,函数的默认值实在函数定义的时候实例化的,而不是在调用的时候。你每次给函数指定一个默认值的时候,Python都会存储这个值。如果在调用函数的时候重写了默认值,那么这个存储的值就不会被使用。当你不重写默认值的时候,那么Python就会让默认值引用存储的值(这个例子里的numbers)。
1 2 3 4 5 6 7 8 9 10 11 |
def foo(numbers=[]): numbers.append(9) print numbers >>> foo() # first time, like before [9] >> foo() # second time [9, 9] >>> foo() # third time... [9, 9, 9] >>> foo() # WHAT IS THIS BLACK MAGIC?! [9, 9, 9, 9] |
这可能就是Python的缺陷之一吧,解决方法是使用一个None作为默认值,并用条件判断赋给一个正确的变量实例。
1 2 3 4 5 |
def foo(numbers=None): if numbers is None: numbers = [] numbers.append(9) print numbers |
写给Python初学者的设计模式入门
长期从事运维方面的工作,曾经学过的设计模式也忘得差不多了,突然看到这篇文章,也是恶补的一个好机会。有这样一段总结:设计模式总是“增加一个抽象层。抽象一个事物就是隔离任何具体细节,这么做的目的是为了将那些不变的核心部分从其他细节中分离出来。”文中介绍的策略模式、适配器模式、工厂模式、装饰器和单例模式都是解决具体程序结构问题的好方法,值得有更多代码经验后再次研读。
作为一个程序员,你的进步完全取决于你自己
“所以现在不要再拖延了,学点新东西吧,让自己更好的学习新东西吧。睁大你的双眼,你可能就会看到未来正在向你走来。”最后一篇精彩的励志博文,Only persistent study yields steady progress.
尼玛啊!岛国人民太有才了 一个TM的剪刀石头布居然能拍成一部电影 还模仿成龙年轻的时候拍的一些电影 还去深山找个师傅培训一下 尼玛 一个剪刀石头布 有这么大的含义吗 小日本子 早晚会灭绝的