函数基础
一.定义
不用函数的危害
1.逻辑机构不好
2.代码冗余
3.代码可维护性差
二.分类
1.内置函数
2.自定义函数
def 函数名(arg1,arg2...):
'描述信息'
函数体
return 1
#先定义,后使用
三.有参函数,无参函数和空函数
1.无参函数
def foo():
'foo funciton'
print('from the foo')
#定义时无参,调用时无参
#无参函数不需要返回值,通常内部都是语句,只是执行语句,没有运行结果
2.有参函数
def bar(x,y):
print(x)
print(y)
print('from bar')
res=x+y
return res
z=bar(1,2)
print(z)
#函数的调用
#定义时有参,调用时有参
foo() #语句形式
res=bar(1,2) #表达式形式
res2=bar(bar(1,2),3)
有参函数一般要通过计算得到结果,通过return 赋值变量得到结果
x=len('hello')
print(x)
print(len('aaaa'))
3.空函数
def auth():
'认证'
pass
def list_goods():
'商品列表'
pass
def buy():
'购买'
pass
def interactive():
'与用户交互'
list_goods()
money=input(">> ")
goods=input(">> ")
buy(money,goods)
4.返回值
1.特点
函数的返回值没有类型限制,可以是任意类型
没有return---->返回none
return一个值----->1
return1,2,3----->(1,2,3) 元组
2.三种形式:
无
def my_max(x,y):
res=x if x > y else y #三元表达式
return res
res1=my_max(1,2)
print(res1)
返回一个
返回多个def bar(x,y):
return 1,2,3,[1,2],{'a':2},
res2=bar(1,2)
print(res2)
##返回元组形式了
##python里看到,默认翻译成元组形式
3.多个return
如果存在多个return返回值,return返回值只能返回一个(只能执行一次return)
5.变量解压c
x='hello'
a,*_,e=[1,2,3,4,5]
head,*_=[1,2,3,4,5] 只要开头的
6.形参和实参
1.定义
函数的参数:
def for(x,y)
定义阶段:形参----->本质就是变量名
定义变量名
调用阶段:实参 --> 必须有一个明确的值
变量值
2.实参
实参分三种格式
1. 按位置传递
#在实参的角度
def foo(x,y)
第一种:按照位置传值
foo(1,2)
第二种:按照关键字传值
foo(x=1,y=2)
第三种:混着用
foo(1,y=2) ##按位置传值必须在按关键字传值的前面
foo(y=2,1) 报错
foo(1,x=1,y=2) 报错 ##对一个形参只能赋值一次
3.形参
位置参数:
必须传值的参数def foo(x,y):
print(x)
print(y)
foo(1,2)
foo(y=2,x=1)
#默认参数
y=1 sex=male
def foo(x,y=1):
print(x)
print(y)
foo(1)
打印出俩1
foo(1,2)
foo(y=2,x=1)
一般把变化比较小的值定义成默认参数
#默认参数必须放到位置参数的后面
def register(sex='male',name): #报错
print(name)
print(sex)
应该是
def register(name,sex='male'):
print(name)
print(sex)
register('liming')
liming
male
#定义阶段不会报错,调用阶段会报错
x='male'
def register(sex=x):
print(sex)
#----------------
x=None
register()
#输出
#male
x=[]
def register(name,name_list=x):
name_list.append(name)
register('ASB')
register('YSB')
register('WSB')
print(x)
['ASB', 'YSB', 'WSB']
4.*args和**kwargs
*args
def foo(x,*args): #args=(2,3,4,5,6,6,'a','b') 按位置传值多的给args
print(x)
print(args)
foo(1,2,3,4,5,6,6,'a','b')
#*args与位置参数和默认参数混用:*args要放到位置参数后面
例1.
def foo(x,*args,y=1): #位置参数,默认参数,*args
print(x)
print(y)
print(args)
foo(1,2,3,4,5) !!!!先按位置传值,再按关键字传值
1
1
(2, 3, 4, 5)
例2.
def foo(x,y=1,*args):
print(x)
print(y)
print(args)
foo(1,2,3,4,5)
1
2
(3, 4, 5)
def my_sum(*nums): #nums=(1,2,3,4,5,6)
res=0
for i in nums:
res+=i
return res
从形参的角度
##*(1,2,3) = *args
def foo(*args):
print(args)
foo(1,2,3)
(1,2,3)
从实参的角度
def bar(x,y,z):
print(x)
print(y)
print(z)
bar(*(1,2,3)) ##bar(1,2,3)
1
2
3
**kwargs
def foo(x,**kwargs): #把按关键字传值多余的值做成字典 x是位置,这题关键字只有一个
print(x) #核心是按关键字传值,关键字一定在位置的右面
print(kwargs)
foo(1,y=2,a=3,b=4)
1
{'a': 3, 'y': 2, 'b': 4}
混着用的位置问题
例1.
def foo(x,*args,**kwargs): #按位置传值多的才给*args,一般给最前面的x,按关键字传值多的给**kwargs
print(x)
print(args) #kwargs按关键字传值
print(kwargs)
1
()
{'z': 2, 'y': 1}
例2.
def foo(*args,**kwargs):
print(args)
print(kwargs)
foo(1,1,1,1)
(1, 1, 1, 1)
{}
例3.
def auth(name,password,sex='male'):
print(name)
print(password)
print(sex)
def foo(*args,**kwargs):
print('from foo')
auth(*args,**kwargs)
foo('egon','123')
from foo
egon
123
male
def auth(name,password,sex='male'):
print(name)
print(password)
print(sex)
def timmer(*args,**kwargs):
print('from timmer')
auth(*args,**kwargs)
timmer(name='jax',password=123)
from timmer
jax
123
male