python函数
函数
函数是一个对象
函数可以用来保存一些可执行代码,并且可以在需要时,对这些语句进行多次调用
创建函数
def 函数名 ([形参1,形参2,---形参n]) 代码块
函数必须要符合标识符的规范
(可以包含字母,数字,下划线,但是不能以数字开头)
函数中保存的代码不会立即执行,需要调用函数代码才会执行调用函数:
函数对象() # 这个函数对象是函数名
定义函数一般都是要实验某种功能的
函数的参数
- 在定义函数时,可以在函数名后的()中定义不等的形参
- 多个形参之间使用,隔开
- 形参(形式参数)
定义形参就相当于在函数内部声明了变量,单并不是复制 - 实参(实际参数)
如果函数定义时,指定了形参,那么在调用函数时也必须传递实参,实参将会赋值给对应的形参,简单的说,有几个形参就有几个实参
- 形参(形式参数)
函数中参数的传递方式
- 定义一个函数
- 给函数定义形参时,可以为形参指定默认值,
- 指定了默认值以后,如果用户传递了参数则默认值就没有任何作用了
- 如果用户没有传递参数,默认值就会生效
例 def lmk (a = 5,) print('a' = ,a) lmk(1) # 这个时候默认值就不生效了,a还是5 lmk() # 这个时候会默认输出a = 5
- 如果用户没有传递参数,默认值就会生效
实参的传递方式
位置参数
- 位置参数就是对应位置的实参赋值给对应位置的形参
- 第一个实参赋值给第一个形参,第二个实参赋值给第二个形参,以此类推
- 形参就是定义函数是没有指明的函数,实参是调用函数时指明的形参
关键字参数
- 关键字参数可以不按照形参定义的顺序去传递,而直接根据参数名去传递参数
- 位置参数可以和关键字参数混合使用
- 混合使用关键字和位置参数时,必须将位置参数写到前面,让前面的位置参数获取到值后然后关键字参数就被调用了
例: def lmk(a,b,c) print(a,b,c) # 调用函数 lmk(b = 1,a = 2,c = 3) # 就是在调用函数时指明哪个变量是哪个值 def kml(a=3,b,c): print(a,b,c) kml(a=1,b=2,c=3) # 输出结果是 1 2 3 # (在函数中有一个默认参数,如果要改变默认参数的值,就需要在调用函数时更改默认参数) # 也就是说在调用函数时关键字参数的变量名是形参,值可以是实参,也可以是值
参数的类型-不定长参数
- 函数在调用时,解析器不会检查实参类型
实参可以传递任意类型的对象
不定长参数
- 在定义函数时,可以在形参前面加上一个*,这样这个形参就会获取到所有的实参
- 获取的实参会将所有的实参保存到一个元组中
- *a会接受所有的位置实参,并且会将这些参数统一保存到元组中(装包)
# 定义一个函数 可以求任意两个数字的和 def lmk(*nums): # 这里*nums传递的参数可能是1个也可能是多个 *代表不定长的参数的标识 kml = 0 # 用for循环把*nums中的值相加得到的和 for a in nums : kml += a print(kml) # 证明这个*a是一个元组 def lmk (*a): print(type(a),id(a)) lmk(1,2,3,4,5,6) # 返回值是元组 <class 'tuple'> 1781203238248
注明:带星号的形参只能有一个 ,在最前面或者最后面都可以
带星号的形参可以和其他参数配合使用
如果有一个参数是*a 那么后面的或前面的必须使用关键字参数(因为后面的参数没有被传递到)
def lmk (*a,b,c): print(a,b,c) lmk(1,2,3,b=10,c=20) # 输出结果是 (1, 2, 3) 10 20
也就是说如果*号参数在开头,则就是要求后面的参数就必须以关键字参数作为参数传递
*形参只能接受参数而不能接受关键字参数
def lmk (*a,b,c): print(a,b,c) lmk(a = 15,b=10,c=20) # 如果指定a的关键字参数的话就会报错
还有一个** 参数
**形参可以接受其他关键字参数,它会将这些参数统一保存到一个字典中
字典的key就是参数的名字,字典的value就是参数的值
用**形参无论传多少个参数都会被保存到一个字典中
**形参只能有一个,并且必须写在参数最后,如果写在前面**形参就会把所有的关键字参数保存到字典中后面的形参就没有值了所以就会报错
# 定义函数
def a(*a,**l):
# 可以传递形参 *a可以传递任意的参数,**l可以传递任意的关键字参数
print(a)
print(l)
# 调用函数时打印参数
# 调用函数
a(1,2,3,4,5,lmk='123',kml='lmk',kkk=123123)
# 输出结果
# (1, 2, 3, 4, 5)
# {'lmk': '123', 'kml': 'lmk', 'kkk': 123123}
参数的解包
传递实参时,也可以在序列类型的参数前添加星号,这样会自动将序列中的元素依次作为参数传递给函数
这里要求序列中的元素必须和形参的个数一致
*可以解包列表,元组,和集合,解包字典的话只能解包字典的key
** 可以解包字典的值 ,但是字典的key必须是形参
通过*解包元组
# 创建一个函数 def kml(a,b,c): print(a) print(b) print(c) # 创建一个元组 e = (1,2,3) # 调用函数将 e元组中的值传递给函数中的形参 kml(*e) # 结果 1,2,3
通过**解包字典
e = {'a':1,'b':2,'c':3} # 创建一个 字典,key必须和函数的形参名相同,且字典值必须等于函数的形参数量 def lmk(a,b,c): print(a) print(b) print(c) lmk(**e) # 结果 1,2,3
返回值
- 返回值就是函数执行以后返回的结果
- 可以通过return来指定函数的返回值
- 可以直接使用函数的返回值,也可以通过一个变量来接收函数的返回值
def lmk(*nums) : b = 0 for a in nums : b += a return b # 在调用函数时,就可以获取到b这个函数结果的值了
- return后面跟什么值,函数就会返回什么值
- return后面可以跟任意的对象,返回值甚至可以是一个函数,也就是什么都快可以跟
- 如果只写一个return 或者不写 则,默认就是返回一个 None
def lmk(*nums) : b = 0 for a in nums : b += a return b b = lmk(1,2,3) # prnit(b) # 输出结果是 6 # 这个函数的执行结果是返回值了,并且可以任意的处理
return 和 breat,continue 的区别
- return 是 执行后直接退出函数,也就是说return后的语句都不会执行
- 而 break 是终止一个循环,不是终止函数,则循环外的语句依然会执行,
- continue 是跳过当前循环,其他的依然照常执行
函数() 和 函数 的区别
def lmk(*nums) :
b = 0
for a in nums :
b += a
return b
print(lmk) # 这个是输出这个函数的对象 <function lmk at 0x000002B5BC0C36A8>
print(lmk(123,456,789)) # 这个是输出函数的返回结果 1368
本博客所有文章是以学习为目的,如果有不对的地方可以一起交流沟通共同学习 邮箱:1248287831@qq.com!