函数定义
① 表示事先把需要运行的逻辑存到函数中,提取变化的部分。用于封装一段逻辑;
② 作用:组织代码,提高代码复用率;
③ 格式,其中参数可为空或者多个
def 函数名(形参1,形参2,...):
"""注释,函数说明"""
函数体
return 返回值
④ 函数命名
- 函数名称是标识符的一种,字母数字下划线
- 遵循蛇形(下划线)命名
- 见名知意
- 如果函数名称不能很好表达函数意义,可通过函数注 释说明意思
⑤ 函数定义的时候函数体中的代码不会执行
函数调用
① 使用函数的过程叫做调用函数
② 格式:
函数名称(实参1,实参2,...)
#函数调用时才会执行函数体
TODO:注意事项
① 一个模块(一个.py文件)中不要定义多个同名函数,同名的情况后面会把前面覆盖掉
② 函数执行到return,会终止执行
函数传参
TODO:首先区分一个概念,函数定义的参数叫形参,函数调用的参数叫实参
① 位置参数,实参按位置顺序和形参一一对应,不能交叉
>>> def sub(a,b):
return a-b
>>> sub(1,3)
-2
② 关键字参数,函数调用时使用,直接通过=将实参赋值给形参,不考虑位置
>>> def sub(a,b):
return a-b
>>> sub(b=9,a=13)
4
tip:位置参数在前,关键字参数在后
>>> sub(b=3,1) #关键字和位置参数顺序不正确
SyntaxError: positional argument follows keyword argument
>>> sub(1,b=3)
-2
③ 默认参数,函数定义时给形参一个默认值,作用:函数调用时少写实参。函数调用时该参数不传参就用默认参数,有传参就用实参。
>>> def sub(b,a=10):
return a-b
>>> sub(3) #默认参数a不传参使用默认值10
7
>>> sub(3,11) #默认参数a传参使用实参11
8
tip:位置参数在前,默认参数在后
④ 不定长参数 ‘*’ 和 ‘**’
- 在一个形参前面加*号,函数调用时收集所有没配对的实参集合为一个元组传参到该形参,只收集位置参数
- 在一个形参前面加**号,函数调用时所有没配对的关键字实参集合为一个字典传参到该形参,只收集关键字参数
>>> def method(a,b,*c):
print(a)
print(b)
print(c)
>>> method(1,2,3,4,5,6) #没有配对的3,4,5,6
1
2
(3, 4, 5, 6)
>>> def method(a,b,**c):
print(a)
print(b)
print(c)
>>> method(1,2,d=3,c=5)
1
2
{'d': 3, 'c': 5}
>>> def method(a,b,*c,**d): # *和**可以组合使用
print(a)
print(b)
print(c)
print(d)
>>> method(1,2,3,4,5,d=10,e=100,f=9) #*收集 位置参数,**收集关键字参数
1
2
(3, 4, 5)
{'d': 10, 'e': 100, 'f': 9}
⑤ 拆包,函数调用时使用。列表和元组实参通过*拆包为位置参数,字典实参通过**拆包为关键字参数
>>> def marry(male,female):
print(f"""{male}和{female}结婚了""")
>>> marry("王子","公主") #普通位置参数传参
王子和公主结婚了
>>> marry(*["王子","公主"]) #列表拆包传参
王子和公主结婚了
>>> marry(*("王子","公主")) #元组拆包传参
王子和公主结婚了
>>> marry(**{"female":"公主","male":"王子"}) #字典拆包传参,注意字典的key要和函数的形参对应
王子和公主结婚了
函数返回值
- 函数体执行以后得到函数返回值
- 函数返回值有且只能由return决定
- return的值是给函数的调用方使用的,对函数自身的计算无影响
- 函数体中return后面的语句不执行
内置函数
可通过官方文档查看所有内置参数及说明,以下只列举几个常用的
https://docs.python.org/zh-cn/3.8/library/functions.html
- print() # 打印
- input() # 用户输入
- type() # 返回对象数据类型
- sorted() # 从小到大排序,返回一个排序后的列表
- max() # 求最大值
- min() # 求最小值
- sum() # 求和
- enumerate() # 获取列表索引和值
- eval # 去掉一个字符串的引号(俗称脱衣服),变成python可执行代码
>>> print(eval("4>5"))
False
- range() # range 类型表示不可变的数字序列,通常用于在 for 循环中循环指定的次数。取头不取尾,第三个参数为步长,逻辑类比切片
>>> list(range(10))
[0, 1, 2, 3, 4, 5, 6, 7, 8, 9]
>>> list(range(1,50,5))
[1, 6, 11, 16, 21, 26, 31, 36, 41, 46]
>>> list(range(0))
[]
>>> list(range(0,-10,-1))
[0, -1, -2, -3, -4, -5, -6, -7, -8, -9]
- zip() #将2个序列(如列表、元组)元素一一对应起来,多余的去掉
>>> lst_1 = ["今天","明天","后天"]
>>> lst_2=["9号","10号","11号","12号"]
>>> zip(lst_1,lst_2)
<zip object at 0x00000000029CCC40>
>>> list(zip(lst_1,lst_2))
[('今天', '9号'), ('明天', '10号'), ('后天', '11号')]
>>> tuple(zip(lst_1,lst_2))
(('今天', '9号'), ('明天', '10号'), ('后天', '11号'))
>>> dict(zip(lst_1,lst_2))
{'今天': '9号', '明天': '10号', '后天': '11号'}
…
作用域
① 函数内部叫局部作用域,函数外部叫全局作用域
- 局部变量不能在全局作用域获取
- 局部作用域可以直接使用全局变量
>>> c=2
>>>> def mm(a,b):
return a+b-c
>>> mm(10,20)
28
② 函数内部可以修改全局变量,但需要先用global声明变量是全局变量
>>> c=2
>>>> def minus(a,b):
... global c
... c=a+b-1
... return c
>>> minus(2,4)
5
>>> c
5
函数相互调用
- 指在函数内部调用另一个函数,下面举个无营养的小demo
>>> def max_(a,b,c):
return max(a,b,c)+1
>>> def max_2():
print(max_(3,4,5),"给最大值加1")
>>> max_2()
6 给最大值加1