函数
1.1函数的简介
函数其实就是用来保存数据的
函数的优点:
1、遇到重复功能的时候,直接调用,减少代码量
2、提升代码,项目的结构性,分工明确,提高代码的可读性
3、遇到扩展功能的时候,修改还比较方便
1.2函数的定义
def()——》函数名(形参1,形参2,形参3......形参n)
代码块
命名规则:
1、由数字或字母或下划线组成
2、首字母不能是数字
3、不能使用关键字
命名规范:
1、见名知意
2、下划线命名法
3、驼峰命名法
def my_len(str):
length=0
for c in str:
length+=1
return length
length=my_len("https://edu.zztion.com/live/index?termId=265261431274864640&resourceId=322524823567728640")
print(length)
89
Process finished with exit code 0
1.3函数的调用
必须遵循先定义,再调用
def fn():
print("这是我的第一个函数")
print(fn)
print(fn())
fn()
<function fn at 0x000002C29A3D00D0>
这是我的第一个函数
None
这是我的第一个函数
Process finished with exit code 0
fn——》函数对象
fn()——》调用函数
print——》函数对象
print()——》调用函数
#定义一个函数login(),功能是输入用户名和密码,验证是否正确
def login():
i=0
while i<=3:
i+=1
user=2022020222
code=123456
user=int(input("请输入你的账号:"))
code = int(input("请输入你的密码:"))
if user==2022020222 and code==123456:
print("恭喜你,登录成功!")
break
if i == 4:
print("您的登录次数已用完,账号冻结")
break
else:
print("不好意思,密码错误,您还有"+str(4-i)+"次机会")
login()
1.4函数的参数
1.4.1形参和实参
形参
def 函数名(参数1,参数2,参数3…):
pass
·定义一个函数,可以用来求任意两个数的和:
def sum():
a=10
b=20
print(a+b)
sum()
30
Process finished with exit code 0
函数的参数:在定义参数时,可以在函数名后()中定义数量不等的形参,注意可以有也可以没有,可以有1个也可以有多个,多个形参之间用逗号隔开
形参(形式的参数):定义形参就相当于在函数内部声明了变量,但是并不赋值
实参
实参(实际的参数):在函数定义的时候指定了形参,在调用的时候也必须传递实参,我们的实参会赋值给对应的形参
def fn(a,b):
print(a,"+",b,"=",a+b)
fn(200,100)
200 + 100 = 300
Process finished with exit code 0
总结:我们在定义函数的时候叫形参,需要在调用的时候才确定值,调用的时候叫实参
定义多少个形参就要传递多少个实参
1.4.2参数的传递方式
1.4.2.1默认值参数
def fn(a,b,c=10):
print("a=",a)
print("b=",b)
print("c=",c)
fn(200,100)
a= 200
b= 100
c= 10
Process finished with exit code 0
def fn(a,b,c=10):
print("a=",a)
print("b=",b)
print("c=",c)
fn(200,100,100)
a= 200
b= 100
c= 100
Process finished with exit code 0
默认值参数就是如果你传递了值就用你传递的值,如果你没传递值就用默认值
1.4.2.2位置参数和关键字参数
1、位置参数:就是将对应位置的参数赋值给对应位置的形参
2、关键字参数:可以不用按照形参定义的顺序来传递,而是直接按照根据参数名字来传递
注意:混合使用位置参数和关键字参数时,位置参数必须放在关键字参数前面
1.4.3实参的类型
def fn(a):
print("a=",a)
b=True
fn(b)
a= True
Process finished with exit code 0
def fn(a):
print("a=",a)
b=fn
fn(b)
a= <function fn at 0x00000213C55200D0>
Process finished with exit code 0
def chengji():
a=int(input("a="))
b=int(input("b="))
c=int(input("c="))
print(a,"*",b,"*",c,"=",a*b*c)
chengji()
a=10
b=160
c=026
10 * 160 * 26 = 41600
Process finished with exit code 0
2.1可变参数
2.1.1*args
可变参数也可以称为不定长参数,我们在定义函数写形参的时候可以在形参前面加一个*号
def fn(*a):
print(a)
print(type(a))
fn()
()
<class 'tuple'>
Process finished with exit code 0
def fn(*a):
print(a)
print(type(a))
fn(1,2,3,4,5)
(1, 2, 3, 4, 5)
<class 'tuple'>
Process finished with exit code 0
我们可以发现*a能够接收所有的实参,并且把实参保存到一个元组中,可以成为装包
def sum(*args):
Z=0
for i in args:
Z+=i
print(Z)
sum(1,2,3,4,5,6,4,5,6,7,8,9,10)
70
Process finished with exit code 0
注意:
1、带*号的形参只能有一个
2、带*号的参数可以与其它参数配合使用,但是带星的参数一定要写在最后面
如果一定要把*号放在前面,后面的两个参数一定要用关键字参数传值
2.1.2**kwargs
上一节带*号的形参有一个弊端就是只能接收位置参数,所以这节的**kwargs的作用就出来了
def fn(**kwargs):
print("args=",kwargs)
print(type(kwargs))
fn(a=2,b=3,c=5)
args= {'a': 2, 'b': 3, 'c': 5}
<class 'dict'>
Process finished with exit code 0
总结:**形参可以接收任意的关键字参数,会将这些参数统一保存到字典里,字典的键就是参数的名字,字典的值就是参数的值
注意:**形参也是只能有一个,并且必须写在所有参数最后,它必须也是在最后位置
2.1.3参数解包
元组解包(*args)
def fn(a,b,c):
print("a=",a)
print("b=",b)
print("c=",c)
t=(1,2,3)
fn(*t)
a= 1
b= 2
c= 3
Process finished with exit code 0
其中的*t就称之为解包,将实参中的元组元素解放出来。传递实参时,也可以在序列类型的参数前面添加⭐号,这样它会自动将序列中的元素依次作为参数传递
但序列元素的个数必须对应我们定义的形参个数
字典解包(**kwargs)
def fn(a,b,c):
print("a=",a)
print("b=",b)
print("c=",c)
t={"a":10,"b":20,"c":30}
fn(**t)
a= 10
b= 20
c= 30
Process finished with exit code 0
其中的**t就称之为解包,将实参中的字典元素解放出来。
1、*args是用于接收多余的未命名的参数,**kwargs用于接收形参中命名的参数,其中args是一个元组类型,而kwargs是一个字典类型的数据
2、*agrs是把元组中的数据进行拆包,也就是把元组中的数据拆成单个的数据,**kwargs是把字典中的数据进行拆包,也就是把字典中的数据拆成单个的键值对
3.1函数的返回值
def sum(*args):
#定义一个变量,来保存结果
result=0
#遍历元组,并且将元组中得到的数进行累加
for i in args:
result+=i
# print(result)
return result
sum(10,20,30,40)
Process finished with exit code 0
函数执行以后返回的结果,可以通过return来返回执行的结果
def fn(*args):
#定义一个变量,来保存结果
result=0
#遍历元组,并且将元组中得到的数进行累加
for i in args:
result+=i
# print(result)
return result
# x=fn(10,20,30,40)
# print(x)
# print(fn())
fn()
fn
print(fn)
x=fn()
print(x)
<function fn at 0x000002179A4100D0>
0
Process finished with exit code 0
return 后面是什么,函数返回结果就是什么
return 后面可以是任意的值
return 后面跟啥就返回啥
返回值也可以返回函数,返回值可以是任意类型包括函数
def fn2():
pass
print(fn2())
None
如果我们不给函数return,那么这个函数的返回值就是None
print(type(None))
<class "NoneType">
None 类型——》空类型
def fn():
return
print(fn())
None
对于return后面没有内容时,python会在末尾默认return None,表示这个函数默认返回空值
总结:如果仅仅写一个return或者不写return,就等价于return None
None是python中一个特别的空值,用来表示空的
在函数中,return代表函数执行结束,后面代码不会再执行,这就是return