python--函数(二)、装饰器、
1.函数即变量
函数即变量,hello为变量,输出的是一个内存地址,它把函数体存储在内存里;hello()是一个函数,函数名+小括号就是调用函数。
1 def hello(): 2 print('nihao') 3 print(hello) 4 hello()
2. 高阶函数
一个函数的入参是一个函数时,这个函数就是高阶函数。
1 def s_int(n): 2 return int(n) 3 def add(x,y,z): 4 print(z(x)+z(y)) #z是一个函数,把x、y的值传给z,然后z函数处理后把两个值相加 5 add('2','3',s_int)
3. 嵌套函数
嵌套函数就是在函数内部再定义一个函数,注意是定义一个函数,而非是再调用一个函数。
1 def test1(): 2 def test2(): 3 print('test2') 4 print('test1') 5 test2() 6 test1()
4、装饰器
装饰器实际就是装饰函数,它的作用是给别的函数增加新功能,却不改变原来函数的调用方式;
下面是一个统计函数调用时间的函数,它通过装饰器在不改变原有函数调用方式的前提下,统计了运行时间。
1 import time 2 def test1(func): 3 def deco(): #此函数进行运行时间计算 4 start_time = time.time() 5 func() 6 stop_time = time.time() 7 print('the func run time is %s' % (stop_time - start_time)) 8 return deco #函数运行后返回deco变量 9 @test1 #调用装饰器,用在需要统计时间的函数前面 10 def bar(): 11 time.sleep(2) 12 print('in the bar') 13 bar() #调用该函数时,执行了装饰函数,统计了运行时间
5. 递归函数
一个函数子集调用自己就是递归函数,一个函数最多可调用自己999次,故其要有一个明确的结束条件,另递归函数的效率
不高,尽量少用。
1 def test(): 2 num = int(input('please enter a num:')) 3 if num%2 == 0: 4 return True 5 else: 6 print('非偶数,请重新输入') 7 test() #可以起到循环的作用 8 test()
6. 内置函数
python默认定义好的函数
1 #强制类型转换 2 bool('s') #bool类型 3 int() #整形 4 float() #小数 5 str() #字符串 6 dict() #字典 7 list() #列表 8 set() #集合 9 tuple() #元组 10 11 print(dir(1)) #打印传入对象的可调用方法 12 print(eval('[]')) #执行python代码,只能执行简单的,定义数据类型和运算 13 print(exec('def a():pass')) #执行python代码 14 15 filter(func,[1,2,3,4]) #根据前面的函数处理逻辑,依次处理可迭代回想里的每一个元素 16 #返回true,则返回 17 print(list(filter(func,[1,2,3,4]))) #调用方式 18 map(func,[1,2,3,4]) #根据前面的函数处理逻辑,依次处理后面可迭代对象里面的每个元 19 # 素,保存前面函数返回的所有结果 20 print(locals()) #返回局部变量 21 print(globals()) #返回所有全局变量,返回一个字典 22 print(max(111,12)) #取最大值 23 print(round(11.11,2)) #取几位小数 24 print(sorted([2,31,34,6,1,23,4])) #排序 25 print(sorted(dic.items())) #按照字典的key排序 26 print(sorted(dic.items(),key=lambda x:x[1])) #按照字典的value排序
7、模块
模块其实就是一个python文件,导入模块的本质是把Python文件从头到尾执行一遍
#模块导入方式
import os #方法一,导入整个模块
os.path.exists('xxx') #调用os下的函数
from os import path #方法二,直接调用os下的某个函数
from day5.model import hello #导入day5文件夹下的model文件中的hello方法
hello()
random模块
1 import random 2 print(random.random()) # 随机浮点数,默认取0-1,不能指定范围 3 print(random.uniform(1, 5)) # 随机取浮点数,可以指定范围 4 print(random.randint(1, 20)) # 随机整数 5 print(random.randrange(1, 20)) # 随机产生一个range 6 print(random.choice([1,2,3,4,5])) # 随机取一个元素 7 print(random.sample([1,2,3,4,'6'], 3)) # 从序列中随机取几个元素,返回的是一个list 8 x = [1, 2, 3, 4, 5, 6] 9 random.shuffle(x) # 洗牌,打乱顺序,会改变原list的值
json模块
json和python的字典类型,但是json里面只能是双引号,不能是单引号,可以通过在线格式验证来判断格式。
1 import json 2 3 print(json.dumps(dic)) # 把字典转成json串 4 print(json.loads(s_json)) # 把json串转换成字典 5 6 print(json.dump(dic, f)) # 把字典转换成的json串写到一个文件里面 7 print(json.load(f)) # 从文件中读取json数据,然后转成字典