Python基础之函数与装饰器
阅读目录
一、为什么要使用函数
二、函数的定义与调用
三、函数返回值
四、函数的参数
五、本章小结
六、装饰器
一、函数流程图:
函数名的命名规则:
1、函数名必须由字母下划线数字组成,不能是关键字和数字开头
2、函数名还是要有一定的意义能够简单说明函数的功能
初识函数定义:
新建一个mylen的函数
def mylen(): '''计算S1 的长度''' s1 = 'hello world' length = 0 for i in s1: length = length + 1 print(length)
初识函数调用:
通过调用mylen的函数,实现计算hello word的长度。
str_len = mylen() print('str_len:%s'%str_len)
以上代码也只是完成调用,但是函数体内并没有返回值,所以调用为None,使用return关键字返回结果。代码如下:
return length #将函数体内的值赋给mylen str_len = mylen() print('str_len:%s'%str_len)
return关键字的作用:
return是一个关键字,在pycharm里会高亮显示。
函数体内不写return的情况下,会默认返回一个None,需要注意的是return和返回值之间要由一个空格,return可以返回任意数据类型的值。
返回多个值:
可以返回多个值,会被组织成元祖返回,也可以用多个值来接受。
函数的参数:
我们要告诉mylen函数要计算的字符串是谁,这个过程就叫做传递参数,简称传参,我们调用函数的传递这个'hello world'和定义函数时的S1就是参数。
实参与形参:
我们调用函数时传递的这个'hello world'被称为实际参数,因为这个是要实际交歌函数的内容,简称实参。
定义函数时的S1,只是一个变量的名字,被称为形式参数。因为在定义函数的时候它只是一个形式,表示这里有一个参数,简称形参。
参数传递:
传递多个参数
参数可以传递多个,多个参数间用逗号分割。(举例如下)
def mymax(x,y): the_max = x if x > y else y return the_max ma = mymax(10,20) print(ma)
位置参数
站在实参的角度
1、按照位置传值
def mymax(x,y): #此时x=10,y=20 the_max = x if x > y else y return the_max ma = mymax(10,20) print(ma)
2、按照关键字传值
def mymax(x,y): #此时x = 20,y = 10 print(x,y) the_max = x if x > y else y return the_max ma = mymax(y = 10,x = 20) print(ma)
3、位置、关键字形式混着用
def mymax(x,y): #此时x = 10,y = 20 print(x,y) the_max = x if x > y else y return the_max ma = mymax(10,y = 20) print(ma)
正确用法
问题一:位置参数必须在关键子参数的前面
问题二:对于一个形参只能赋值一次
站在形参的角度
位置参数必须传值
def mymax(x,y): #此时x = 10,y = 20 print(x,y) the_max = x if x > y else y return the_max #调用mymax不传递参数 ma = mymax() print(ma) #结果 TypeError: mymax() missing 2 required positional arguments: 'x' and 'y'
默认参数
1、正常使用
使用方法
为什么要有默认参数:将变化较小的值设置成默认参数
2、默认参数的定义
def stu_info(name,sex = "male"): """打印学生信息函数,由于班中大部分学生都是男生, 所以设置默认参数sex的默认值为'male' """ print(name,sex) stu_info('alex') stu_info('eva','female')
3、参数陷阱:默认参数是一个可变数据类型
def defult_param(a,l = []): l.append(a) print(l) defult_param('alex') defult_param('egon')
动态参数
按位置传值多余的参数都由args统一接受,保存成一个元祖的形式
def mysum(*args): the_sum = 0 for i in args: the_sum+=i return the_sum the_sum = mysum(1,2,3,4) print(the_sum)
def stu_info(**kwargs): print(kwargs) print(kwargs['name'],kwargs['sex']) stu_info(name = 'alex',sex = 'male')
本章小结
面向过程编程的问题:代码冗余、可读性差、可扩展性差(不易修改)
定义函数的规则:
1.定义:def 关键词开头,空格之后接函数名称和圆括号()。 2.参数:圆括号用来接收参数。若传入多个参数,参数之间用逗号分割。 参数可以定义多个,也可以不定义。 参数有很多种,如果涉及到多种参数的定义,应始终遵循位置参数、
*args、默认参数、**kwargs顺序定义。 如上述定义过程中某参数类型缺省,其他参数依旧遵循上述排序 3.注释:函数的第一行语句应该添加注释。 4.函数体:函数内容以冒号起始,并且缩进。 5.返回值:return [表达式] 结束函数。不带表达式的return相当于返回 None def 函数名(参数1,参数2,*args,默认参数,**kwargs): """注释:函数功能和参数说明""" 函数体 …… return 返回值
调用函数的规则:
1.函数名() 函数名后面+圆括号就是函数的调用。 2.参数: 圆括号用来接收参数。 若传入多个参数: 应按先位置传值,再按关键字传值 具体的传入顺序应按照函数定义的参数情况而定 3.返回值 如果函数有返回值,还应该定义“变量”接收返回值 如果返回值有多个,也可以用多个变量来接收,变量数应和返回值数目一致 无返回值的情况: 函数名() 有返回值的情况: 变量 = 函数名() 多个变量接收多返回值: 变量1,变量2,... = 函数名()
装饰器
不带参数的装饰器:
def wrapper(func): def inner(*args,**wargs): '''函数执行之前代码块''' ret=func() return ret '''函数执行之后代码块''' return inner
带参数的装饰器:
F = False #装饰器开关, def outer(flag): def wrapper(func): def inner(*args,**kwargs): if flag: print('before') ret = func(*args,**kwargs) print('after') else: ret = func(*args, **kwargs) return ret return inner return wrapper