---------------个人学习笔记---------------

----------------本文作者疆--------------

------点击此处链接至博客园原文------

1.匿名函数

没有函数名

# -*- coding:utf-8 -*-
# Author: WUJiang
# 匿名函数
calc = lambda x: x*3
print(calc(3))

2.装饰器

装饰器,本质是函数,装饰其他函数,即为其他函数添加附加功能

原则:不能修改被装饰函数的源代码、不能修改被装饰函数的调用方式

需要了解:函数即“”变量“”、高阶函数、嵌套函数(函数内部还存在用def定义其他的函数)

需要注意@装饰器的实际作用

# -*- coding:utf-8 -*-
# Author: WUJiang
# 装饰器示例 = 嵌套函数+高阶函数
# 建议每行打断点看运行过程,函数只定义未调用时是不运行的
import time
def timer(func):
def wrapper(*args, **kwargs):
start_time = time.time()
func(*args, **kwargs)
stop_time = time.time()
print("the fuc running time is %s" % (stop_time - start_time))
return wrapper # 返回wrapper的内存地址,加()代表执行wrapper函数
@timer # 等同于test1=timer(test1)
def test1(*args, **kwargs):
time.sleep(3)
print("in the test1")
print(args, kwargs) test1()

之所以test1()、wrapper()和func()中添加形参*args、**kwargs是因为装饰器只有一个,这样就可以用来装饰多个有非固定参数的函数

# -*- coding:utf-8 -*-
# Author: WUJiang
# 用装饰器给页面增加登录认证功能
user, pw = "wujiang", "abc123"
def auth(func):
def wrapper(*args, **kwargs):
input_user = input("输入用户名:")
input_pw = input("输入密码:")
if input_user == user and input_pw == pw:
ret = func(*args, **kwargs)
return ret
else:
print("用户名密码错误,请重试")
return wrapper
@auth
def index():
print("欢迎进入首页")
return "from index" # 居然返回None,是因为wrapper()无返回值,若要返回index()的结果,可以保存在变量中返回(见上)
@auth
def home():
print("欢迎登录个人主页")
@auth
def bbs():
print("欢迎登录bbs论坛") print(index())
home()
bbs()

上述增加代码段可以返回被装饰函数的结果(以上代码较实用)

3.装饰器-进阶学习

# -*- coding:utf-8 -*-
# Author: WUJiang
# 用装饰器给不同页面增加不同的登录(本地/远程)认证功能
def auth(auth_type):
# print("auth_type:", auth_type)
def out_wrapper(func):
# print("func:", func)
def wrapper(*args, **kwargs):
if auth_type == "local":
print("本地模拟登录")
elif auth_type == "ldap":
print("ldap模拟登录")
return wrapper
return out_wrapper
# 这里的auth与之前的区别是加了()并传入参数
# 与之前不加()和传参数有区别,具体需要看实际debug
# 个人相当于home = auth(auth_type="local")()
# 即home = wrapper
@auth(auth_type="local")
def home():
print("欢迎登录个人主页")
@auth(auth_type="ldap")
def bbs():
print("欢迎登录bbs论坛")
home()
bbs()

与上面的区别是装饰器传入了参数,因此装饰器内部需要多嵌套一层函数,具体看#注释。

4.生成器

列表生成式[]  如[func(i)  for i in range(10)]使代码更简洁,其中func()为某函数,如i+1

通过列表生成式,可以直接创建列表,但由于受到内存限制,列表容量将有限。如果创建一个包含100万个元素的列表,而仅仅需要访问前面几个元素,就有点得不偿失,因此,如果列表元素可以按照某种算法推算出来,就可以在循环过程中不断推算后续元素,就不用创建完整的列表,从而节省大量空间。在Python中,一边循环一边计算的机制,称为生成器。

生成器() 如(func(i)  for i in range(10)) ,区别是[]和()

注意:[2*i  for i in range(10000000000)]列表生成式会一次性准备好数据,比如准备好[0,1,2,3,4...9999999999]再乘2,而(2*i  for i in range(10000000000))生成器只是准备了一个算法,访问到哪才生成相应数据,但是访问第n个数据,必须依此访问过之前n-1个数据,因此不能用切片方式访问。

生成器只有__next__()方法(_2个Python3中,Python2中为next()),读取下一个数据,只依次保留当前位置的唯一数据。

-----------------------------------------------------------另一种实现生成器的方式---------------------------------------------------------------------

# -*- coding:utf-8 -*-
# Author: WUJiang
# 另一种实现生成器的方式
# 斐波那契数列 def fib(max):
n, a, b = 0, 0, 1
while n < max:
# print(b)
yield b
a, b = b, a+b
n += 1 # <generator object fib at 0x0000000002340750>
print(fib(10))
fib_gen = fib(10)
print(fib_gen.__next__()) #
print(fib_gen.__next__()) #
print(fib_gen.__next__()) #
print(fib_gen.__next__()) #

-------------------------------------------------------通过生成器可以实现并行操作---------------------------------------------------------------

# -*- coding:utf-8 -*-
# Author: WUJiang
# 生成器实现单线程下的并行效果(实际上是串行,但感觉上是并行),异步IO的雏形
import time def consumer(name):
print("%s 准备吃包子了!" % name)
while True:
baozi = yield
print("包子[%s]来了,被[%s]吃了" % (baozi, name)) def producer(name):
c = consumer("A") # 相当于将函数变为生成器
c2 = consumer("B")
c.__next__() # 调用第一个yield中断返回,因此才会打印"准备吃包子了"
c2.__next__()
print("我开始做包子了!")
for i in range(10):
time.sleep(1)
print("做了2个包子!")
c.send(i)
c2.send(i) producer("wujaing")

5.迭代器

可以直接for循环的对象统称为可迭代对象,如list、tuple、dict、set、str、生成器、带yield的generator function,可使用isinstance()判断一个对象是否是Iterable对象

# -*- coding:utf-8 -*-
# Author: WUJiang
# 判断是否为可迭代对象 from collections import Iterable
print(isinstance([], Iterable)) # True
print(isinstance({}, Iterable)) # True
print(isinstance((), Iterable)) # True

可以被next()函数调用并不断返回下一个值的对象称为迭代器,可以使用isinstance()判断一个对象是否为Iterator对象,dir(变量)可查看变量的所有方法,通过iter()函数可将list、dict、str等可迭代对象变成迭代器

# -*- coding:utf-8 -*-
# Author: WUJiang
# 判断是否为迭代器 from collections import Iterator
print(isinstance([i+1 for i in range(10)], Iterator)) # False
print(isinstance((i+1 for i in range(10)), Iterator)) # True
print(isinstance(iter([]), Iterator)) # True

Python中Iterator对象表示一个数据流,可以被next()函数调用并不断返回下一个数据,直到没有数据时抛出StopIteration错误。可以把这个数据流看做是一个有序序列,但却不能提前知道序列长度,只有不断通过next()函数实现按需计算下一个数据,所以Iterator的计算是惰性的,只有在需要返回下一个数据时才会计算,Iterator甚至可以表示一个无限大的数据流,例如全体自然数,而使用list是永远不可能存储全体自然数。

Python3中range(10)返回range(0,10)迭代器,Python2中range(10)返回[0,1,2,3,4,5,6,7,8,9],xrange(10)才返回迭代器

6.内置函数

abs() 绝对值

all() 可迭代对象中所有元素为真返回True

any() 可迭代对象中任意元素为真返回True

bin() 数字10进制转2进制

bytearray() 将bytes类型数据变成可修改的列表

callable() 判断是否可被调用

chr() 返回数字对应的ASCII码

compile() 底层编译代码使用

dir() 查看变量的所有方法

divmod(a,b) 返回a除以b的商和余数

eval() 用来执行一个字符串表达式,并返回表达式的值(转字符串为字典!

exec() 动态执行Python代码,可以执行复杂的Python代码,而不像eval函数那样只能计算一个表达式的值

filter()  按定义的规则过滤,可与lambda搭配用

map() 按定义的函数处理,可与lambda搭配用

frozenset() 返回不可变对象

globals() 返回当前程序所有变量名和变量值

hash() 返回哈希值

help() 查看帮助

hex() 转16进制

id() 返回内存地址

locals() 用于定义的函数内部返回局部变量

oct() 转8进制

round() 四舍五入,可定义保留位数

sorted() 排序

zip() 一一对应组合

......

7.json&pickle序列化

json只能处理简单数据类型,可用于不同语言间的交互,xml被json逐渐取代

# -*- coding:utf-8 -*-
# Author: WUJiang
# json序列化与反序列化
import json
info = {
"name": "wujiang",
"age": 22
}
# 序列化
with open("info.txt", "w") as f:
f.write(json.dumps(info))
# 反序列化
with open("info.txt", "r") as f:
data = json.loads(f.read())
print(data["name"])

pickle能处理所有数据类型(函数也可以),用于Python特有的数据类型和Python的数据类型间进行转换,用法与上面json类似,此外还均有dump()和load()方法,如pickle.dump(info,f) 和pickle.load(f),与上述等价

尽量只dump和load一次,易出错,Python2允许多次dump和load,Python3只允许一次dump和load

8.软件目录开发规范

Foo项目名,bin可执行文件目录,foo主要程序(逻辑)目录(其中main.py为程序主入口,启动bin中foo调用main、test测试主要程序逻辑),docs文档,setup.py安装、部署、打包脚本,requirements.txt软件依赖的外部Python包列表,README项目说明文件,还有conf配置文件目录、logs日志文件目录

9.不同目录间模块调用

通过os.path.dirname获取同级目录添加至环境变量即可import,Pycharm中会标红但不影响import

# -*- coding:utf-8 -*-
# Author: WUJiang
# 不同目录间的模块调用
import os
import sys print(__file__) # 获取当前文件相对路径
print(os.path.abspath(__file__)) # 获取当前文件绝对路径
print(os.path.dirname(os.path.abspath(__file__))) # 获取当前文件绝对路径的上一级目录
dir = os.path.dirname(os.path.abspath(__file__))
sys.path.append(dir) # 添加环境变量

Python3基础(4)匿名函数、装饰器、生成器、迭代器、内置函数、json&pickle序列化、软件目录开发规范、不同目录间模块调用的更多相关文章

  1. Python自动化 【第四篇】:Python基础-装饰器 生成器 迭代器 Json & pickle

    目录: 装饰器 生成器 迭代器 Json & pickle 数据序列化 软件目录结构规范 1. Python装饰器 装饰器:本质是函数,(功能是装饰其它函数)就是为其他函数添加附加功能 原则: ...

  2. 跟着ALEX 学python day4集合 装饰器 生成器 迭代器 json序列化

    文档内容学习于 http://www.cnblogs.com/xiaozhiqi/  装饰器 : 定义: 装饰器 本质是函数,功能是装饰其他函数,就是为其他函数添加附加功能. 原则: 1.不能修改被装 ...

  3. 4 - 函数&装饰器 and 迭代器&生成器

    函数是什么 函数一词来源于数学,但编程中的「函数」概念,与数学中的函数是有很大不同的.程序里函数的定义是: 定义:将一组语句的集合通过一个名字(函数名)封装起来,要想执行这个函数,只需调用其函数名即可 ...

  4. Python装饰器、生成器、内置函数、json

    这周学习了装饰器和生成器,写下博客,记录一下装饰器和生成器相关的内容. 一.装饰器 装饰器,这个器就是函数的意思,连起来,就是装饰函数,装饰器本身也是一个函数,它的作用是用来给其他函数添加新功能,比如 ...

  5. python学习笔记(五):装饰器、生成器、内置函数、json

    一.装饰器 装饰器,这个器就是函数的意思,连起来,就是装饰函数,装饰器本身也是一个函数,它的作用是用来给其他函数添加新功能,比如说,我以前写了很多代码,系统已经上线了,但是性能比较不好,现在想把程序里 ...

  6. python之装饰器、生成器、内置函数、JSON

    一.装饰器: 装饰器,器在这里的意思是函数,也就是装饰函数.作用是给其他函数添加新功能,它可以不改变原有的函数,原来的函数和原来一模一样,什么都不需要改变,只需要在函数外部加上调用哪个装饰器就可以了, ...

  7. python学习笔记之装饰器、生成器、内置函数、json(五)

    一.装饰器 装饰器,这个器就是函数的意思,连起来,就是装饰函数,装饰器本身也是一个函数,它的作用是用来给其他函数添加新功能比如说,我以前写了很多代码,系统已经上线了,但是性能比较不好,现在想把程序里面 ...

  8. day15生成器send方法,递归,匿名函数,max结合匿名工作原理,常用的内置函数

    复习 ''' 1.带参装饰器 - 自定义 | wraps def wrap(info) def outer1(func): from functools import wraps @wraps(fun ...

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

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

  10. Python高手之路【四】python函数装饰器,迭代器

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

随机推荐

  1. ASP.NET MVC 3:缓存功能的设计问题

    今天这一篇文章我来谈一谈在MVC 3项目中的缓存功能,以及针对缓存的一些设计上的考量,给大家参考参考. 为什么需要讨论缓存?缓存是一个中大型系统所必须考虑的问题.为了避免每次请求都去访问后台的资源(例 ...

  2. source in sight 删除工程

    用十六进制编辑器打开  "我的文档/Source Insight/Projects/PROJECTS.DB3" 文件 ,找到你要删除的项目路径及名称字符串,用0替换相关位置的数据.

  3. elasticsearch2.x插件之一:marvel(简介)

    在 安装插件的过程中,尤其是安装Marvel插件遇到了很多问题,又要下载license.Marvel-agent,又要下载安装Kibana,很多内容 不知道为何这样安装处理.仔细看了看ElasticS ...

  4. 获取显示屏的个数和分辨率 --- 通过使用OpenGL的GLFW库

    获取显示屏的个数和分辨率 - 通过使用OpenGL的GLFW库 程序 #include <iostream> // GLFW #include <GLFW/glfw3.h> i ...

  5. WHAT is CPU负载?

    WHAT?? 1.CPU负载都有哪些? cpu负载的定义:在一般情况下可以将单核心cpu的负载看成是一条单行的桥,数字1代表cpu刚好能够处理过来,即桥上能够顺利通过所有的车辆,桥外没有等待的车辆,桥 ...

  6. 12、多空格&多制表符文本之cut域分割终极方案

    解决方法分为如下三步: (1)        使用“tr”命令将制表符转换为空格: (2)        使用“tr”命令将多个重复空格删除,保留一个空格: (3)        使用“cut”命令进 ...

  7. Entity Framework Code-First(2):What is Code-First?

    What is Code-First?: Entity Framework introduced Code-First approach from Entity Framework 4.1. Code ...

  8. MyBatis入门基础

    转自http://www.cnblogs.com/selene/p/4604605.html 话不多说,先看看原始的JDBC程序代码,看看这样的代码存在什么样子的问题. package com.uti ...

  9. App集成极光推送步骤

    一.准备: 1.1注册极光开发者账号 1.2添加应用,获取AppKey 1.3下载提供的demo,demo中的AppKey已自动生成为你自己的AppKey 二.集成: 2.1第一种方式:自动集成 Mo ...

  10. PS2018学习笔记(25-29节)

    25-亮度与色阶看懂直方图-part1 # 本节知识点: 灰度模式 明暗对比 明度/对比度命令 直方图 色阶命令 调整图层 # 本节段落表: 了解亮度对比 灰度模式观察明暗 明度/对比度命令 认知对比 ...