python笔记---day3
函数
定义:函数是指将一组语句的集合通过一个名字(函数名)封装起来,想要执行这个函数的时候,只需要调用函数名即可。
特性:
- 减少重复代码
- 使程序变得可扩展
- 使程序变得容易维护
语法定义:
#定义 def sayhi(): print("Hello Word! I'm a coolboy !") #调用 sayhi() sayhi()
带参数:
#定义 def calc(x,y): res=x*y return res #调用使用 c=calc(10,4) print(c)
默认参数
#默认参数 def stu_refister(name,age,course,country="CN"): print("注册信息".center(20,'-')) print("姓名:", name) print("年龄:" ,age) print("国籍:", country) print("课程:", course) stu_refister("金角大王",34,'python') stu_refister("银角大王",14,'USA','linux')
执行结果
--------注册信息-------- 姓名: 金角大王 年龄: 34 国籍: CN 课程: python --------注册信息-------- 姓名: 银角大王 年龄: 14 国籍: linux 课程: USA
我们在网站上注册用户,像国籍这种信息,你不填写,默认就会是 中国, 这就是通过默认参数实现的,把country变成默认参数非常简单。
关键参数
正常情况下,给函数传参数要按顺序,不想按顺序就可以用关键参数,只需指定参数名即可,但记住一个要求就是,关键参数必须放在位置参数之后。像上面的默认参数就是一个关键参数。
非固定参数
若你的函数在定义时不确定用户想传入多少个参数,就可以使用非固定参数
*args: 接收N个位置参数,转换成元祖形式
def stu_register(name,age,*args): # *args 会把多传入的参数变成一个元组形式 print(name,age,args)
执行:
stu_register('张勇',23,'CN' ,'python')
输出:
张勇 23 ('CN', 'python')
还可以有一个**kwargs
# *kwargs 接收N个关键字参数,转换成字典的形式
def test(**kwargs): print(kwargs) test(name='zhangyong',age='19',job='IT') 执行结果: {'name': 'zhangyong', 'age': '19', 'job': 'IT'} 固定参数结合 def test(name,**kwargs): print(kwargs) test(name='zhangyong',age='19',job='IT') 执行结果 {'age': '19', 'job': 'IT'} 另外一种写法: def test(**kwargs): print(kwargs) test(**{'name':'zhangyong','age':23,'job':'IT'}) 结果: {'name': 'zhangyong', 'age': 23, 'job': 'IT'}
取字典其中的值
def test(**kwargs): print(kwargs['name']) print(kwargs['age']) test(**{'name':'zhangyong','age':23,'job':'IT'}) 结果 zhangyong 23
高阶函数
高阶函数:一个函数可以作为参数传给另外一个函数,或者一个函数的返回值为另外一个函数(若返回值为该函数本身,则为递归),满足其一则为高阶函数。
1. 参数为函数
import time #定义第一个bar的函数 def bar(): print ("hello~~") time.sleep(3) print("In the bar") #定义第二个test的函数 def test(func): func()
print("In the test")
#调用test函数,将bar作为一个实参传入到test。。test函数里面执行这个bar test(bar)
代码的升级版:
用test函数 计算bar函数 运行花费时间,不改变bar的源代码 和输出。
import time def bar(): print ("hello~~") time.sleep(3) print("In the bar") def test(func): start_time=time.time() func() stop_time=time.time() print("the bar run time is %s"%(stop_time - start_time)) test(bar)
2.返回值包含函数名
def bar(): time.sleep(3) print("in the bar") def test(func): print('增加一个功能') return func #返回test(bar)的内存地址, 有内存地址之后 可以随便赋值给其他变量调用 bar=test(bar) #从新覆盖一下bar的变量 bar()
#相当于实现了一个简单的装饰器,不改变源代码,不改变源代码的调用方式。 给源代码增加了一个新功能