Python学习--装饰器、列表生成式、生成器、map filter、json处理

一、装饰器

1、函数即变量

def taotao(name):
    print(name)

xiaohei = taotao  #函数即变量
xiaohei('taotao')

# 函数即变量:在python里面函数就是一个变量,函数名就是一个变量,
# 这个函数名里面存的是这个函数的内存地址,它把函数体放到内存里,
# 在调用的时候从函数名里面的这个内存地址找到函数体然后运行这个函数。
# 前面的博客说函数的时候,说过函数名后面加上小括号就是调用这个函数,如果只写这个函数名的话,打印一下就是这个函数的内存地址

2、高阶函数

#----------2--------
# 高阶函数:入参是一个函数
def taotao():
    print('我是韬韬')

def timer(func):#入参是一个函数
    func()

timer(taotao)

3、函数嵌套

在函数里面再定义一个函数,不是说在函数里面再调用一个函数

#--------3-------
def timer(func):
    def add():
        print('开始挣钱')
        func()  #函数嵌套函数,它本身没有时会向上找
    return add

def taotao():
    print('我是韬韬')

hhh = timer(taotao) #hhh代表的就是add,timer里面本身没有调用add函数
hhh()

#把上面的hhh换成taotao,结果并不会变化
taotao = timer(taotao)
taotao()

4、装饰器

#装饰器  器指的就是函数,装饰函数的意思
#在不改变原来函数的调用方式、代码情况下,给函数增加新功能。

# 改进上面的,加入装饰器
def timer(func):
    def add():
        print('开始挣钱')
        func()  #函数嵌套函数,它本身没有时会向上找
    return add

@timer #语法糖  等同于 taotao = timer(taotao)
def taotao():
    print('我是韬韬')

taotao()

 

写个简单的例子 看下装饰器的应用:

#1、统计每个函数运行时间
import time,random,requests
def timer(func):
    def wappr(*args,**kwargs):
        start = time.time()
        res = func(*args,**kwargs)
        end_time = time.time()
        print('这个函数的运行时间是%.2f'%(end_time-start))
        return res
    return wappr

@timer
def fun(name):
    time.sleep(random.randint(1,10))


@timer
def func2():
    print('hh哈哈')
    requests.get('http://www.baidu.com')
fun('哈哈')
func2()

 

 二、列表生成式

写列表生成式时,把要生成的元素放到前面,后面跟 for 循环,就可以把list创建出来。

import random
# res = random.sample(range(1,34),6) #从0到34中取6个数
# res = [16,3,56,12,12]
# print(res)
# for i in range(len(res)):
#     res[i] = str(res[i]).zfill(2)
# print(res)

#列表生成式,列表推导式
res = [26, 7, 18, 27, 32, 28]
res1 = [str(i).zfill(2) for i in res]  #先循环每次拿到i的值后再处理
print(res1)

res2 = [i+10 for i in res]
print(res2)

#1000以内的偶数
nums = [i for i in range(0,100,2)]
print(nums)

 

三、生成器

# 生成器:为了节省内存的。
# 每次循环的时候,就按照这个规则(你写的逻辑)去生成一个数据

import os
import time

def makir(dir_name):
    if not os.path.isdir(dir_name):
        os.mkdir(dir_name)
        return True

dir_names = ['android','ios','tomcat','java','python','php','nginx']

# # 自己写循环调用实现
# for d in dir_names:
#     makir(d)
#
res = list(map(makir,dir_names)) #使用map:循环帮你调用函数,等同于上面自己写循环调用实现
# res1 = map(makir,dir_names)  #不加list强制类型装换 打印结果res1是一个内存地址对象,即生成器
# #生成器:节省内存
print(res)

 

def timestampToStr(timestamp=None,format='%Y-%m-%d %H:%M:%S'):
    if timestamp:
        time_tuple = time.localtime(timestamp)  # 转成时间元组
        return time.strftime(format,time_tuple) #把时间元组,转成格式化好的时间
    return time.strftime(format)
# 获取10天前的日期
# all_data = [timestampToStr(int(time.time())-86400*i) for i in range(10)]
# print(all_data) #用list 所有的数据都存到list里,即内存中

#把上面的[] 改为(),结果变成了一个生成器<generator object <genexpr> at 0x000002096D753258>
all_data = (timestampToStr(int(time.time())-86400*i) for i in range(10))
print(all_data) #每次循环完后都在同一个内存中存储
for a in all_data:
    print(a)

 

#list、生成器区别
#list,用空间换时间
#all_data #节省空间,增加了cpu的计算时间
nums = [str(i).zfill(2) for i in range(10)]
print(nums) #list

nums1 = ((str(i).zfill(2) for i in range(10)))
print(nums1) #[] 改为(),这样就变成了一个生成器,打印一个内存地址
#要取到里面的值,就循环取.或者加List强转
for n in nums1:
    print(n)

 

四、map、filter

def my(num):
    if num%2==0:
        return num
res = list(filter(my,range(10))) #[0,9]
res2 = list(map(my,range(10)))
print('filter',res) #filter 帮你循环过滤:把函数处理结果为假的过滤掉
print('map',res2)
# filter [2, 4, 6, 8]
# map [0, None, 2, None, 4, None, 6, None, 8, None]

# filter,map 的区别
# 1、filter:只保留函数返回为真的数据
# 2、map:不管你返回什么,我都给你拿到

 

五、json

json是一种所有语言中都通用的key-value数据结构的数据类型,json是一个字符串,长得像python的字典

# json是一个字符串,只不过是长得像字典
import json

user_info ='{"nhy":"123456","lxy":"456789"}'
print(type(user_info))
#
#把json串(字符串)转成字典
user_dic = json.loads(user_info)
print(user_dic)
print(type(user_dic))

#把字典转化为json串
with open('json文件','a+',encoding='utf-8') as fw:
    user_str = json.dumps(user_dic) #把字典转化为json串
    fw.write(user_str)  #只有字符串才能写入到文件中

 

#json自动帮你写入文件不需要再自己write写
with open('json文件','a+',encoding='utf-8') as fw:
    json.dump(user_dic,fw,indent=4)
#不需要咱们自己再write了,人家会帮你写入文件;可直接写入字符串以外格式的数据
#indent 表示写入时缩进4格


f = open('json文件')
res = json.load(f)  #传文件对象,会自动读文件
print(res)

 

posted @ 2019-10-08 10:40  dd0917  阅读(236)  评论(0编辑  收藏  举报