Python基础知识:函数

函数

领取Python学习资料可以加小编的微信:TZ20200688


函数如果返回的是一个元组就可以省略括号;
如果返回的是一个元组,可以使用多个变量直接接收函数的返回结果;(注意变量的个数和返回的元组的个数相同)
例如:

def measure():
    """测量湿度和温度"""
    temp = 39
    wetness = 50

    # 下面返回的是一个元组,为什么写成没有括号的样子,因为如果返回的是一个元组就可以省略括号
    # return (temp, wetness)
    return temp, wetness


res = measure()
print(res)
print(type(res))  # tuple


# 很骚的,直接使用多个变量接收函数返回的元组
gl_temp, gl_wetness = measure()
print(gl_temp)
print(gl_wetness)


交换两个变量a、b的值的三种解法(第三种python专用)
a = 6
b = 100

# 解法1
c = a
a = b
b = c
print(a)
print(b)

# 解法2

a = a + b
b = a - b
a = a - b
print(a)
print(b)

# 解法3 python专用
# a, b = (b, a)
a, b = b, a
print(a)
print(b)


如果在函数中使用赋值语句,并不会影响调用函数时传递的实参变量;无论传递的参数可变还是不可变;
只要针对参数使用赋值语句,会在函数内部修改局部变量的引用,不会影响到外部变量的引用;
测试:

def demo(num, num_list):
    print("函数内部的代码")

    num = 100
    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)  # 99
print(gl_list)  # [4, 5, 6]

输出:

函数内部的代码
100
[1, 2, 3]
函数执行完成
99
[4, 5, 6]

一张图解释:

Python基础知识:函数

如果传递的参数是可变类型,在函数内部,使用方法修改了数据的内容,同样会影响到外部的数据。
def demo(num_list):
    print("函数内部的代码")
    num_list.append(666)
    print(num_list)
    print("函数代码执行结束")


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


输出:

 

函数内部的代码
[1, 2, 3, 666]
函数代码执行结束
[1, 2, 3, 666]


示意图:

Python基础知识:函数

上面写了,这里再重复一遍可变类型和不可变类型和参数传递的关系:

不可变类型:类似 c++ 的值传递,如 整数、字符串、元组。如fun(a),传递的只是a的值,没有影响a对象本身。比如在 fun(a)内部修改 a 的值,只是修改另一个复制的对象,不会影响 a 本身。
可变类型:类似 c++ 的引用传递,如 列表,字典。如 fun(la),则是将 la 真正的传过去,修改后fun外部的la也会受影响;


列表变量调用 += 的时候相当于是调用extend,这个是一个特列;


def demo(num, num_list):
    print("函数开始")

    # 赋值语句 不会改变外部
    num += num

    # 但是列表是一个特例,+=列表相当于 extend 所以会改变外部
    num_list += num_list
    # 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)


输出:

 

函数开始
18
[1, 2, 3, 1, 2, 3]
函数结束
9
[1, 2, 3, 1, 2, 3]


缺省参数: ①定义函数时,可以给某个参数指定一个默认值,指定了默认值的参数叫做缺省参数;②一般使用最常见的值作为缺省参数;③缺省参数的定义位置:必须保证带有默认值的缺省参数定义在参数列表的末尾;


def print_info(name, gender=True):
    gender_text = "男生"
    if not gender:
        gender_text = "女生"
    print("%s 是 %s" % (name, gender_text))

print_info("小明")  # 缺省参数 使用最常见的值,作为缺省参数
print_info("小美", False)


还要注意,如果后面有多个参数,且只给具体的某一个指定默认值,就要具体的指定参数的名字:

def print_info(name, title="", gender=True):
    gender_text = "男生"
    if not gender:
        gender_text = "女生"
    print("%s 是 %s" % (name, gender_text))

print_info("小明") 
print_info("小美", False)  # 这个是错误的
print_info("小美", gender=False)  # 这里必须指定为gender


输出:

Python基础知识:函数

 

这个原理类似降序排序:

gl_list = [6, 3, 9]
gl_list.sort(reverse=True)
print(gl_list)


多值参数

Python基础知识:函数

def demo(num, *args, **kwargs):  # 多值参数 *接收元组 **接收字典
    print(num)
    print(args)
    print(kwargs)


demo(1, 2, 3, 4, 5, name="小明", age=18)


输出:

1
(2, 3, 4, 5)
{'name': '小明', 'age': 18}


使用多值参数的好处,例如下面的例子计算求和,如果不使用* args 也就是不使用多值的元组的时候,我们传递参数的时候就需要传递一个元组,但是这样的话就直接传递一串数字就好了。

def sum_number(*args):
    res = 0
    for n in args:
        res += n
    return res


print(sum_number(1, 2, 3, 4, 5))
# print(sum_number((1, 2, 3, 4, 5)))  # 如果不加上*的话就要加上这个表示元组的括号


多值参数元组和字典的拆包

Python基础知识:函数

 

首先看下面代码的输出,这个代码是出乎意料的:

def demo(*args, **kwargs):
    print(args)
    print(kwargs)


gl_tuple = (1, 2, 3)
gl_dict = {"name": "小明", "age": 18}

demo(gl_tuple, gl_dict)


输出:

 

((1, 2, 3), {'name': '小明', 'age': 18})
{}


加上拆包:

def demo(*args, **kwargs):
    print(args)
    print(kwargs)


gl_tuple = (1, 2, 3)
gl_dict = {"name": "小明", "age": 18}

demo(*gl_tuple, **gl_dict)  # 注意这里加上了拆包 类似与之前的传递参数

输出:

(1, 2, 3)
{'name': '小明', 'age': 18}
 

领取Python学习资料可以加小编的微信:TZ20200688