# learn-python3
这是我初学Python时写的一套Python基础示例程序.主要基于廖雪峰老师的和<<>>. 感谢!
下面是这些示例程序的目录总结:
Chapter1:容器/集合/Collection
1.字典/哈希表/dictionary/map
2.链表/list
3.无序表/set/tuple
4.格式化字符串和字符串连接
Chapter2:Python函数和函数式编程
1.Python参数(*args, **kw ..)
2.(多)返回值 - tuple
3.函数式编程
1).高阶函数(map,reduce,filter)
2).匿名函数(lambda表达式)
3).闭包(Closure)
4).装饰器(decorator)
闭包(Closure):
在python中,函数是对象,函数名作为对此对象的引用。像其他数据结构一样,函数也可以赋值给变量,并且我们可以在函数中定义对象,将对象作为参数和将对象作为返回值。
在这里,我们举一个例子来说明。
def make_printer(msg): def printer(): print(msg) return printerprinter = make_printer('Foo!')printer() #Foo
闭包是指 内部函数(nested function)
访问 其 外围函数(enclosing)
作用域的变量,并且外围函数已经执行完毕。
当 make_printer
被调用,一个新的栈帧入栈,printer
函数作为其常量,msg
的值作为局部变量被保存。然后创建并返回了函数 printer
。因为函数 printer
引用了msg
变量,当 make_printer
函数返回(return)之后它依旧存活(kept alive)。
这里面有两个关键点:存在内部函数,并且内部函数访问了外围局部变量。只有同时满足这两点,才称为闭包。
装饰器(decorator):
首先,装饰器是一种设计模式。在不改变原有代码的基础上,将其功能模块进行包装(wrapper),构建出更加复杂的功能模块。通常,增强了的功能模块会调用被增强的(即原有的)功能逻辑。AOP(Aspect Oriented Programming)
就是使用这种编程思想。
从技术上讲,Python的装饰器是使用闭包来实现的。并提供了简洁的语法糖支持。
装饰器函数接收函数作为参数,并且在内部通过定义 wrapper
函数来实现增强的逻辑。通常情况下,这个函数会调用原函数,并且,这个函数的参数列表应该和被增强的函数保持一致。最终,我们将这个增强了的函数(wrapper)作为返回值。
def decorator(func): def wrapper(*args, **kwargs): maybe some code.. func(*args, **kwargs) maybe some code... return wrapperwrapper_origin_func = decorator(origin_func)wrapper_origin_func(*args, **kwargs)
语法糖支持:
@decorator1(args)@decorator2def func(): pass#is equivalent to:def func(): passfunc = decorator1(args)(decorator2(func))
关于装饰器带参数的解释:
def decorator1(args): def real-decorator(func): def wrapper(*args, **kwargs): some code.. func(*args, **kwargs) some code access args return wrapper return real-decorator
Chapter3:面向对象(Oritented-Object)
1.继承和多态(extends and polymorphic)
2.成员(mumber)
1).类成员
2).实例成员
3.访问权限
4.专有方法(special method)
5.动态修改类和slots.
6.Python中的类型(type)
7.元类(metaclass)
Chapter4:协程 -- yield
我们考虑自己来实现一个数字生成器(此生成器是广义的),即 range()
函数的功能。
首先,我们借助 list
通过定义最简单,最直接的函数来实现。
def MyRange(n): num, list = 0, [] for num < n: list.append(num) num += 1 return list
上面的代码借助了 list
对象简单粗暴的将所有可能的值都加载到内存中。这种实现方式当n很大时对内存的消耗极高甚至会发生内存溢出。为此,我们可以定义一个迭代器类,通过维护两个变量值而不是整个元素来实现延迟计算。