一.提个问题,为什么要有函数?
1.让程序变的简洁
2.提高代码的可读性
函数的定义:
def 函数名(参数1,参数2): ---函数的注释--- print('函数体') return '返回值'
函数的调用:
返回值 = 函数名(参数1,参数2)
函数的参数:
实参 和 形参。 (两类)
实参:函数调用的时候传入的参数值。
形参:在函数定义的时候所定义的参数名。
参数: 分三类。
1.参数可以是任意的数据类型。2.可以传递0个或者多个参数。
位置参数:
按顺序定义参数
默认参数:
首先,不要设置可变类型的默认参数,对于变化小的参数可以设置默认参数。
如果传递,会覆盖默认值默认的值是在函数定义前的设置好的了。
动态参数:
*args **kwargs
调用函数时的传参数:
按照位置传参:
def my_max (a,b): print(a,b) my_max(10,20)
按照关键字传参:
def my_max (a,b): print(a,b) my_max(b = 10 , a=20 )
函数的返回值:
返回值的关键字:return
return的作用:
1.结束函数的执行
2.返回要返回的值
返回值的两种情况:
一.返回值 为 None
函数的返回值为None有三种情况。
1.不写返回值
2.只写一个return
3.return None (几乎不用)
1.不写返回值 return def func1(): a = 111 b = [1,2,3] ret = func1() print(ret) #2.return def func2(): a = 111 b = [1,2,3] return ret = func2() print(ret) #3. return def func3(): a =111 b = [1,2,3] return None ret = func3() print(ret) 这以上的三种情况的返回值都为 None。
二.返回值 不为 None
1.返回一个值
用一个变量接收
2.返回多个值
用一个变量接收,接收的结果是一个元组
有多个返回值就用多少个变量接收。
函数的闭包:
闭包函数:函数内部定义的函数,该内部函数包含对外部作用域,而不是对全局作用域名字的引用,
那么该内部函数称为: 闭包函数。
闭包 : 内部函数,包含了对外部作用域中变量的引用。
闭 : 内部的函数
包 : 包含外部函数的变量
闭包的例子:
from urllib.request import urlopen #1.定义一个模块 def index (url): #2.定义一个函数index(url) url:是一个传递值 def inner(): #5. 调用index()后,进到函数index,里面,又定义了个新函数,inner() return urlopen(url).read() #8.返回 读url 网址 return inner #6.返回inner inner 在 index 里, index = get 所以 inner == get u = 'http://www.baidu.com' #3. 把一个网址 赋给 u get = index (u) #4调用 index(u) print(get()) #7.输出打印 调用get== 调用inner
函数的装饰器:
装饰器:
本质是任意可以调用的对象,被装饰的对象也可是任意可调用对象。
装饰器本身也是函数,用来装饰其他函数。
装饰器的功能是:
在不修改被装饰器对象源代码以及的调用方式的前提下为其添加新功能。
原则:
1. 不修改源代码。
2. 不修改调用方法
目标:
添加新功能
一:开放封闭原则,对扩展是开放的,对修改是封闭的。
一个装饰器就闭包函数。
先写最内层的函数。
最简单的装饰器:
import time def timer(func): def inner(): func() return inner def hahaha(): time.sleep(2) print ('aaaa') hahaha = timer(hahaha) hahaha()
语法糖:@timer ==》 hahaha = timer(hahaha)
import time def timer(func): def inner(): start = time.time() time.sleep(2) func() end = time.time() print(end-start) return inner @timer def hahaha(): print ('aaaa') hahaha()