函数定义
函数定义
函数简介
函数就类似于是工具 提前定义好之后可以反复使用
通俗点将就是我们提前写好的一个程序
然后给他固定在一个地方
然后给他赋予一个名称
然后需要使用的时候点他的名称就可以调出来直接使用了
def 函数名(参数1,参数2):
''' 函数注释 '''
函数体代码
return 返回值
1.def(必须的)
是定义函数的关键字
2.函数名(必须的)
是函数的名字 相当于变量名
函数名的命名规范与风格遵循变量名的
3.参数1,参数2(可选的)
参数可以没有也可以有多个
表示在使用函数之前需要满足的一些条件
4.函数注释(可选的)
类似于产品说明书
主要用于介绍函数功能 参数使用 及其他情况
5.函数体代码(必须的)
函数核心的代码逻辑(重要)
6.return返回值(可选的)
使用函数之后反馈给使用者的结果 可以有也可以没有
###########################################################
1.函数必须先定义后调用(顺序不能乱)
2.函数在定义阶段只检测语法不执行代码
3.函数在调用阶段才会执行函数体代码
如何调用函数
函数名加括号 如果函数在定义阶段有参数则在调用阶段也需要给参数
###########################################################
函数在定义与调用阶段底层原理
1.在内存空间中申请一块空间存储函数体代码
2.将函数体代码所在的空间地址绑定给函数名
3.函数名加括号则会执行函数体代码
1.内置函数
python解释器自带的(提前给你定义好了 你直接使用即可)
2.自定义函数
程序员自己写的函数
2.1.无参函数
2.2.有参函数
2.3.空函数
# 无参函数:在函数定义阶段括号内没有写参数(变量名) def my_func(): print('这个函数很牛逼') # 有参函数:在函数定义阶段括号内写了参数(变量名) def my_func(a,b): print('这个函数更牛逼') my_func(1,2) # 空函数:函数体代码为空(pass ...) """ 虽然空函数本身没有含义 但是空函数可以提前规定好编写代码的思路 """ def run(): pass def fight(): pass def talk(): pass
1.形式参数
在函数定义阶段括号内所填写的参数 简称"形参"
def func(a, b): pass # a和b就是函数func的形参
2.实际参数
在函数调用阶段括号内传入的参数 简称"实参"
func(1,2) # 数据1和2就是函数func的实参
"""
形参与实参的关系
我们可以将形参看成是变量名 实参看成是变量值
两者在函数调用阶段临时绑定 函数运行结束断开
形参的表现形式只有一种就是变量名
实参的表现形式有很多种(但是把握核心 就是 数据值)
"""
"""函数名遇到括号就会调用!!!"""
用法1
函数名可以当做变量名赋值
def index(): print('from index') a = index a() # 本质就是在调用index函数
用法2
函数名还可以当做函数的实参
def index(): print('from index') def func(a): print(a) a() print('from func') func(index)
用法3
函数名还可以当做函数返回值
def index(): print('from index') def func(): print('from func') return index res = func() # 调用func并接受func的返回值 res()
用法4
函数名可以当做容器类型(内部可以存放多个数据)的元素
def index(): print('from index') l = [111, 222, 333, index()] print(l)
案列
def register(): print('注册功能') def login(): print('登录功能') def shopping(): print('购物功能') def transfer(): print('转账功能') def withdraw(): print('提现功能') def check_order(): print('查看订单') func_dic = {'1':register, '2':login, '3':shopping, '4':transfer, '5':withdraw, '6':check_order } while True: print(""" 1.注册功能 2.登录功能 3.购物功能 4.转账功能 5.提现功能 6.查看订单 """) choice = input('请输入功能编号>>>:').strip() # 判断用户输入的编号在不在字典的k中 if choice in func_dic: # 根据键获取值(函数名) func_name = func_dic.get(choice) # 函数名加括号调用 func_name() else: print('功能编号不存在') # 下列代码的弊端在于功能较多时 代码过于复杂 if choice == '1': register() elif choice == '2': login() elif choice == '3': shopping() else: print('写累了')
嵌套调用:函数内部调用其他函数
def index(): print('from index') def func(): index() print('from func') func() def my_max(a, b): if a > b: return a return b def many_max(x,y,z,m): res = my_max(x,y) res1 = my_max(res,z) res2 = my_max(res1,m) return res2 ret = many_max(1,2,3,4) print(ret)
函数体内部定义其他函数
将复杂的功能全部隐藏起来 暴露一个简单的接口
def all_func(type): def register(): print('注册功能') def login(): print('登录功能') def transfer(): print('转账功能') def shopping(): print('购物功能') # 这里仅仅是演示嵌套定义的现象 暂不考虑优化 if type == '1': register() elif type == '2': login() elif type == '3': transfer() elif type == '4': shopping() else: print('不知道啥功能') all_func('3')
闭:定义在函数内部的函数
包:内部函数使用了外部函数名称空间中的名字
# 只有符合上述两个特征的函数才可以称之为"闭包函数"
def outer(): x = 222 def index(): print('from index', x) return index # 闭包函数其实是给函数传参的第二种方式 # 方式1:函数体代码需要用到数据 直接在括号内定义形参即可 def index(username): print(username) def my_max(a, b): if a > b: return a return b # 方式2:利用闭包函数 def outer(x,y): # x = 2 # y = 40 def my_max(): if x > y: return x return y return my_max res = outer(2,40) print(res()) print(res()) import requests url = 'https://www.baidu.com' def outer(url): def get_content(): # 爬取百度首页数据 res = requests.get(url) if res.status_code == 200: with open(r'xxx.html','wb') as f: print('*'.center(30)) f.write(res.content) return get_content res = outer('https://www.baidu.com') res() res() res() res1 = outer('https://www.jd.com') res1() res1() res1() res1()