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

---------------我的学习笔记---------------html

----------------本文做者吴疆--------------算法

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

 

1.匿名函数app

没有函数名异步

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

2.装饰器函数

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

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

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

须要注意@装饰器的实际做用spa

# -*- 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__())  # 1
print(fib_gen.__next__())  # 1
print(fib_gen.__next__())  # 2
print(fib_gen.__next__())  # 3

-------------------------------------------------------经过生成器能够实现并行操做---------------------------------------------------------------

# -*- 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) # 添加环境变量

原文出处:https://www.cnblogs.com/deeplearning1314/p/10892497.html

相关文章
相关标签/搜索