26.函数的概念以及定义方式

函数的概念及定义方式

一.函数体系

接下来,我们将按照这个函数体系给大家详细的介绍函数:

  • 什么是函数?
  • 为什么要用函数?
  • 函数的分类:内置函数与自定义函数
  • 如何自定义函数
    • 语法
    • 定义有参数函数,及有参函数的应用场景
    • 定义无参数函数,及无参函数的应用场景
    • 定义空函数,及空函数的应用场景
  • 调用函数
    • 如何调用函数
    • 函数的返回值
    • 函数参数的应用:形参和实参,位置形参,位置实参,关键字实参,默认形参,*args,**kwargs
  • 高阶函数(函数对象)
  • 函数嵌套
  • 作用域与名称空间
  • 装饰器
  • 迭代器与生成器及协程函数
  • 三元运算,列表解析、生成器表达式
  • 函数的递归调用
  • 内置函数
  • 面向过程编程与函数式编程

二.什么是函数?

假设你现在是一个工人,如果你实现就准备好了工具,等你接收到任务的时候,直接带上工具就可以工作了,而不是临时去制作。

在程序中,函数就是具备某一功能的工具,实现将工具准备好就是函数的定义,遇到应用场景将工具拿来用,就是函数的调用。

三.为什么要使用函数

如果不使用函数,写程序时会遇到这三个问题:

  1. 程序冗长,组织结构不清晰,可读性差
  2. 程序的扩展性差
  3. 程序的可维护性差

四.如何用函数

函数的使用遵循一个原则:先定义函数,然后调用它

  • 定义函数
def 函数名(param1、param2……):
    """
    函数功能的描述信息
    :param1:描述参数
    :param2:描述参数
    :return:返回值
    """
    code 1
    code 2
    code 3
    ...

    return 返回值
  • 调用函数
函数名(param1、param2……)

4.1 登录注册功能的函数

# 注册功能函数
def register():
    """注册功能"""
    username = input('username: ').strip()
    pwd = input('password: ').strip()

    with open('user.txt', 'a', encoding='utf8') as fa:
        fa.write(f"{username}:{pwd}\n")
        fa.flush()
register()

# 登录功能函数
def login():
    """登录功能"""
    inp_username = input('username: ').strip()
    inp_pwd = input('password: ').strip()

    with open('user.txt', 'rt', encoding='utf8') as fr:
        for user_info in fr:
            user_info = user_info.strip('\n')
            user_info_list = user_info.split(':')
            if inp_username == user_info_list[0] and inp_pwd == user_info_list[1]:
                print('login successful')
                break
        else:
            print('failed')
login()

4.2函数的定义阶段

def func():
    bar()  # 不属于语法错误,不会报错
    print('*'*10)

在函数的定义阶:

  1. 申请内存空间保存函数体代码
  2. 将函数体绑定给函数名
  3. 定义阶段不会执行函数体代码,但是会检测函数体的语法

4.3 函数的调用阶段

def bar():
    print('from bar')

def foo():
    print('from foo')
    bar()

foo()
'''
from foo
from bar
'''
def foo():
    print('from foo')
    bar()
    
def bar():
    print('from bar')

foo()
'''rom foo
from bar
'''

函数调用阶段:

  1. 通过函数名找到函数的内存地址
  2. 然后加括号就是在出发函数体代码并执行

五. 定义函数的三种形式

5.1 无参函数

定义函数时参数是函数体接收外部传值的一种媒介,其实就是一个变量名

在函数定义阶段,括号内没有参数,称为无参函数。需要注意的是:定义的时候是无参函数,调用的时候也不用传入参数。

如果函数体代码逻辑不需要依赖外部传入的值,则必须定义成无参函数。

def func():
    print('hello lwx')

func()

# hello lwx

5.2有参函数

在函数定义阶段,括号内有参数,称为有参函数。需要注意的是,定义时有参数,调用的时候也必须传入参数。

如果函数体代码逻辑需要依赖外部传入的值,那么必须定义成有参函数。

def  sum_self(x,y):
    res = x+y
    print(res)

sum_self(520,1314)

# 1834

5.3 空函数

当你只知道你需要。实现的某个功能,但是不知道如何使用代码实现时,你可以暂时写一个空函数,也就是函数体没有代码,但是我们函数不可以没有函数题,所以就用pass代替,跳过这个函数,先去实现其他的功能。

def func():
	pass

5.4 三种定义方式应用场景

  • 无参函数应用场景

用于无需外部传值的场景:

def add():
    x= float(input('num_x:'))
    y= float(input('num_y:'))
    res = x+y
    print(res)
add()
add()

# num_x:10
# num_y:10
# 20.0
# num_x:10
# num_y:20
# 30.0
  • 有参函数应用场景

用于需要接收外部传入值的场景

def add(x,y):
    res = x+y
    print(res)
add(10,20)
add(10,30)

# 30
# 40
  • 空函数应用场景

先进性构思,列出程序的骨架,然后补全

def login():
    pass

def shopping():
    pass

def exit():
    pass

六. 调用函数

6.1 什么是函数调用

函数名()就是函数的调用,会执行函数体代码,直到遇到return或执行完函数体内所有代码才结束

函数运行完毕所有代码, 如果函数体不写return,则会返回Nore

def a():
    pass

print(a())

# None

6.2 为什么用函数调用?

方便实用函数的功能,也可以当做参数使用4

6.3 函数调用的三种形式

def max_self(x,y):
    if x > y:
        return x
    else:
        return y
#第一种
max_self(1,2)
#第二种
res = max_self(1,2)*12
#第三种
max_self(max_self(20000,30000),40000)

七. 函数的返回值

return是函数结束的标志,即函数体一旦遇到return会立刻终止函数的运行并且会将return后面的值当做本次运行的结果返回

7.1 返回值为none:函数体没有返回值

def func():
    return
    #return none

7.2 返回一个值:return 值

def func():
    return  0

7.3 返回多个值

用逗号隔开多个值,会被return返回为元组的形式

def func():
    return 10,'a',[1,2,3]
res = func()
print(res,type(res))
# (10, 'a', [1, 2, 3]) <class 'tuple'>
posted @ 2020-03-17 19:38  祥SHAO  阅读(797)  评论(0编辑  收藏  举报