函数进阶

知识点

函数返回多个值

1
2
3
4
5
6
7
8
9
# 利用元组可以使一个函数返回多个值,若返回的是元组,则可以省略元组左右两边的小括号
def measure():
temp = 2
test = 3
return temp, test # 调用此函数获得的结果乃是一个元组

# 如果函数返回的类型是元组,同时希望单独的处理元组中的数据
# 此时可以使用多个变量,一次接受函数的返回结果
temp, test = measure()

变量互换

1
2
# 利用元组可以直接互换变量的两个数据, 注意=右侧的表示的是一个元组
a, b = b, a

参数变更

1
2
3
4
5
6
7
8
9
10
11
12
13
# 在函数内部仅仅针对传递的变量进行赋值语句,其本质只是修改局部变量的引用,不会影响外部变量的引用
def demo(num, list_test):
# 内部重新赋值,只是修改了变量名的引用方式,并没有修改数据的内容
num = 2
list_test = [1,2,3]
# 此处输出的是2,[1,2,3]
print(num, list_test)

num = 1
list_test = [4, 5, 6]
demo(num, list_test)
# 此处输出的是1, [4, 5, 6]
print(num, list_test)
1
2
3
4
5
6
7
8
9
10
11
# 如果函数中传递的是可变类型的数据,且在函数内部修改了数据的内容,则其同样会影响到外部的数据
def demo(list_test):
# 此处通过方法向列表的引用位置追加了一个数据9,修改数据存储的内容
list_test.append(9)
# 此处输出的是[1,2,3]
print(list_test)

list_test = [4,5,6]
# 此处输出的是[4,5,6,9]
demo(list_test)
print(list_test)

+=运算符

1
# 在python中,列表变量调用+=本质上是在执行列表变量的extend方法,不会改变变量的引用

传递多值参数

1
2
3
4
# python中传递多值参数的方式:元组、字典
# 元组:参数名前添加一个*
# 字典:参数名前添加两个*
# 建议:传递元组时,形参写为:*args;传递字典时,形参写为:**kwargs
1
2
3
4
5
6
7
8
# 拆包:调用函数传递参数时,需要在对应的变量前加*
def demo(*args, **kwargs):
print(args)
print(kwargs)
tuple_list = (1,2)
dict_list = {"name":1,"class":2}
# 传递上面的多值参数时,需要拆包(加*)
demo(*tuple_list, **dict_list)

递归

1
# 递归:函数在函数内部调用自己,但是函数中一定要有判断条件,当符合条件时,不再执行函数,否则就出现了死循环
1
2
3
4
5
6
7
def add(i):
if i == 1:
return 1
return add(i - 1) + i


print(add(100))

作业

  1. 定义一个函数mess,接受两个变量:test, shuai,然后返回这两个变量的值

  2. (问答)针对第一题,如果需要单独处理函数返回值的变量值,请问如何接受函数mess的返回值

  3. 请在不适用第三方变量的情况下,互换a和b的变量值(两种方式)

  4. (问答)请问,在如下程序中,是否有更改主程序中num、list_test的变量值、结构

    1
    2
    3
    4
    5
    6
    7
    def demo(num, list_test):
    num = 2
    list_test = [1,2,3]

    num = 1
    list_test = [4, 5, 6]
    demo(num, list_test)
  5. (问答)请问,在如下程序中,是否有更改主程序中list_test的变量值、结构,并回答为什么?

    1
    2
    3
    4
    5
    def demo(list_test):
    list_test.append(9)

    list_test = [4,5,6]
    demo(list_test)
  6. (问答)列表元素使用+=方法,本质是进行了什么样的操作

  7. 定义一个函数,接受参数一个是元组:tuple_name,另一个是字典:dict_name,函数的功能是打印出接受的参数,然后通过调用函数,打印出如下信息:

    1
    2
    (1,2)
    {"name":1, "class":2}
  8. (问答)在传递多值参数时,如果是元组,建议用什么命名;如果是字典,建议用什么命名

  9. 编写程序,利用函数的递归,实现1-100之间所有整数的叠加和