函数
无参函数
如果函数体代码逻辑不需要依赖外部传入的值,必须定义成无参函数
def func():
print("hello nick")
func() #hello nick
有参函数
如果函数体代码逻辑需要传入值,必须定义成有参函数
def sum_self(x,y):
return x+y
print(sum_self(4,8))
空函数
只知道功能但是不知道代码的时候,可以暂时写一个空函数
def func():
pass
函数的返回值
# 返回值的特征
1. return 是一个函数的结束标志,函数内可以有多个return,只要执行到了return,函数就会自动停止
- return 返回值可以返回任意数据类型
- return 返回值无个数限制,可以用逗号隔开多个返回值
- 0个:返回None
- 1个:返回该值本身
- 多个:返回一个元组
def func():
name ='nick'
age =19
hobby_list=['read','run']
return name,age ,hobby_list
get_re = func()
name,age,hobbies = get_re
print(F"name {name},age {age},hobbies {hobbies} ,,{type(get_re)}")
#name nick,age 19,hobbies ['read', 'run'] ,,<class 'tuple'>
函数的调用
def foo():
pas
print(foo())
函数调用的三种方式
def max_self(x,y):
if x>y:
return x
else:
return y
#1
max_self(1,2)
#2
max_self(1,2)*12
#3
max_self(max_self(20000,30000),40000)
形参和实参
形参
在函数定义阶段括号内定义的参数,称之为形式参数,本质就是变量名.
def func(x,y):
print(x)
print(y)
实参
在函数调用阶段给括号内传入的参数,本质就是变量值
func(1,2)
位置形参和位置实参
定义阶段,按照从左到右顺序定义的形参,叫做位置形参
调用阶段,按照从左到右的顺序依次定义的实参,叫位置实参
关键字实参
在函数调用时,按照key=value的形式为参数传值,称之为关键字实参
func(y=1,x=2)
- 可以混用位置实参和关键字实参,但是位置实参必须在关键字实参的左边。
- 可以混用位置实参和关键字实参,但不能对一个形参重复赋值。
默认形参
在定义阶段,就为一个参数给默认值,调用的时候可以不赋值
def func(x,y=10)
pass
func(2)
默认参数的值通常应该是不可变类型
当传递可变类型时,传递的是可变类型的地址,只要更改就会更改外部的数据
def register(name,hobby,hobby_list=[]):
hobby_list.append(hobby)
print(f"{name} prefer {hobby_list}")
register("nick",'piao') #nick prefer ['piao']
register("tank",'run') #tank prefer ['piao', 'run']
tank没有piao的爱好,但是因为是可变类型,在地址不变的情况下值是可变的,所以也修改了别人的hobby_list
#用上才学习的deepcopy
import copy
def register(name,hobby,hobby_list=[]):
tmp_list= copy.deepcopy(hobby_list)
tmp_list.append(hobby)
print(F"{name} perfer {tmp_list}")
register('nick','piao',['read','run']) #nick perfer ['read', 'run', 'piao']
register('tank','zuipao') #tank perfer ['zuipao']
变长参数
可变长形参 *
形参中的将会把溢出位置的参数全部接收,然后存储为元组的形式.然后把元组赋值给后面的参数.
需要注意的是 *后面的参数约定俗称 args
def sum_self (*args):
res = int()
for num in args:
res += num
return res
print(sum_self(1,2,3,4,5,6)) #21
可变长实参 *
实参中的会把后面的参数循环取出,变成位置实参
def func(x,y,z,*args):
print(x,y,z,args)
func(1,*(2,3)4,5) #1 2 3 (4, 5)
可变长形参 **
形参中的*会把溢出的关键字实参全部接收.存储为一个字典的形式,之后吧字典赋值给 *,**后面的参数名约定俗成kwargs
def func(**kwargs):
print(kwargs)
print(a=5) #{'a':5}
可变长实参**
实参中的** 会把** 后的参数的值循环取出.打散成关键字实参.
def ind (a,b,c,**kwargs):
print(a,b,c,kwargs)
ind(1,2,3,d=1,f=7,**{'g':9,'h':10}
应用
def index(name, age, sex):
print(f"name: {name}, age: {age}, sex: {sex}")
def wrapper(*args, **kwargs):
print(f"args: {args}")
print(f"kwargs: {kwargs}")
index(*args, **kwargs)
wrapper(name='nick', sex='male', age=19)
命名关键字形参
def register(**kwargs):
if 'name'not in kwargs or 'age' not in kwargs:
print('用户名和年龄必须使用关键字形式传值!')
return
print(kwargs['name'])
print(kwargs['age'])
register(name='wuqiyu',age='23')
录入男同学爱好
def hobbies(*args, **kwargs):
for i in args:
for k,v in kwargs.items():
print(f"{i}同学喜欢{k}盘里的{v}")
hobbies('nick','tank',D='学习资料',E="教育视频")
"""
nick同学喜欢D盘里的学习资料
nick同学喜欢E盘里的教育视频
tank同学喜欢D盘里的学习资料
tank同学喜欢E盘里的教育视频
"""