函数
函数的基础
什么是函数
在程序中,函数就是具备某一功能的工具
函数解决的问题
- 程序冗长
- 程序的扩张性
- 程序的可读性
如何使用函数
先定义后调用,定义只检测语法,调用执行函数体
def 函数名(param1.param2)
函数功能描述
param1:描述
return()
调用函数
函数名(param1)
注册功能函数
def register()
username=input('username: ').strip()
pwd=input('password ').strip()
with open('','a',encoding='utf8') as fa:
fa.write(f'{username}:{pwd}
')
fa.flush()
register()
登录功函数
ef login():
inp_username = input('username: ').strip()
inp_pwd = input('password: ').strip()
with open(' ','rt',encoding='utf8') as fr:
for user_info in fr:
user_info = user_info.strip('
')
user_info_list = user_info.split(':')
if inp_username==user_info_list[0] and inp_pwd == user_info_list[1]:
print('login successful')
break
else:
print('false')
定义函数的三种形式
无参函数
在函数阶段括号内没有参数,为无参函数。
注意:定义无参,调用时无需传入参数
有参函数
在定义阶段括号内有参数,成为有参函数。
注意:定义有参,调用必须传入参数。
空函数
def func():
pass
函数的返回值
什么是返回值
函数内部代码经过一系列逻辑处理获得的结果。
为什么有返回值
- 需要在程序拿到函数的结果作进一步处理,不需要有返回值
注意: - return是一个函数结束的标志
- 可以返回任意数据类型
- 五个数限制,可以用逗号隔开返回多个值
0个:返回none
1个:返回值本身
多个:返回值是元祖
def func():
name = 'john'
age = 18
hobby_list = ['read','run']
ruturn name,age,hobby_list
函数的调用
调用的三种形式
def max_self(x,y):
if x>y:
return x
else:
return y
max_self(2,3)
res=max_self(2,3)*10
res1=max_self(max_self(200,300),500)
print(res)
print(res1)
函数参数的应用
形参和实参
实参
在函数定义阶段括号内定义的参数,称之为形式参数,简称形参,本质就是变量名。
def func(x,y):
print(x)
print(y)
实参
在函数调用阶段括号内传入的参数,称之为实际参数,简称实参,本质就是变量的值
func(1,2)
位置参数
位置形参
在函数定义阶段,按照从左到右的顺序依次定义的形参,称之为位置形参
def func(x, y):
print(x)
print(y)
特点:按照位置定义的形参,都必须被传值,多一个不行,少一个也不行。
位置实参
在函数调用阶段,按照从左到右的顺序依次定义的实参,称之为位置实参
func(2,3)
关键字实参
在调用函数时,按照key=value的形式为指定的参数传值,称为关键字实参。
func(z=2,y=3)
特点:可以打破位置的限制,但仍能为指定的形参赋值
注意:
- 可以混用位置实参和关键字实参,但是位置实参必须在关键字实参的左边。
- 可以混用位置实参和关键字实参,但不能对一个形参重复赋值。
func(x, y=2)
func(y=2, x) # SyntaxError: positional argument follows keyword argument
func(x, x=1) # NameError: name 'x' is not defined
可变长参数
可变长参数:指的是在调用函数时,传入的参数个数可以不固定
调用函数时,传值的方式无非两种,一种是位置实参,另一种是关键字实参,因此形参也必须得有两种解决方法,以此来分别接收溢出的位置实参(*)与关键字实参(**)
可变长形参*
形参中的会将溢出的位置实参全部接收,然后存储元组的形式,然后把元组赋值给后的参数。需要注意的是:*后的参数名约定俗成为args。
def sum_self(*args):
res = 0
for num in args:
res += num
return res
res = sum_self(1, 2, 3, 4)
print(res)
10
可变长实参之*
实参中的,会将后参数的值循环取出,打散成位置实参。以后但凡碰到实参中带的,它就是位置实参,应该马上打散成位置实参去看。
def func(x, y, z, *args):
print(x, y, z, args)
func(1, *(1, 2), 3, 4)
1 1 2 (3,4)
可变长形参之**
形参中的** 会将溢出的关键字实参全部接收,然后存储字典的形式,然后把字典赋值给** 后的参数。需要注意的是:**后的参数名约定俗成为kwargs。
def func(**kwargw):
print(kwargw)
func(a=5)
('a':5)
可变长实参之**
实参中的,会将** 后参数的值循环取出,打散成关键字实参。以后但凡碰到实参中带**的,它就是关键字实参,应该马上打散成关键字实参去看。
def func(x, y, z, **kwargs):
print(x, y, z, kwargs)
func(1, 3, 4, **{'a': 1, 'b': 2})
1 3 4 {'a': 1, 'b': 2}
可变长参数应用
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)
args: ()
kwargs: {'name': 'nick', 'sex': 'male', 'age': 19}
name: nick, age: 19, sex: male
命名关键字形参
命名关键字形参:在函数定义阶段,*后面的参数都是命名关键字参数。
特点:在传值时,必须按照key=value的方式传值,并且key必须命名关键字参数的指定的参数名。
def register(x, y, *, name, gender='male', age):
print(x)
print(age)
register(1, 2, name='nick', age=19
1
19
函数对象
函数是第一类对象,即函数可以被当做数据处理。
四大功能
- 应用
- .当作参数传给一个函数
- 可以当作函数的返回值
- 可以当作容器类型的元素