函数
# 古诗:悯农
# 改需求
a = '*'
for i in range(100):
print('锄禾日当午')
print('*********')
print('汗滴禾下土')
print('@@@@@@@@@')
print('谁知盘中餐')
print('+++++++++')
print('粒粒皆辛苦')
print('---------')
1. 避免代码冗余
2. 提高代码的可维护性
程序员可控的代码量:2W
3. 提高代码的灵活性
4. 提高代码的可重用性
将可重用的逻辑,或者拥有独立功能的代码封装成一起
定义(概念):函数由一组代码构成,完成一个特定的任务
语法:
关键字:def:声明要定义一个函数了
函数的声明:
def 函数名(形式参数):
代码(结构体)
函数的调用:
函数名(实际参数)
调用函数的时候分为函数名+(),但凡在定义之外只要出现括号了,就说明函数被调用了
定义(创建):
1. 定义在全局位置
在没有缩进的位置定义
2. 定义在任何函数的内部
局部性质
流程:
1. 编译流程
1. 通过编译器寻找def关键字,创建了一个函数对象
2. 创建函数体(但是不执行)
2. 执行流程
1. 执行函数的调用
2. 根据函数名跳转到函数定义的位置
3. 执行函数体
4. 执行完毕函数体,流程返回到函数调用处继续向下执行
1. 函数的声明:
def:define
函数名:一定要好好命名(必须自己能看懂)
形式参数
2. 函数体:
内容,函数的功能要实现的核心内容
3. 函数的返回值:
默认返回None
可以返回任意值
可以返回多个值,返回多个值的时候,打包成元组
关键字:def
函数名:全小写
参数:形式参数(可以没有)
函数的参数
1. 形式参数
函数声明的时候,定义的参数
简称:形参
相当于函数的局部变量
2. 实际参数
函数调用过程中,传入的参数
简称:实参
相当于给函数的形式参数赋值
3. 没有定义任何参数
称之为无参
参数和位置有关1. 实参和形参的位置必须一一对应2. 位置参数的数量必须一一匹配3. 位置参数,一旦设定,必须传值。
def func(a,b): print(a)func(1,2)
1. 基于形参2. 不受位置的影响3. 实参和形参必须一一对应
def func(a,b): print(a)func(b=2,a=1)
1. 基于形参2. 如果不传递实际参数,则使用默认值作为实参3. 如果传递实参,则使用传递后的实参
def func(a,b): print(a)func(b=2,a=1)
可以接收多个参数的形参1. 基于形参2. 分类: 1. *args 将接收到的多个参数打包成一个元组 只能通过位置参数来传递 2. **kwargs 将接收的多个参数打包成字典 只能通过关键字参数传值3. 相同类型的可变长参数,只能有一个4. 可变长参数可以改名
def func(**kwargs): print(kwargs)func(a=1,b=2,c=3,d=4,e=5)
1. 关键字参数和位置参数混用 关键字参数只能出现在位置参数之后 原因:参数出现等号的形式,之后的所有参数,都被视为等号形式传值2. 默认参数和未知参数混用 默认参数只能出现在位置参数之后3. 可变长参数和位置参数混用: 约定俗成:可变长参数要放在最后并且先 *args 再 **kwargs
1. 必须出现在函数体的第一行2. 习惯上使用三引号作为文档注释 可以使用单引号或者双引号3. 函数文档的查看: 可以按着ctrl+鼠标单击该函数查看 查看help(函数名)
函数和过程
return1. 任何函数必须有返回值2. 如果函数中不写任何的return,在函数结尾的地方,自动添加一个return None3. 如果函数中只写了return但是没有携带任何值,自动添加一个None4. return的作用: 1. 返回流程 2. 返回的时候,可以顺便携带一个值(一定会有返回值)5. return的值: 1. 任何对象 2. 返回值有且只有一个 3. 如果要返回多个值,打包成元组进行返回 4. 如果返回的是表达式,那么返回的是表达式计算出的值 5. 返回一个函数的调用 函数的返回值就是被调用的函数的返回值(间接获取的返回值) 6. 可以返回一个函数对象 返回形式:return 函数名 注意:被返回的函数并没有执行(没有调用) 注:pass:是一个关键字,表示不写任何内容
def func(a): if a=='帅': return func2 else: return func3def func2(): return 'my name is zhangyanhao'def func3(): return 'my name is yaojiaqi'print(func(a='更帅')())
作用域:作用范围1. 全局变量 1. 没有缩进的变量 2. 先定义后使用 3. 作用范围:从定义开始到包含他的代码块结束2. 局部变量 1. 定义在函数内部的变量 2. 先定义后使用 3. 作用范围:从定义开始到包含他的代码块结束3. 如果函数内部的局部变量和全局变量发生了命名冲突,在局部访问的是局部变量,在全局使用的是是全局变量(相互不干扰) 如果全局变量和局部变量重名,那么会在局部创建一个同名对象
如果函数内部的同名局部变量的修改影响同名的全局变量,应该使用global1. global 变量名:声明从该行开始,本层代码的所有该变量,都是全局变量 只对本层有效
a = 1def func(): global a a = 3 print(a)func()print(a)
影响上一层的同名的局部变量1. nonlocal影响上一层的同名局部变量2. 如果上一层没有对应的局部变量,则报错: SyntaxError: no binding for nonlocal 'b' found3. nonlocal和global不能同时声明同一个变量
a = 1def func(): a = 2 def func1(): nonlocal a print(a) a = 3 print(a) print(a) func1()func()print(a)