函数的基本使用(二)

函数的基本使用(二)

image

1、函数的返回值

  • 函数体代码没有return关键字,默认返回None

实例如下:

# 返回值
# 没有return关键字,返回None
def max(a,b):
    if a>b:
        print(a)
    else:
        print(b)


res = max(1,2)
print(res)
# 结果
2
None

  • 函数体代码只有关键字return,return后面没有跟返回值,默认也是返回None

实例如下:

# 返回值
# 有return关键字,return后面没有跟返回值,返回None
def max(a,b):
    if a>b:
        print(a)
    else:
        print(b)
    return 

res = max(1,2)
print(res)
# 结果
2
None

  • 函数体代码有关键字return,return后面跟了返回值,那么就会返回return后的值,如果return后面跟了多个返回值,返回值组织成为元组返回

实例如下:

# 返回值
# 函数体代码有关键字return,return后面跟了返回值,那么就会返回return后的值
# 跟了单个值
def max(a, b):
    if a > b:
        print(a)
    else:
        print(b)
    return '单个值'

res = max(1, 2)
print(res)
# 结果
# 2
# 单个值

# 跟多个值
def max(a, b):
    if a > b:
        print(a)
    else:
        print(b)
        #以元组的形式返回
    return '跟了','多个值'

res = max(1, 2)
print(res)

image


2、函数参数两大分类

① 参数的思维导图


image


② 函数参数的两大分类

  • 形式参数 -- 形参

    • 在函数定义阶段括号内所填的参数
  • 实际参数 -- 实参

    • 在函数调用阶段括号内所填的参数

    实例如下:

image

注意:形参的表现形式只有一种就是以变量名的形式出现,

而实参的表现形式可以有很多种(数值,表达式·····)


③ 位置参数

定义:按照从左往右顺序依次填入的参数

  • 位置形参
    • 在函数定义阶段括号内按照从左往右的顺序依次填入的变量名
  • 位置实参
    • 在函数调用阶段括号内按照从左往右的顺序依次填入的数据值

注意:位置形参与位置实参的位置一一对应,传参的时候不能多传入或者少传入

实例如下:

image


④ 关键字参数

  • 关键字参数只有实参赋值用

  • 在函数调用阶段通过形参名 = 数据值的形式使用

实例如下:

def max(a,b):
    if a>b:
        print(a)
    else:
        print(b)

# 调用
# 默认位置参数传值
max(4,2)
# 关键字实参
max(4,b=2)
max(b = 2,a = 4)
# 结果
4
4
4

# 位置参数必须在关键字参数前
# max(a=4,2) # 关键字实参在位置实参前报错
# SyntaxError: positional argument follows keyword argument

⑤ 默认参数

  • 默认参数只有默认形参

  • 该形参在函数调用阶段如果不给赋值,则使用函数定义形参时的默认参数。

  • 默认形参在调用阶段可以赋值,如果赋值就使用赋值的数据

  • 位置参数必须在默认参数前

实例如下:

# 默认参数
# 定义形参,name,age为位置形参,sex为默认参数
def login(name,age,sex ='male'):
    print(name,age,sex)

# 调用函数
# 调用函数不传入默认参数的时候
login('HammerZe',18)
# 结果
# HammerZe 18 male

# 调用函数传入默认参数的时候
login('HammerZe',18,'famale')
login('HammerZe',18,sex='shemale')
# 结果
# HammerZe 18 famale
# HammerZe 18 shemale

⑥ 可变长参数

函数无论传入多少位置参数都可以正常运行

可变长形参

① 第一种可变长形参:

  • 格式:
    • def fun(*args)
  • 定义:
    • 用于接收多余的位置参数,并组织成元组的形式赋值给*号后面的变量名

实例如下:

def info(name,age,*args):
    print(name,age,args)

info('HammerZe',18,'male','199****1234')
# 结果
HammerZe 18 ('male', '199****1234')

只能用于位置参数,关键字参数不能用*args来接收

② 第二种可变长形参:

  • 格式
    • def fun(**kwargs)
  • 定义
    • 用于接收多余的关键字参数,并组织成字典的形式赋值给**号后面的变量名

实例如下:

def info(name,age,**kwarg):
    print(name,age,kwarg)

info('HammerZe',18,sex = 'male',number ='199****1234')
# 结果
HammerZe 18 {'sex': 'male', 'number': '199****1234'}

③ 综合使用

实例如下:

def info(name,age,*args,**kwarg):
    print(name,age,args,kwarg)

info('HammerZe',18,
      'male',number ='199****1234')
# 结果
HammerZe 18 ('male',) {'number': '199****1234'}

注意!可变长形参定义格式* 和 * * 后面的变量名其实可以随便定义,但是在python中推荐使用 * args和 ** kwargs!!


可变长实参

① 第一种可变长实参:

  • 格式:

    • def fun(*args):

      fun( *list / *tuple)

  • 定义:*号在实参中的使用是将列表、元组的元素打散成位置参数的形式一一传值

实例如下:

def info(*args):
    print(args)
    
userinfo = ['HammerZe',18,'male','199****1234']
userinfo1 = ('HammerZe',18,'male','199****1234')
# 使用列表和元组都可以,输出的结果都为元组
info(*userinfo)
info(*userinfo1)
# 结果
('HammerZe', 18, 'male', '199****1234')
('HammerZe', 18, 'male', '199****1234')

① 第二种可变长实参:

  • 格式:

    • def fun( **kwargs ):

      fun(**dict)

  • 定义:**号在实参中使用会将字典内的键值对打散成关键字参数传入

实例如下:

def info(**kwargs):
    print(kwargs)

userinfo = {'name':'HammerZe','age':18,'sex':'male','numbers':'199****1234'}
# 使用字典被当作关键字参数传入,输出结果为字典
info(**userinfo)
# 结果
{'name': 'HammerZe', 'age': 18, 'sex': 'male', 'numbers': '199****1234'}

⑦函数参数补充

命名关键字参数

实例如下:

# 定义格式
def register(name,age,*,sex,number):
    print(name,age,sex,number)
    return name,age,sex,number

# 位置形参传参完成后的参数必须使用关键字实参传参
register('HammerZe',18,sex='male',number='199****1234')

# 不使用关键字参数传参报错
register('HammerZe',18,'male','199****1234')
#TypeError: register() takes 2 positional arguments but 4 were given

3、名称空间 -- namespaces

image


① 名称空间简介

  • 定义:用于存放变量名与变量值绑定关系的地方

  • 名称空间分类:

    内置名称空间:

    定义:python解释器提前定义好的

    实例如下:

print()/len()/range()·····

全局名称空间:

​ 定义 : 在py文件中顶格写的代码运行之后都会存入全局名称空间

实例如下:

name = 'HammerZe'
def fun():  # fun为全局名称
    pass
if True:
    a = 123   # a为全局
for i in range(10):
    print(i)    # i为全局
while True:
	a = 1      # a为全局

局部名称空间:

定义 : 函数体代码运行之后产生的都是局部名称空间

实例如下:

x = 1  # 全局
def fun(x):
    '''代码体'''
    x=123
    # 局部
    print(x)
fun(x)
# 全局
print(x)

# 结果
123 # 函数体的结果为局部x返回123
1    # 全局x 返回1

② 存活周期

  1. 内置名称空间

    python解释器启动与关闭而创建和销毁

  2. 全局名称空间

    随着python文件的运行与结束而创建和销毁

  3. 局部名称空间

    随着函数体代码的执行与结束而创建和销毁

③ 名字的查找顺序

  • 如果在局部查找:
    • 局部 → 全局 → 内置
  • 如果在全局查找:
    • 全局 → 内置

实例如下:

# 用len举例,来验证查找顺序
len = '全局名称'
def findname():
    len = '局部名称'
    print(len)
    
# 调用函数输出局部名称
findname()
# 全局名称
print(len)
# 结果
# 局部名称
# 全局名称

查找内置:

  • 找不到局部全局名称>>到局部

实例如下:

# 用len举例,来验证查找顺序
# len = '全局名称'
# def findname():
#     len = '局部名称'
#     print(len)
#
# 调用函数输出局部名称
# findname()
# 全局名称
print(len)
# 全部注释掉,最后查找的就是内置
#结果
<built-in function len>

局部名称空间特例:

  • 函数在定义阶段,名字的查找顺序就固定了!

  • 在哪个区间找名字输出的就是什么名称

  • 局部变量在赋值前被引用是错的,先定义后查找

实例如下:

def f1():   # f1为全局
    # 在f1下查找输出222
    x = 222
    def f2():
        # 在f2下查找输出333
        x = 333
        def f3():
            # 在f3下查找输出444
            x = 444
            def f4():
                # 在f4下查找输出555
                x = 555
                print(x)
                # x = 555  # 特例,局部变量在赋值前被引用是错的,先定义后查找
            f4()
        f3()
    f2()
# 通过调用f1()来查找
f1()

# 结果
555

函数思维导图:

image


image持续更新中······

posted @ 2021-11-15 19:25  HammerZe  阅读(45)  评论(0编辑  收藏  举报