python-函数
函数的意义
函数是组织好的,可重复使用的,用来实现单一,或相关联功能的代码段。
函数能提高应用的模块性,和代码的重复利用率。Python提供了许多内建函数,比如print()。自己也可以创建函数,这被叫做用户自定义函数。
函数的定义:
- def 关键字开头,空格之后接函数的名称和圆括号,最后加上一个":".
- def 是一个关键字,是不可以改变的。
- 空格 是为了将关键字和函数名分开,一般的空1个空格。
- 函数名:函数名只能包含字符串、下划线和数字其不能也数字开头,要有一定表达函数的功能。
- 括号是必须加。
- 一般还会给函数的参数进行相应的说明,应该写在函数的下面的第一行,增强代码的可读性。
函数的调用:
函数的调用就是函数加上():fun()
函数的返回值
函数的返回值:分别是没有返回值、返回一个值、返回多个值,也关键字return [返回对象]
没有返回值
1.
def func(): # 函数的定义
s = "abc"
for i in s:
print(i * 2) # 打印
ret = func()
print(ret) # None 没有返回值则为None
2.
def func(): # 函数的定义
s = "abc"
for i in s:
print(i * 2) # 打印
return # 加上一个return 没有加上任何对象
ret = func()
print(ret) # 返回的还是None
当函数中遇见return 则就结束函数体
def test():
print("aaa")
return # 程序执行到这里,就结束,后面的代码将不执行
print("bbb")
test() # aaa
一个返回值
def test():
b = 20
c = 30
a,b= b,c
return a # 返回参数a
t = test()
print(t) # 20
多个返回值
返回多个值是也元组的形式进行返回
def test():
b = 20
c = 30
a, b = b, c
return a, b, c
t = test()
print(t) # (20, 30, 30)
1.遇到return,此函数结束,return后面的东西将不会在执行
2.return 返回值
关于返回值:
如果return什么都不写或者干脆就没写return,返回的结果就是None
如果return后面写了一个值,返回给调用者这个值
如果return后面写了多个结果,,返回给调用者一个tuple(元祖),调用者可以直接使用解构获取多个变量
函数的参数
在函数调用的时候具体指定的值,就是参数:
def 函数(参数):
函数体
测试:
def test(x):
print("传递的参数是{}".format(x))
test(12) # 传递的参数是12
参数
参数可以分为:
- 形式参数 在函数声明的位置的变量叫形式参数 def func(a) a就是形式参数
- 实际参数 在函数调用的时候给函数传递的值。fun("test") "test"就是实际参数
- 传递参数 给函数传递信息的时候将实际的参数传给形式参数的过程叫做传参。
参数的分类
实参的角度
位置参数
def max_(x, y):
return x if x > y else y
ret = max_(12, 23) # 按照位置进行传参数
print(ret) # 23
关键字参数
def max_(x, y):
return x if x > y else y
ret = max_(x=12, y=23) # 关键字进行传递参数
print(ret) # 23
混合参数
def max_(x, y):
return x if x > y else y
ret = max_(12, y=23) # 位置参数和关键字参数混合在一起使用
print(ret) # 23
注意:位置参数必须在关键字参数的前面,对于一个形参只能赋值一次
形参的角度
1.按照位置传值:位置参数。
def max_(x, y):
return x if x > y else y
ret = max_(12, 23)
print(ret) # 23
如果不传递参数
def max_(x, y):
return x if x > y else y
ret = max_() # TypeError: max_() missing 2 required positional arguments: 'x' and 'y'
print(ret
2.将变化比较小的值设置成默认数值:默认参数。
def max_(x, y = 20): # y = 20 默认参数
return x if x > y else y
ret = max_(10)
print(ret) # 20
ret1 = max_(10, 30)
print(ret1) # 30
默认参数如果是一个可变的数据类型
def append_(l, li=[]):
li.append(l)
print(li)
append_(2)
append_(3)
append_(4)
append_("abcd")
append_([45,45]) # [2, 3, 4, 'abcd', [45, 45]]
3.可接收所有的位置参数与关键字参数:动态参数。
def test(*args, **kwargs):
print(args)
print(kwargs)
test(1,2,3,4,"abdas", False, True, (78, "abc"), name ="Yang", age = 78) #
# (1, 2, 3, 4, 'abdas', False, True, (78, 'abc'))
# {'name': 'Yang', 'age': 78}
关于*args和**kwargs中打散和聚合的问题
def test1(a, b, d=0, *args, c=1, **kwargs): # 将数据放在*args之前,关键字参数会被替换
print(a, b, c, args, kwargs, d) # 将数据放在**kwargs之前,关键字参数是默认参数
# 1 2 1 (5, 6) {'r': 2, 'y': 78} 3
print(*args) # 元组打散 5 6
print(*kwargs) # 打散 返回key r y
test1(1, 2, 3, 5, 6, r=2, y=78)
********************************************************************
dic = {"a": "b"}
def test(**kwargs):
print(kwargs) # {"a": "b"}
print(*kwargs) # "a"
test(**dic) # a=b
li = [1, 3, 2]
def test(*args): #
print(args) # args:(1, 3, 2)
print(*args) # args:1 3 2
test(*li) # 1 3 2
偏函数
固定函数中的一些参数,返回一个新的函数
rom functools import partial
def three_num_add(a, b, c):
"""
三个数字相加
:return: int
"""
return a + b + c
new_func = partial(three_num_add, c=10) # 将c的参数进行保存
ret = new_func(10, 20) # 在新的函数中传入a,b参数
print(ret) # 40