函数

1、什么是函数?

  在程序中,函数就是具备某一功能的工具。

  事先将工具准备好即函数的定义。

  遇到应用场景拿来就用即函数的调用。

2、为什么要用函数?

  不用函数的问题是:

    1、程序代码冗长

    2、程序的可扩展性差

    3、程序的可读性差

3、如何用函数?

函数的定义语法:

没有事先定义函数,而直接引用函数名,就相当于在引用一个不存在的变量名。

函数定义阶段不执行函数体代码,但是会检测函数体的语法。

定义函数的三种形式:

无参函数:在函数定义阶段括号内没有参数。

有参函数:在函数定义时括号内有参数的称之为有参函数。

形参和实参:

形参:在函数定义阶段括号内定义的参数,称之为形式参数,简称形参。本质就是变量名,等待外部给它传值。

实参:在函数调用阶段括号内传入的值,称之为实际参数,简称实参。本质就是变量的值,函数调用时生效。

位置形参:在函数定义阶段,按照从左往右的顺序依次定义的形参,称之为位置形参。

特点:但凡是按照位置定义的形参,都必须被传值,多一个不行,少一个也不行。

位置实参:在函数调用阶段,按照从左往右的顺序依定义的实参,称之为位置实参。

特点:按照位置为对应的形参依次传值。

关键字实参:在调用函数时,按照key=value的形式为指定的参数传值,称之为关键字实参。

特点:可以打破位置的限制,但仍然能为指定的形参赋值。

注意:

  • 可以混用位置实参和关键字实参,但位置实参必须放在关键字实参的前面。
  • 可以混用,但不能对一个形参重复赋值。

默认形参:在函数定义阶段,就已经为形参赋值。一般情况下这个值在大部分情况下都是一样的,可以把这个值定义为默认形参。

特点:在定义阶段就已经被赋值,意味着在调用阶段可以不用为其赋值。

参数总结:

默认形参必须放到位置形参的后面。

默认形参的值只在定义阶段赋值一次,即默认参数的值在函数定义阶段就已经固定死了。

默认参数的值通常应该定义不可变类型(整型,浮点型,字符串,元组)。

实参的应用取决于习惯。

形参的使用,在大多数情况下的调用值都一样,就应该将这个值定义为默认形参。

空函数:函数体代码只写一个pass占位符。

# 空函数
def func2():
    pass

函数的调用:

函数调用阶段,执行函数体代码。

函数调用的三种形式:

  • 函数名(),有参传参数集即可。
  • 表达式形式。
  • 把函数的调用当做一个参数传给另一个函数。
# 调用函数:函数名(),会执行函数体代码,直到碰到return结束或者一直运行完毕所有的代码。
def max2(x,y):
    if x > y:
        return x
    else:
        return y
# 函数名()
max2(100,180)
#表达式形式。
res1 = max2(100,180) * 8

#把函数的调用当做一个参数传给另一个函数。
# res2 = max2(100,180)
# max2(res2,300)
max2(max2(100,180),300)

 

可变长参数:指的是在调用函数时,传入的参数个数可以不固定。

 

4、函数的返回值

什么是返回值?

为什么要有返回值?

def max2(x,y):      #x = 2000   y = 2700
    if x > y:
        return x    #return 2000
    else:
        return y    #return 2700
# 赋值给一个变量
res = max2(2000,2700)
# 如果需要在程序中拿到函数的处理结果做进一步处理,则需要函数必须要有返回值。
annual_salary = res * 12
print(annual_salary)

如何用函数的返回值?

# return 任意类型的数据类型。
# 1、返回值是函数的处理结果,值可以是任意的数据类型。
# 2、return是函数终止的标志。函数内可以有多个return,但只要执行一次,整个函数都会结束执行。
# 3、return的返回值无个数限制,返回1个(返回的值即值本身),返回0个(返回的值是None,不写return默认返回None),返回多个要用逗号分隔开(返回的值是元组类型)。
def check_name():
    while True:
        name = input("请输入要注册的账户名:").strip()
        if name.isalpha():
            return name
        else:
            print("用户名必须由字母组成!请重新输入!")

# u_name = check_name()
# print(u_name)
# 请输入要注册的账户名:zrg
# zrg

# 比较大小
# def max2(x,y):
#     if x > y:
#         print(x)
#     else:
#         print(y)


def max2(x,y):      #x = 2000   y = 2700
    if x > y:
        return x    #return 2000
    else:
        return y    #return 2700
# 赋值给一个变量
res = max2(2000,2700)
# 如果需要在程序中拿到函数的处理结果做进一步处理,则需要函数必须要有返回值。
annual_salary = res * 12
print(annual_salary)

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

函数的高级知识

一、函数对象

  函数是第一类对象,其含义是函数可以被当做数据处理。

  定义一个函数发生的事

  1.     开辟一个内存空间
  2.     把函数体代码放进去
  3.     然后把内存地址赋值给函数名
# 定义一个函数发生的事:
def func():   # <function func at 0x102567f40>
    print('from func')
# print(func)
# <function func at 0x102567f40>

 

a.  被引用 

b.  当做参数传给一个函数

c.  当做函数的返回值

d.  可以当做容器类型的元素 

# a.引用 
# f = func
# f()
# from func
# b.当做参数传给一个函数
# def foo(x):
#     print(x)
#     x()


# foo(func)
# <function func at 0x100d13f40>
# from func
# c.当做函数的返回值
def foo(x):
    return x


# res = foo(func)
# print(res)
# res()
# <function func at 0x103027f40>
# from func
# d.可以当做容器类型的元素
l = [func]
print(l)
l[0]()
# [<function func at 0x1024abf40>]
# from func

 

 

二、函数嵌套

1、函数的嵌套定义

2、函数的嵌套调用

 

三、名称空间与作用域

1、名称空间 namespaces

  存放名字与值的绑定关系的地方。

内置名称空间:

  作用:存放Python解释器自带的名字。

  生命周期:在解释器启动时生效,在解释器关闭时失效。

全局名称空间:

  作用:除了内置和局部的名字外,其余的都是全局的名字。

  生命周期:在文件执行时生效,在文件执行完毕后失效。

局部名称空间:函数内定义的名字。函数调用时才临时生效一次,函数调用完了之后就释放掉了。

  作用:用于存放函数调用期间函数体产生的名字。

  生命周期:在文件执行过程,如果调用了某个函数才会临时生效,在函数执行完毕后失效。

 

作用域

  域指的是区域、范围,作用域即作用范围。 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

                                                                                  张仁国

posted @ 2022-09-08 14:55  张仁国  阅读(255)  评论(0编辑  收藏  举报
目录代码