Day03-Python基础函数
一 数学定义的函数与python中的函数
初中数学函数定义:一般的,在一个变化过程中,如果有两个变量x和y,并且对于x的每一个确定的值,y都有唯一确定的值与其对应,那么我们就把x称为自变量,把y称为因变量,y是x的函数。自变量x的取值范围叫做这个函数的定义域
例如y=2*x
python中函数定义:函数是逻辑结构化和过程化的一种编程方法。
python中函数定义方法: def foo(x): "The function definitions" x+=1 return x def:定义函数的关键字 foo:函数名 ():内可定义形参 "":文档描述(非必要,但是强烈建议为你的函数添加描述信息) x+=1:泛指代码块或程序处理逻辑 return:定义返回值 调用运行:可以带参数也可以不带 函数名()
二.没有函数会有什么问题
1.无组织无结构,代码冗余
2.可读性差
3.无法实现统一管理,且维护成本
三.python中函数分为俩类:内置函数,自定义函数
内置函数:求和:sum() 求最大值: max() 求幂: min() 计算长度:len()
示例:
a = len([1,2,3,4]) print(a) b = max([1,2,6,4,]) print(b)
自定义函数
def print_start(): #def定义函数关键字 #print_start函数名 print('*'*6) #:冒号写子代码块
print_start() #调用函数直接输出
def print_msg(): print('hello world')
四.为什么要定义函数
总结使用函数的好处:
1.代码重用
2.保持一致性,易维护
3.可扩展性
函数要先定义后使用,如果没有定义而直接使用,就相当于引用了不存在的变量名
4.函数的使用包括两个阶段:定义函数阶段和使用阶段
语法:
#语法: def 函数名(参数1,参数2,): """文档注释 代码功能,参数,结果,返回值是什么""" 函数体 return 返回值,
五.定义函数的三种形式
1.无参函数:如果函数的功能仅仅只是执行一些操作而已,就定义成无参函数,
def foo(): print('*'*6)
2.定义有参函数:函数的功能的执行依赖于外部传入的参数,有参函数通常都有返回值
def my_max(x,y):
res=x if x > y else y return res res=my_max(1,2) #调用函数的表达式形式
3.空函数
# def auth(): # """认证功能""" # pass # auth() def insert(): """插入功能""" pass def select(): """查询功能""" pass def delete(): """删除功能""" pass def update(): """更新功能""" pass
三元表达式
x=10 y=2 res=x if x > y else y #条件成立写左边,条件不成立写右边 x可以换成任意其他,换成什么返回值是什么
六.调用函数
def foo(): print('from foo') def bar(name): print('bar===>',name) #按照有参和无参可以将函数调用分俩种 foo() #定义时无参,调用时也无需传入参数 bar('egon') #定义时有参,调用时也必须有参数
按照函数的调用形式和出现的位置,分三种
1.表达式形式
def my_max(x,y): res=x if x > y else y return res res=my_max(10,20)*1000 #调用函数的表达式形式 print(res)
2.调用语句形式
def foo(): print('from foo') foo() #调用函数的语句形式
3.把函数 调用当做另外一个函数的参数
def my_max(x,y): res=x if x > y else y return res my_max(my_max(10,20),30) #把函数 调用当做另外一个函数的参数
七.函数的返回值
def foo(): print('from foo') return None res=foo() print(res) """ 以下三种情况返回值都为None #没有return return 什么都不写 return None """ def foo(): print('from foo') x=1 return x res=foo() print(res) #return 一个值,函数调用返回的结果就是这个值 def foo(): print('from foo') x=1 return 1,[1,2,3,],(4,5),{} res=foo() print(res) #打印结果1,[1,2,3,],(4,5),{} #return 值1,值2,值3,...返回结果(值1,值2,值3)
补充的内容:序列的解压和return结合使用
# 序列的解压 t = (1,2,3) a,b,c = t print(a) print(b) print(c) # 序列的解压和return结合 def foo(): print('from foo') return 1,[2,3],(4,5),{} a,b,c,d = foo() print(d) # return里面有几个值就需要几个值接收 t = (1,2,3,4,5,6,7,8) a,*_,c = t print(a) print(c)# 支取开头和结尾的值
八.函数参数
#从大的角度去看,函数的参数分为两种:形参(变量名),实参(值) #定义阶段 def foo(x,y): #x=1,y=2 print(x) print(y) #调用阶段 foo(10,20)
补充:函数定义阶段到底干了什么事情:只检测函数体的语法,并不会执行
def bar(): x if 1 >2 : print('===>')
详细的区分函数的参数分为五种:
1.位置参数
def foo(x,y,z):#位置形参:必须被传值的参数 print(x,y,z) foo(1,2,3) #位置实参数:与形参一一对应
2.关键字参数
def foo(x,y,z): print(x,y,z) foo(z=3,x=1,y=2) #关键字需要注意的问题: #1:关键字实参必须在位置实参后面 #foo(1,z=2,y=3) #正常 #foo(x=1,2.z=3) #错误 #foo(1,x=1,z=2,y3) #2:不能重复对一个形参数传值
3.默认参数
def register(name,age,sex='male'): #形参:默认参数 print(name,age,sex) register('asb',10,) register('a1sb',15,) register('a2sb',18,) register('a3sb',39,) register('钢蛋',20,'female') #默认参数需要注意问题: #1:默认参数必须跟在非默认参数后 8argsdef register(sex='male',name,age):#在定义阶段就会报错 print(name,age,sex) #2:了解,默认参数在定义阶段就已经赋值了,而且只在定义阶段赋值一次 a=100000 def foo(x,y=a): print(x,y) a=0 foo(1)
4.可变长参数(*args **kwargs)
*args
def foo(*args): #*会把溢出的按位置定义的实参都接收,以元组的形式赋值给args res=0 for i in args: res+=i return res print(foo(1,2,2,5))
**kwargs
def foo(x,y, **kwargs): #**会把溢出的按关键字定义的实参都接收,以字典的形式赋值给kwargs print(x,y) print(kwargs) foo(1,2,a=1,name='long',age=18)
5.命名关键字参数
def foo(name,age,*,sex,height): #*后定义的参数为命名关键字参数,这类参数,必须被传值,而且必须以关键字实参形式去传值 print(name,age) print(sex) print(height) foo('long',24,height='male',sex='190')
Do not use Python......!!!!!!