【python自动化第四篇:python入门进阶】
目录:
- 装饰器
- 迭代器&生成器
- json&pickle实现数据的序列化
- 软件目录结构规范
装饰器的本质是函数,起目的就是用来为其它函数增加附加功能
原则:不能修改被装饰函数的源代码;被装饰函数的调用方式不能改变 ,简而言之就是转时其对于函数就是透明的,对被装饰的函数是没有影响的。
实现装饰器的知识储备:函数即变量;高阶函数;嵌套函数;最终高阶函数加上嵌套函数就构成了装饰器,函数也就是一种变量
知识点介绍:
函数即变量
高阶函数:
a.把一个函数名仿作实参传给另外一个函数(不修改装饰函数源代码的情况下为其添加功能)
|
1
2
3
4
5
6
7
8
9
10
11
|
import time
def test1(func):
start_time = time.time()
func()
stop_time = time.time()
print("toyal %s"%(stop_time-start_time))
def bar():
time.sleep(3)
print("in the bar!!")
test1(bar) #其中,test1相当于是一个装饰器,但不完全是。test1(bar)
|
b.返回值中包含函数名(不用修改函数的调用方式)
|
1
2
3
4
5
6
7
8
9
10
11
12
|
#!/usr/bin/env python# -*- coding:utf-8 -*-import time
def test1(func):
print(func)
return func
def bar():
time.sleep(3)
print("in the bar!!")
bar = test1(bar)
bar() |
嵌套函数:
|
1
2
3
4
5
6
7
8
9
|
#!/usr/bin/env python# -*- coding:utf-8 -*-#函数的嵌套def foo():
print("hello World")
def bar():
print('in the bar!!')
bar()
foo() |
然后就是装饰器了:说白了装饰器就是高阶函数和嵌套函数的结合
装饰器的一个栗子:
|
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
|
import time
##装饰器部分def timer(func):
def deco():
start_time = time.time()
#return func()
func()
stop_time = time.time()
print("total is %s:"%(stop_time-start_time))
return deco
@timer #调用装饰器
##test1和test2函数相当于是源代码,然而一直没改变原代码而是显得功能添加,这就是装饰器达成的效果def test1():
time.sleep(1)
print('test1')
@timer #装饰器外城函数名
def test2():
time.sleep(2)
print("test2")
test1()test2() |
要是传入了参数,就利用参数组修改:
#!/usr/bin/env python # -*- coding:utf-8 -*- import time def timer(func): def deco(*args): #如果带了参数组,下面源代码中的参数传递就可以被调用了 start_time = time.time() func(*args) stop_time = time.time() print("total is %s"%(stop_time-start_time)) return deco @timer def test1(): time.sleep(0.1) print("heheheheh") @timer def test2(name): time.sleep(1) print("test2",name) test1() test2("wanghui")
2、生成器&迭代器
Python 基础 内置函数 迭代器与生成器
今天就来介绍一下内置函数和迭代器 、生成器相关的知识
一、内置函数:就是Python为我们提供的直接可以使用的函数。
简单介绍几个自己认为比较重要的
1.#1.eval函数:(可以把文件中每行中的数据类型提取出来(之前是字符串类型))
a = "{'a':23,'b':43,'book':'english'}"
print(eval(a))
2.#2.hash(可以hash的数据类型是不可变数据类型)
a = 'alex'
b = hash(a)
print(b)
3.#zip 函数(组成一一对应的元组)(如果外面不加一个lis那没得到的就是一个zip对象)
print(list(zip(('a','b','c'),(1,2,3))))
print(list(zip(('a','b','c'),(1,2,3,4))))
print(list(zip(('a','b','c','d'),(1,2,3))))
p = {'name':'alex','age':23,'gender':'male'}
print(list(zip(p.keys(),p.values())))
输出结果为:
[('a', 1), ('b', 2), ('c', 3)]
[('a', 1), ('b', 2), ('c', 3)]
[('a', 1), ('b', 2), ('c', 3)]
[('name', 'alex'), ('age', 23), ('gender', 'male')]
# #max 和 min 函数
# l = [
# (5,'e'),
# (2,'b'),
# (3,'c'),
# (6,'d')
# ]
#
# print(list(max(l)))
# #max 函数的两点说明:
# #1.max处理的是可以迭代的对象,相当于for循环取出每个元素进行比较,不同数据类型之间不可以比较
# #2.每个元素之间的比较是从每个元素的第一个位置依次比较,如果此位置可以区分出大小,后面就不需要比较了,直接得出这两个元素的大小
#
#
# #sorted函数的使用(都是按照从小到大的顺序进行排列)
#
# name_dict ={
# 'yuanhao':80,
# 'alex':99,
# 'wupeiqi':700
# }
# print(sorted(name_dict))
# print(sorted(name_dict,key = lambda key:name_dict[key]))
#