一、函数的基本使用

  • 什么是函数?

    ps:函数就是盛放代码的容器

    具备某一功能的工具--->函数

    事先准备工具的过程--->函数的定义

    遇到应用场景拿来就用--->函数的调用

    函数的使用原则:

    先定义

    后调用

  • 为何要用函数?

    解决下述问题:

    1.代码组织结构不清晰、可读性差

    2.可维护性、可扩展性差

  • 如何用函数?

    先定义-----> 三种定义方式

    后调用-----> 三种调用方式

    返回值-----> 三种返回值的形式

1、函数的前戏

l = [11, 22, 33, 44, 55, 66, 77, 88]
print(len(l))  # 假设len无法使用

def my_len():
    n = 0
    for i in l:
        n += 1
    print(n)
print(my_len())
"""
1.我们现在所写的代码无法做到精简 需要用就必须重复写
    模仿len的内部源码
2.我们现在所写的代码兼容性极差(无法解决)
3.我们现在所写的代码没有返回值(无法解决 使用之后的返回结果)
函数简介
    函数就类似于是工具 提前定义好之后可以反复使用
"""

2、函数语法结构

# 函数语法结构
"""
def 函数名(参数1,参数2):
    '''函数注释'''
    函数体代码
    return 返回值
    
1.def(必须的)
    是定义函数的关键字
2.函数名(必须的)
    是函数的名字 相当于变量名
    函数名的命名规范与风格遵循变量名的
3.参数1,参数2(可选的)
    参数可以没有也可以有多个 
    表示在使用函数之前需要满足的一些条件
4.函数注释(可选的)
    类似于产品说明书
    主要用于介绍函数功能 参数使用 及其他情况
5.函数体代码(必须的)
    函数核心的代码逻辑(重要)
6.return返回值(可选的)
    使用函数之后反馈给使用者的结果 可以有也可以没有
"""

3、函数的定义与调用

###########################################################
1.函数必须先定义后调用(顺序不能乱)
2.函数在定义阶段只检测语法不执行代码
3.函数在调用阶段才会执行函数体代码
	如何调用函数
    	函数名加括号 如果函数在定义阶段有参数则在调用阶段也需要给参数
###########################################################
函数在定义与调用阶段底层原理
1.在内存空间中申请一块空间存储函数体代码
2.将函数体代码所在的空间地址绑定给函数名
3.函数名加括号则会执行函数体代码

4、函数的分类

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


image

二、函数的参数

1、函数参数的两大分类

  • ·函数参数总体分为两大类:

    • 1、形参:在函数定义阶段括号内指定的参数,称之为形式参数,简称形参----》变量名

    • 2、实参:在函数调用阶段括号内传入的值,称之为实际参数,简称实参----》变量的值

①形参 (形式参数)

形式参数
	在函数定义阶段括号内填写的参数 简称"形参"
    	def func(a,b):
            pass
        # a和b就是函数func的形参
        
  """形参的表现形式只有一种,就是变量名"""

②实参(实际参数)

实际参数
	在函数调用阶段括号内传入的参数 简称"实参"
    	def func(a,b):
            pass
        func(1,2)
        # 数据1和2就是函数func的实参
 """
 形参与实参的关系
 	我们可以将形参看成是变量名 实参看成是变量值
 		两者在函数调用阶段临时绑定 函数运行结束断开
 
 实参的表现形式有很多种(但是把握核心 就是 数据值)
 """

2、位置参数

'''位置参数
	按照从左往右的顺序依次填入参数
位置形参
	在函数定义阶段括号内按照从左往右的顺序依次填入的变量名
位置实参
	在函数调用阶段括号内按照从左往右的顺序依次传入的数据值
'''
# 定义一个可以比较大小的函数(传入两个值 返回较大的)

关键字实参(可以打破位置顺序)
	在函数调用阶段通过形参名=数据值的形式指名道姓的传值
'''
1、位置形参与位置实参在函数调用阶段 按照位置一一对应绑定
2、位置参数在绑定的时候多一个不行少一个也不行
'''

ps :小技巧
'''格式越简单的越靠前 格式越复杂的越靠后'''

3、默认参数

默认参数
	默认形参
    	函数在定义阶段就可以给形参赋值了
        	1.该形参在函数调用阶段如果不给值 则使用默认的
            2.该形参在函数调用阶段也可以继续给值 则使用你给的
        
# 定义学员注册功能
	def register(name, age, gender='male'):
    	print('%s:%s:%s' % (name, age, gender))
    register('jason', 18)
    register('tony', 28)
    register('kevin', 38)
    register('lili', 18, 'female')
    register('lili', 18, gender='female')
 
"""
位置形参与默认值形参在定义的时候
	位置形参必须在默认值形参的前面
"""
'''格式越简单的越靠前 格式越复杂的越靠后'''

4、可边长参数 *参数

  • 可变长参数指的是在调用函数时,传入的实参个数不固定,对应着必须有特殊形式的形参来接收多出的实参
实参无非两种形式
多出的位置实参----->*号
多出的位置关键字实参----->**号
号在形参中的应用:号会将多出的位置实参合并成一个元组,然后赋值给紧跟其后的那个形参名
# 1.函数无论传入多少位置参数都可以正常运行
# 可变长形参
# def func(x,y,*a):
#     print(x,y,a)
# func()  # ()
# func(1)  # (1,)
# func(1, 2, 3, 4, 5, 6, 7)  # (1, 2, 3, 4, 5, 6, 7)
# func(1,2)  # 1 2 ()
# func(1,2,3,4,5,6,7,8,9)  # 1 2 (3, 4, 5, 6, 7, 8, 9)
# func(1,2)  # 1 2 (3, 4, 5, 6, 7, 8, 9)
"""
*号在形参中的使用
    用于接收多余的位置参数 并组织成元组的形式赋值给*号后面的变量名
"""
号在形参中的使用:用于接收多余的关键字参数 并组织成字典的形式赋值给号后面的变量名
# 2.函数无论传入多少关键字参数都可以正常运行
# def index(x, y, **b):
#     print(x, y, b)
# index()  # {}
# index(a=1,b=2,c=3,d=4)  # {'a': 1, 'b': 2, 'c': 3, 'd': 4}
# index(y=2, x=1)  # 1 2 {}
# index(y=2, x=1, u=222, k=111, l=444)  # 1 2 {'u': 222, 'k': 111, 'l': 444}
"""
**号在形参中的使用
    用于接收多余的关键字参数 并组织成字典的形式赋值给**号后面的变量名
"""
③*号在实参中的使用:会将列表、元组内的元素打散成位置参数的形式一一传值
# def index1(*args):
#     print(args)
# new_list1 = [11,22,33,44,55,66,77,88,99]
# index1(*new_list1)  # index1(11,22,33,44,55,66,77,88,99)
"""
*号在实参中的使用
    会将列表、元组内的元素打散成位置参数的形式一一传值
"""
④**号在实参中的使用:会将字典内的键值对打散成关键字参数传入
# def index2(**kwargs):
#     print(kwargs)
new_dict = {'username':'jason','pwd':123}
# index2(**new_dict)  # index2(username='jason',pwd=123)
# {'username': 'jason', 'pwd': 123}
"""
**号在实参中的使用
    会将字典内的键值对打散成关键字参数传入
"""

重要知识

# 定义一个函数无论传入多少位置参数和关键字参数都可以正常运行
# def index(*a,**b):
#     print(a,b)
# index()  # () {}
# index(1,2,3,4)  # (1, 2, 3, 4) {}
# index(a=1,b=2,c=3)  # () {'a': 1, 'b': 2, 'c': 3}
# index(1,2,3,4,a=1,b=2,c=3)  # (1, 2, 3, 4) {'a': 1, 'b': 2, 'c': 3}
"""
墨守成规
    可变长形参 *与**后面的变量名其实是可以随便定义的
    但是python中推荐使用
        *args  
        **kwargs 
def index(*args, **kwargs):
    pass
"""


# def index(a, b, c):
#     print(a,b,c)
# new_list = [11,22,33]
# index(new_list)  # 肯定不行  列表是一个整体 相当于一个实参
# index(new_list[0],new_list[1],new_list[2])  # 可以
'''如果index形参是*args 列表里面有很多元素 如何实现按照位置一一传入'''

image

每天进步一小步 成功前进一大步

posted on 2021-11-12 18:40  耿蜀黍  阅读(115)  评论(0编辑  收藏  举报