一、编码总结

  1. """
    python2
  2. 文件存储默认是ascii方式,启动加#coding:utf8就是文件以utf8方式打开.否则就是以ascii.变量则是str.
  3.  
  4. 例子:
  5. name='中国'
  6. print(name.decode('utf-8').encode('gbk'))
  7. #name.decode('utf-8') 意思是:name是UTF8格式先解码成Unicode.注意utf-8这里的意思,原字符(name)是utf8.
  8. #encode('gbk') 意思是:转码成gbk.
  9. #注意:str = bytes这两个在python2是一样的。
  10.  
  11. python3
  12. 文件存储默认是utf8方式,打开文件也是UTF8.变量则是unicode.注意python3中没有decode.
  13.  
  14. 例子:
  15. name='中国'
  16. print(name.encode('gbk'))
  17. str = unicode
  18. bytes = python2的bytes(二进制表现形式)
    """

二、装饰器

  http://www.cnblogs.com/linhaifeng/articles/6140395.html

  装饰器=高阶函数+函数嵌套+闭包

  1. """
  2.   前言:
  3.     高阶函数:
  4.       (1).函数接收的参数是一个函数名
  5.  
  6.       (2).函数的返回值是一个函数名
  7.  
  8.       (3).满足上述条件任意一个,都可称之为高阶函数
  9.     函数嵌套:
  10.       将函数中定义函数并调用。
  11.     闭包:
  12.       在一个作用域里放入定义变量,相当于打了一个包。
  13. """ 

  1、闭包

  1. def foo():
  2. def bar():
  3. print("xx")
  4. return bar
  5.  
  6. bar1 = foo()
  7. bar1()

  2、基本装饰器

  1. def auth(func):
  2. def wrapper():
  3. print("in the wrapper,begin!")
  4. func()
  5. print("in the wrapper,stop!")
  6. return wrapper
  7.  
  8. @auth
  9. def foo(): #注意:就相行于foo=auth(foo)
  10. print("in the foo!")
  11.  
  12. foo()

  3、带参数

  1. def auth(func):
  2. def wrapper(*args, **kwargs): #接收万能参数
  3. print("in the wrapper,begin!")
  4. func(*args, **kwargs) #接收万能参数
  5. print("in the wrapper,stop!")
  6. return wrapper
  7.  
  8. @auth
  9. def foo(name):
  10. print("in the foo! i am [%s]" % name)
  11.  
  12. foo('tom')

  4、增加返回值

  1. def auth(func):
  2. def wrapper(*args, **kwargs):
  3. print("in the wrapper,begin!")
  4. ret = func(*args, **kwargs) #在这里
  5. print("in the wrapper,stop!")
  6. return ret #在这里
  7. return wrapper
  8.  
  9. @auth
  10. def foo(name):
  11. print("in the foo! i am [%s]" % name)
  12. return True #只在这里增加是不行的,返回None
  13.  
  14. ret = foo('tom')
  15. print(ret)
  1. """
    重点:
    1.*args,**kwargs万能传值.
    2.返回值.
    """

  5、无参数装饰器和验证

  1. user_list = [
  2. {'name': 'alex', 'passwd': ''},
  3. {'name': 'linhaifeng', 'passwd': ''},
  4. ]
  5.  
  6. current_user = {'username':None,'login':False}
  7.  
  8. def auth(func):
  9. def wrapper(*args, **kwargs):
  10. if current_user['username'] and current_user['login']:
  11. res = func(*args, **kwargs)
  12. return res
  13.  
  14. username = input("username>").strip()
  15. password = input("password>").strip()
  16.  
  17. for number, value in enumerate(user_list):
  18. if value['name'] == username and value['passwd'] == password:
  19. current_user['username'] = username
  20. current_user['login'] = True
  21. res = func(*args, **kwargs)
  22. return res
  23. break
  24. else:
  25. print("用户或许密码错误!")
  26. return wrapper
  27.  
  28. @auth
  29. def index():
  30. print('欢迎来到主页面')
  31.  
  32. @auth
  33. def home():
  34. print('这里是你家')
  35.  
  36. index()
  37. home()
  38.  
  39. #只输入一次验证

  6、有参数装饰器

  1. user_list = [
  2. {'name': 'alex', 'passwd': ''},
  3. {'name': 'linhaifeng', 'passwd': ''},
  4. ]
  5.  
  6. current_user = {'username':None,'login':False}
  7.  
  8. def auth(auth_type='file'):
  9. def inner(func):
  10. def wrapper(*args, **kwargs):
  11. if auth_type == 'file':
  12. if current_user['username'] and current_user['login']:
  13. res = func(*args, **kwargs)
  14. return res
  15.  
  16. username = input("username>").strip()
  17. password = input("password>").strip()
  18.  
  19. for number, value in enumerate(user_list):
  20. if value['name'] == username and value['passwd'] == password:
  21. current_user['username'] = username
  22. current_user['login'] = True
  23. res = func(*args, **kwargs)
  24. return res
  25. break
  26. else:
  27. print("用户或许密码错误!")
  28. elif auth_type == 'ldap':
  29. print("from ldap auth!")
  30. res = func(*args, **kwargs)
  31. return res
  32. return wrapper
  33. return inner
  34.  
  35. """
  36. #auth(auth_type='file')就是在运行一个函数,然后返回inner,所以@auth(auth_type='file')
  37. #就相当于@inner,只不过现在,我们的inner作为一个闭包的应用,
  38. #外层的包auth给它留了一个auth_type='file'参数
  39. """
  40.  
  41. @auth(auth_type='file')
  42. def index():
  43. print('欢迎来到主页面')
  44.  
  45. @auth(auth_type='ldap')
  46. def home():
  47. print('这里是你家')
  48.  
  49. index()
  50. home()

三、模块与包

  1.什么是模块:

    一个模块就是一个包含了python定义和声明的文件,文件名就是模块名字加上.py的后缀。

  2.模块的命名空间:

  1. 每个模块都是一个独立的名称空间,定义在这个模块中的函数,把这个模块的名称空间当做全局名称空间,这样我们在编写自己的模块时,就不用担心我们定义在自己模块中全局变量会在被导入时,
    与使用者的全局变量冲突

  3. from spam import *  在spam.py文件中可以使用__all__来控制*(用来发布新版本)

  4.重新加域模块

  1. 1 import time,importlib
  2. 2 import aa
  3. 3
  4. 4 time.sleep(20)
  5. 5 importlib.reload(aa)
  6. 6 aa.func1()

  5.if __name__ == "__main__":

    当test.py这个脚本当成脚本执行时python test.py这时,__name__就会等于__main__,如果被其它脚本import导入时,__name__则会等于"test")

  6.模块搜索路径:

    (1).先查找内建模块。

    (2).再去sys.path中给的路径列表中查找。

  1. 1 >>> import sys
  2. 2 >>> sys.path.append('/a/b/c/d')
  3. 3 >>> sys.path.insert(0,'/x/y/z') #排在前的目录,优先被搜索

  7.dir和内建函数

  1. import builtins
  2. dir(builtins)

  8.包结构

  1. glance/ #Top-level package
  2.  
  3. ├── __init__.py #Initialize the glance package
  4.  
  5. ├── api #Subpackage for api
  6.  
  7. ├── __init__.py
  8.  
  9. ├── policy.py
  10.  
  11. └── versions.py
  12.  
  13. ├── cmd #Subpackage for cmd
  14.  
  15. ├── __init__.py
  16.  
  17. └── manage.py
  18.  
  19. └── db #Subpackage for db
  20.  
  21. ├── __init__.py
  22.  
  23. └── models.py
  1. #文件内容
  2.  
  3. #policy.py
  4. def get():
  5. print('from policy.py')
  6.  
  7. #versions.py
  8. def create_resource(conf):
  9. print('from version.py: ',conf)
  10.  
  11. #manage.py
  12. def main():
  13. print('from manage.py')
  14.  
  15. #models.py
  16. def register_models(engine):
  17. print('from models.py: ',engine)

  (1).正确使用方法1:

  1. #外部调用
  2. import sys
  3. sys.path.append("day4")
  4.  
  5. from glance.api import policy
  6. policy.get()
  7.  
  8. from glance.api.policy import get
  9. get()

  (2).正确使用方法2:

  1. #不推荐,默认不可以使用,仅仅是执行了api下面的__init__.py
  2. #再得配置__all__=['policy',] 在__init__.py
  3. #没有加入到__all__列表的则不能使用
  4.  
  5. vim glance/api/__init__.py
  6. __all__ = ['policy',]
  7.  
  8. from glance.api import *
  9. policy.get()

  9.绝对导入和相对导入

  1. glance/api/version.py
  2.  
  3. #绝对导入
  4. from glance.cmd import manage
  5. manage.main()
  6.  
  7. #相对导入
  8. from ..cmd import manage
  9. manage.main()

  10.切记:在"包"的概念中不要使用import , 使用from .. import ..

  11.直接import glance解决办法:

  1. 1 #glance/__init__.py
  2. 2 from . import cmd
  3. 3
  4. 4 #glance/cmd/__init__.py
  5. 5 from . import manage

  12.优秀程序常用

  1. import os
  2. import sys
  3. base_dir = os.path.normpath(os.path.join(os.path.abspath(__file__),
  4. os.pardir, #上一级
  5. os.pardir, #上一级,根据自己的需要来定。
  6. ))
  7. sys.path.insert(0, base_dir)

python16_day04【编码、函数、装饰器、包】的更多相关文章

  1. Python--函数对象@命名空间与作用域@包函数@装饰器@迭代器@内置函数

    一.函数对象 函数(Function)作为程序语言中不可或缺的一部分,但函数作为第一类对象(First-Class Object)却是 Python 函数的一大特性. 那到底什么是第一类对象(Firs ...

  2. Python: 无参数的函数装饰器

    写带参数的函数装饰器最纠结的是需要包好多层,最外层是接收参数的函数,它返回一个接收函数的的函数.但这样有个问题是,最终包装出来的装饰器必须加()调用一下,即使没有参数也需要这样做,因为调用这个最外层函 ...

  3. python装饰器1:函数装饰器详解

    装饰器1:函数装饰器 装饰器2:类装饰器 装饰器3:进阶 先混个眼熟 谁可以作为装饰器(可以将谁编写成装饰器): 函数 方法 实现了__call__的可调用类 装饰器可以去装饰谁(谁可以被装饰): 函 ...

  4. Python函数装饰器高级用法

    在了解了Python函数装饰器基础知识和闭包之后,开始正式学习函数装饰器. 典型的函数装饰器 以下示例定义了一个装饰器,输出函数的运行时间: 函数装饰器和闭包紧密结合,入参func代表被装饰函数,通过 ...

  5. 函数 装饰器 python

    今日内容概要 1.闭包函数 2.闭包函数的实际应用 3.装饰器简介(重点加难点) 4.简易版本装饰器 5.进阶版本装饰器 6.完整版本装饰器 7.装饰器模板(拷贝使用即可) 8.装饰器语法糖 9.装饰 ...

  6. Python高手之路【四】python函数装饰器

    def outer(func): def inner(): print('hello') print('hello') print('hello') r = func() print('end') p ...

  7. Python中利用函数装饰器实现备忘功能

    Python中利用函数装饰器实现备忘功能 这篇文章主要介绍了Python中利用函数装饰器实现备忘功能,同时还降到了利用装饰器来检查函数的递归.确保参数传递的正确,需要的朋友可以参考下   " ...

  8. 【Python 函数对象 命名空间与作用域 闭包函数 装饰器 迭代器 内置函数】

    一.函数对象 函数(Function)作为程序语言中不可或缺的一部分,但函数作为第一类对象(First-Class Object)却是 Python 函数的一大特性. 那到底什么是第一类对象(Firs ...

  9. python 函数 装饰器 内置函数

    函数 装饰器 内置函数 一.命名空间和作用域 二.装饰器 1.无参数 2.函数有参数 3.函数动态参数 4.装饰器参数 三.内置函数 salaries={ 'egon':3000, 'alex':10 ...

  10. python基础—函数装饰器

    python基础-函数装饰器 1.什么是装饰器 装饰器本质上是一个python函数,它可以让其他函数在不需要做任何代码变动的前提下增加额外功能. 装饰器的返回值是也是一个函数对象. 装饰器经常用于有切 ...

随机推荐

  1. vim中ctags应用

    ctags(Generate tag files for source code)是vim下方便代码阅读的工具.尽管ctags也可以支持其它编辑器,但是它正式支持的只有VIM.并且VIM中已经默认安装 ...

  2. SecureCRT中 secureCRT使用VIM时对语法高亮

    1.在SecureCRT中 secureCRT使用VIM时对语法高亮 其实不是secureCRT的功能,而是VIM的 设置:Options ->Session Options -> Ter ...

  3. cocos2dx3.1 win7安装步骤及编译到安桌

    1. 下载及安装好工具 python2.7  ndk sdk ant cocos2dx3.1 eclipse 这些工具和曾经一样下载好放到同一文件夹下 加入环境变量 将python2.7的安装路径加入 ...

  4. 爬虫 (4)- Selenium与PhantomJS(chromedriver)与爬取案例

    Selenium文档 Selenium是一个Web的自动化测试工具,最初是为网站自动化测试而开发的,类型像我们玩游戏用的按键精灵,可以按指定的命令自动操作,不同是Selenium 可以直接运行在浏览器 ...

  5. 用Vue.js开发一个电影App的前端界面

    我们要构建一个什么样的App? 我们大多数人使用在线流媒体服务(如Netflix)观看我们最喜欢的电影或者节目.这篇文章将重点介绍如何通过使用vue.js 2 建立一个类似风格的电影流媒体WEB交互界 ...

  6. JS动态增加删除UL节点LI及相关内容示例

    <ul id="ul"> <li id=1>11111111111111111<a href="javascript:del(1);&quo ...

  7. JobTracker作业调度分析

    转自:http://blog.csdn.net/Androidlushangderen/article/details/41408517 JobTracker的作业调度给我感觉就是比较宏观意义上的操作 ...

  8. 网络协议之ts---ts 流分析详解

    名词缩写翻译: es:elements stream 基本流 pes:packet elements stream 打包流 pts:presentation time stamp 显示时间戳 dts: ...

  9. Charlse 抓包

    下载Charlse:https://www.charlesproxy.com/ 安装使用: https://www.cnblogs.com/ceshijiagoushi/p/6812493.html ...

  10. cocos3.x 接入微信无法调用回调函数onResp的问题

    要想顺利调用必须保证一下几点: 1.WXEntryActivity的包名必须正确,格式为你的APK包名+wxapi.WXEntryActivity(注意:是apk包名,而不是org.cocos2dx. ...