1 函数存在的意义
1,减少重复的代码
2,可读性强
3,以功能为导向
4,函数里面形参和实参
1.1 函数语法
'''
def 函数名(参数1,参数2,参数3,...):
注释
函数体
return 返回的值
什么时候该有返回值?
调用函数,经过一系列的操作,最后要拿到一个明确的结果,则必须要有返回值
通常有参函数需要有返回值,输入参数,经过计算,得到一个最终的结果
什么时候不需要有返回值?
调用函数,仅仅只是执行一系列的操作,最后不需要得到什么结果,则无需有返回值
通常无参函数不需要有返回值
'''
def fun():
return 1
print(fun())
1.2 函数参数
'''
#1、位置参数:按照从左到右的顺序定义的参数
位置形参:必选参数
位置实参:按照位置给形参传值
#2、关键字参数:按照key=value的形式定义的实参
无需按照位置为形参传值
注意的问题:
1. 关键字实参必须在位置实参右面
2. 对同一个形参不能重复传值
#3、默认参数:形参在定义时就已经为其赋值
可以传值也可以不传值,经常需要变得参数定义成位置形参,变化较小的参数定义成默认参数(形参)
注意的问题:
1. 只在定义时赋值一次
2. 默认参数的定义应该在位置形参右面
3. 默认参数通常应该定义成不可变类型
#4、可变长参数:
可变长指的是实参值的个数不固定
而实参有按位置和按关键字两种形式定义,针对这两种形式的可变长,形参对应有两种解决方案来完整地存放它们,分别是*args,**kwargs
'''
#*args
def fun_args(x,y,*args):
print(x,y)
print(args)
fun_args(1,2,3,4,5,6) #多余的位置参数会放到一个元组中
def fun_args(x,y,*args):
print(x,y)
print(args)
fun_args(1,2,*[3,4,5,6]) #会打散放到一个元组中
#**kwargs
def fun_kwargs(a,b,**kwargs):
print(a,b)
print(kwargs)
fun_kwargs(a=1,b=2,c=3) #多余的关键字参数会存入到一个字典中
def fun_kwargs(a,b,**kwargs):
print(a,b)
print(kwargs)
fun_kwargs(a=1,b=2,**{"c":3,"d":4}) #会打散字典存入到一个字典中
def fun_args_kwargs(x,*args,**kwargs):
print(x)
print(args)
print(kwargs)
fun_args_kwargs(1,2,3,4,5,a=1,b=2,c=3)
1.3 函数嵌套
#替代if
def fun1():
return 1
def fun2():
return 2
dic={
"fun1":fun1,
"fun2":fun2,
}
choice=input("your choice>>:").strip()
if choice in dic:
print(dic[choice]())
#
# #比较大小
def my_max(x,y):
return x if x >y else y
print(my_max(1,2))
def my_maximum(a,b,c,d):
res=my_max(a,b)
res1=my_max(res,c)
res2=my_max(res1,d)
return res2
print(my_maximum(1,2,3,4))
x=100
def fun1():
#global x 加上则全局变量更在在fun1函数中,fun2的x不生效
x=1
print(x)
def fun2():
x=2
print(x)
fun2()
print(globals()) #显示所有的全局变量
print(locals()) #显示所有的局部变量
fun1()
print(x)
1.4 闭包函数
#内部函数包含对外部作用域而非全局作用域的引用
#提示:之前我们都是通过参数将外部的值传给函数,闭包提供了另外一种思路,包起来喽,包起呦,包起来哇
#闭包的意义:返回的函数对象,不仅仅是一个函数对象,在该函数外还包裹了一层作用域,这使得,该函数无论在何处调用,优先使用自己外层包裹的作用域
#应用领域:延迟计算(原来我们是传参,现在我们是包起来)
from urllib.request import urlopen
def index(url):
def get():
return urlopen(url).read()
return get
baidu = index('http://www.baidu.com')
print(baidu().decode('utf-8'))
1.5 装饰器
#内部函数包含对外部作用域而非全局作用域的引用
#提示:之前我们都是通过参数将外部的值传给函数,闭包提供了另外一种思路,包起来喽,包起呦,包起来哇
#闭包的意义:返回的函数对象,不仅仅是一个函数对象,在该函数外还包裹了一层作用域,这使得,该函数无论在何处调用,优先使用自己外层包裹的作用域
#应用领域:延迟计算(原来我们是传参,现在我们是包起来)
from urllib.request import urlopen
def index(url):
def get():
return urlopen(url).read()
return get
baidu = index('http://www.baidu.com')
print(baidu().decode('utf-8'))
#装饰器他人的器具,本身可以是任意可调用对象,被装饰者也可以是任意可调用对象。
#强调装饰器的原则:1 不修改被装饰对象的源代码 2 不修改被装饰对象的调用方式
#装饰器的目标:在遵循1和2的前提下,为被装饰对象添加上新功能
#开放封闭原则:对修改封闭,对扩展开放
import time
def timer(func):
def wrapper(*args,**kwargs):
start_time=time.time()
func()
end_time=time.time()
res=end_time-start_time
return res
return wrapper
@timer
def fun1():
time.sleep(1)
print("fun1:sleep 1")
@timer
def fun2():
time.sleep(2)
print("fun2:sleep 2")
@timer
def fun3():
time.sleep(3)
print("fun3:sleep 3")
fun1()
fun2()
fun3()