zoukankan      html  css  js  c++  java
  • learn-python3

    learn-python3


      这是我初学Python时写的一套Python基础示例程序.主要基于廖雪峰老师的Python3教程和<<深入理解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 printer
    
    printer = 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 wrapper
    
    wrapper_origin_func = decorator(origin_func)
    wrapper_origin_func(*args, **kwargs)
    

    语法糖支持:

    @decorator1(args)
    @decorator2
    def func(): pass
    
    #is equivalent to:
    def func(): pass
    func = 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很大时对内存的消耗极高甚至会发生内存溢出。为此,我们可以定义一个迭代器类,通过维护两个变量值而不是整个元素来实现延迟计算。

    github: https://github.com/CYanLong
  • 相关阅读:
    JavaScript高级程序设计学习笔记事件(一)(事件流、事件处理程序/事件侦听器)
    JavaScript高级程序设计学习笔记事件(二)(事件对象DOM中的事件对象/IE中的事件对象/跨浏览器的事件对象)
    闭包学习小记
    JavaScript高级程序设计学习笔记DOM(一)(节点层次Node类型节点关系/操作节点)
    打印网页内容
    尝试写第一个js插件 图片轮播
    JavaScript高级程序设计学习笔记面向对象的程序设计(一) 创建对象 (工厂模式、构造函数模式、原型模式等)
    jQuery二维码插件 jquery.qrcode.js
    ajax请求地址后加随机数防止浏览器缓存
    location.href 和document.referrer、event.keyCode、setTimeout 与setInterval、前置与后置型递增递减操作符
  • 原文地址:https://www.cnblogs.com/cyanlong/p/5712319.html
Copyright © 2011-2022 走看看