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

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

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

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. 微服务理论之五:微服务架构 vs. SOA架构

    一.面向服务的架构SOA 面向服务的架构是一种软件体系结构,应用程序的不同组件通过网络上的通信协议向其他组件提供服务.通信可以是简单的数据传递,也可以是两个或多个服务彼此协调连接.这些独特的服务执行一 ...

  2. spring初始化顺序

    首先,Spring bean的默认加载顺序是怎么控制的 工程中有2个bean,A和B,其中必须先初始化A再初始化B,但是没有depend-on或者Order等方式去保证,只不过恰好刚好这么运行着没出事 ...

  3. bzoj4403

    组合数学 我好菜啊 想到dp去了... 事实上对于固定长度的数列,我们只用考虑选了哪些数就行了,所以这个就是$C(n+m-1,m-1)$ 也就是$n$个数,划分成$m$段且允许空的方案数 然后变成$\ ...

  4. Redis的安装和配置文件

    实验环境:Centos6.8 Redis版本:3.0.6 下载Redis,并放到/usr/local/soft下: yum -y install gcc automake autoconf libto ...

  5. Ruby代码块(Block)

    1.什么是代码块 在Ruby中,{}或do...end之间的代码是一个代码块.代码块只能出现在一个方法的后边,它紧接在方法最后一个参数的同一行上,由yield关键字调用.例如: [1,2,3,4,5] ...

  6. JS判断提交表单不能为空 等的验证

    转自:https://blog.csdn.net/qiu512300471/article/details/23259811 <script type="text/javascript ...

  7. Shrio00 Shiro认证登录、权限管理环境搭建

    基础环境准备: JDK -> java version "1.8.0_101" MAVEN -> Apache Maven 3.5.0 1 导入依赖 mysql驱动 m ...

  8. hello markdown

    目录 标题 标题1 标题2 标题3 有序列表 无序列表 插入图片 插入链接 粗体.斜体.删除线 引用 表格 代码 目录 新的开始 希望能够坚持下去 cnblogs也支持markdown 之前看了写ma ...

  9. TMF大数据分析指南 Unleashing Business Value in Big Data(一)

    大数据分析指南 TMF Frameworx最佳实践 Unleashing Business Value in Big Data 前言 此文节选自TMF Big Data Analytics Guide ...

  10. Beta冲刺测试

    1.项目概述 1.项目名称 微信四则运算小程序 2.项目简介 基于微信小程序,为用户提供一个答题的平台 3.项目预期达到目标 用户通过微信小程序可以在里边答题,模式或者题量的选择为用户匹配到适合他们的 ...