手机版

Python——函数的几种形式还有多值递归拆包操作

时间:2020-05-05 来源:互联网 编辑:宝哥软件园 浏览:

一、函数的几种形式

1. 函数根据有没有参数和 返回值,可以组合成下面的四组

- 无参,无值
- 无参,有值
- 有参,有值
- 有参,无值

2.那么我们到底给那种呢?

我给出了如下的总结:

2.1 无参数,无返回值

此类函数,不接收参数,也没有返回值,应用场景如下:

只是单纯地做一件事情,例如 显示菜单 在函数内部 针对全局变量进行操作,例如:新建名片,最终结果 记录在全局变量 中

注意:

如果全局变量的数据类型是一个 可变类型,在函数内部可以使用 方法 修改全局变量的内容 —— 变量的引用不会改变 在函数内部,使用赋值语句 才会 修改变量的引用

2.2 无参数,有返回值

此类函数,不接收参数,但是有返回值,应用场景如下:

采集数据,例如 温度计,返回结果就是当前的温度,而不需要传递任何的参数

1.3 有参数,无返回值

此类函数,接收参数,没有返回值,应用场景如下:

函数内部的代码保持不变,针对 不同的参数 处理 不同的数据 例如 名片管理系统 针对 找到的名片 做 修改、删除 操作

2.4 有参数,有返回值

此类函数,接收参数,同时有返回值,应用场景如下:

函数内部的代码保持不变,针对 不同的参数 处理 不同的数据,并且 返回期望的处理结果 例如 名片管理系统 使用 字典默认值 和 提示信息 提示用户输入内容 如果输入,返回输入内容 如果没有输入,返回字典默认值

二、关于返回值

1.代码实例



def measuer():
    print("开始...")
    temp = 30
    wetness = 50
    print("结束...")
    #元祖可以使用多个数据,所以可以放回多个值
    # 如果函数返回的元祖,我们可以丢掉小括号
    return temp,wetness

result = measuer()

print(result)
# 单独的拿出来元素,但是不是恒方便
print(result[0])
# 我们可以使用多个变量一次接受返回自

gl_temp,gl_wetbess = measuer()
print(gl_temp)
print(gl_wetbess)

2.面试题 —— 交换两个数字

题目要求

有两个整数变量 a = 6, b = 100 不使用其他变量,交换两个变量的值

解法 1 —— 使用其他变量

# 解法 1 - 使用临时变量
c = b
b = a
a = c

解法 2 —— 不使用临时变量

# 解法 2 - 不使用临时变量
a = a + b
b = a - b
a = a - b

解法 3 —— Python 专有,利用元组

a, b = b, a

三、函数的参数 进阶

1.不可变和可变的参数

注意哈,我们这里的知识和之前说过的变量有关!

问题 1:在函数内部,针对参数使用 赋值语句,会不会影响调用函数时传递的 实参变量? —— 不会!

无论传递的参数是 可变 还是 不可变 只要 针对参数 使用 赋值语句,会在 函数内部 修改 局部变量的引用,不会影响到 外部变量的引用
def demo(num, num_list):

    print("函数内部")

    # 赋值语句
    num = 200
    num_list = [1, 2, 3]

    print(num)
    print(num_list)

    print("函数代码完成")


gl_num = 99
gl_list = [4, 5, 6]
demo(gl_num, gl_list)
print(gl_num)
print(gl_list)
    

问题 2:如果传递的参数是 可变类型,在函数内部,使用 方法 修改了数据的内容,同样会影响到外部的数据

def mutable(num_list):

    # num_list = [1, 2, 3]
    num_list.extend([1, 2, 3])
    
    print(num_list)

gl_list = [6, 7, 8]
mutable(gl_list)
print(gl_list)

2. 面试题 —— +=

python 中,列表变量调用 += 本质上是在执行列表变量的 extend 方法,不会修改变量的引用
def demo(num, num_list):

    print("函数内部代码")

    # num = num + num
    num += num
    # num_list.extend(num_list) 由于是调用方法,所以不会修改变量的引用
    # 函数执行结束后,外部数据同样会发生变化
    num_list += num_list

    print(num)
    print(num_list)
    print("函数代码完成")


gl_num = 9
gl_list = [1, 2, 3]
demo(gl_num, gl_list)
print(gl_num)
print(gl_list)

3. 缺省参数

所谓的缺省,实际上,你可以理解为,默认值

调用函数时,如果没有传入 缺省参数 的值,则在函数内部使用定义函数时指定的 参数默认值 函数的缺省参数,将常见的值设置为参数的缺省值,从而 简化函数的调用 例如:对列表排序的方法
gl_num_list = [6, 3, 9]

# 默认就是升序排序,因为这种应用需求更多
gl_num_list.sort()
print(gl_num_list)

# 只有当需要降序排序时,才需要传递 `reverse` 参数
gl_num_list.sort(reverse=True)
print(gl_num_list)
关于缺省参数需要注意的事情:
```md

首先,参数使用赋值语句,可以指定为缺省值(默认值)
比如这个的代码
def print_info(name, gender=True):

必须保证 带有默认值的缺省参数 在参数列表末尾

在 调用函数时,如果有 多个缺省参数,需要指定参数名,这样解释器才能够知道参数的对应关系!

以下是具体的代码案例

def print_info(name, title="", gender=True):
    """

    :param title: 职位
    :param name: 班上同学的姓名
    :param gender: True 男生 False 女生
    """

    gender_text = "男生"

    if not gender:
        gender_text = "女生"

    print("%s%s 是 %s" % (title, name, gender_text))


# 提示:在指定缺省参数的默认值时,应该使用最常见的值作为默认值!
print_info("小明")
print_info("老王", title="班长")
print_info("小美", gender=False)

3.多值参数

如何定义一个多值参数?
def demo(num, *args, **kwargs):

    print(num)
    print(args)
    print(kwargs)


demo(1, 2, 3, 4, 5, name="小明", age=18, gender=True)
我们希望这个函数能够处理的参数的个数不确定的时候,我们就可以用的上了 Python中的多值参数,有两种 参数名前增加 一个 * 可以接收 元组 参数名前增加 两个 * 可以接收 字典 一般在给多值参数命名时,习惯使用以下两个名字 *args —— 存放 元组 参数,前面有一个 * **kwargs —— 存放 字典 参数,前面有两个 *

4. 元祖和字典的拆包

def demo(*args, **kwargs):

    print(args)
    print(kwargs)


# 需要将一个元组变量/字典变量传递给函数对应的参数
gl_nums = (1, 2, 3)
gl_xiaoming = {"name": "小明", "age": 18}

# 会把 num_tuple 和 xiaomin, gl_xiaoming)
demo(*glg 作为元组传递个 args
# demo(gl_nums_nums, **gl_xiaoming)

它主要完成的是以下的任务:希望将一个元组/字典变量直接传递给args/kwargs

递归函数,

其实这个是一种算法。详见我的博客,算法分类

版权声明:Python——函数的几种形式还有多值递归拆包操作是由宝哥软件园云端程序自动收集整理而来。如果本文侵犯了你的权益,请联系本站底部QQ或者邮箱删除。

相关文章推荐