5.1Python函数(一)

目录

前言

分模块思想,分任务编程,是编程的一大重要思维,其中的实现,函数就担当了一个重要角色,今天我们就来学习Python的初级函数。

(一)函数的基本知识

(1)函数的优点

  1. 体积小,减少内存大小,冗余度小。
  2. 重用性强,可重复利用。
  3. 维护方便。
  4. 分解任务,简化逻辑,使代码更加模块化。

(2)函数的分类

  1. 内建函数
  2. 三方函数
  3. 自定义函数

(二)函数的基本使用

1.函数的简单定义

(1)语法说明

def 函数名():

​ 函数体

(2)源代码

# 定义一个简单函数
def test():
    print(2**2)
    print(2**3)
    print(2**4)

# 调用函数
test()

(3)输出效果

01.png

2.传值函数

(1)语法说明

定义语法:

def 函数名(var1,var2,……)

​ 函数体

调用的时候,有两种方式:

  1. 顺序调用,要求实参与形参一一对应。
  2. 关键字调用,可以不按照顺序调用。

(2)源代码

# 定义一个带参数的函数
def test(var1, var2):
    print(var1+var2)
    print(var1**2+var2**2)
    print(var1**3+var2**3)


# 顺序调用带参数的函数
print("顺序调用")
test(1, 2)

# 关键字调用带参数函数
print("关键调用")
test(var2=2, var1=1)

(3)输出效果

02.png

3.不定长函数

(1)语法说明

当形参为下面两种形式的时,为不定长参数

  1. *args --- 接收为元组类型, 只要使用星号就可以,名字没关系,习惯用args而已。
  2. **kwargs ---接收为字典类型。其传值时,必须是关键字传值。

注意:装包与拆包

  1. 装包:args与kwargs 就是表示整个元组与字典的整体,叫装包
  2. 拆包:*args 与 **kwargs 表示元组和字典的每个元素,叫拆包

(2)源代码

# 定义不定长的参数- *args 接收的是元组类型
def test1(*args):
    print(args, type(args))
    print(*args)


# 定义不定长的参数- *args 接收的是字典类型
def test2(**kwargs):
    print(kwargs, type(kwargs))
    # 输出keyword
    print(*kwargs)
    # 使用value,不能打印出来,不过可以使用
    # 而且形参与实参的keyword一样,其实就是关键字调用
    test3(**kwargs)


def test3(a, b, c):
    print(a)
    print(b)
    print(c)


# 调用参数,并接收的是 元组
test1(1, 2, 3)

# 调用参数,并接收的是 字典
test2(a="zsj", b=18, c="m")

(3)输出效果

03.png

4.缺省函数

(1)语法说明

在定义函数的时候,给形参赋值,就是缺省函数,所赋的值便是默认值,

def test(name="me")

而在调用的时候,可以传入参数,也可以不传入参数。

传入参数时,以所传的参数优先。

不传入参数时,为默认值。

(2)源代码

# 定义缺省参数
def test(name="zyg"):
    print(name)


# 不传入参数, 默认值
test()
# 传入参数,优先值是传入的值
test("me")

(3)输出效果

04.png

5.函数的传值过程

(1)语法说明

在python里函数的传值:都是引用传递

  1. 值传递(从实参复制一个副本)传递给形参
  2. 引用传递(直接把实参的id)传给形参

Python的可变数据类型与不可变数据类型

  1. 可变数据类型:value值改变,id值不改变。(列表,字典)
  2. 不可变类型:value值改变,id值随之改变。(数值类型,字符串类型,布尔类型,元组类型)

Python里函数是否可以改变实参内容问题

  1. 若实参是可变数据类型,则可以实参内容
  2. 若实参是不可变数据类型,则不可以实参内容

(2)可变类型的实例

# 定义一个函数,用id()来判断其是值传递,还是地址传递?

def test(num):
    print(id(num))
    num[1] = 5
    print(num)
    print(id(num))

list1 = [1, 2, 3]
print(id(list1))
test(list1)
print("最后的id", id(list1))
print("最后的值", list1)

05.png

(3)不可变类型的实例

# 定义一个函数,用id()来判断其是值传递,还是地址传递?


def test(num):
    print(id(num))
    num = 5
    print(num)
    print(id(num))


number = 1
print(id(number))
test(number)
print("最后的id", id(number))
print("最后的值", number)

06.png

6.具有返回值函数

(1)语法说明

当我们需要函数处理过后,返回一个结果值。可以使用

return 结果值

结果值:可以是元组类型,列表类型,拆包后的数据

(2)源代码

# 定义一个具有返回值的函数

def test(a, b):
    mysum = a + b
    mysub = a - b
    return (a, b)


n1 = 4
n2 = 2
sum_1, sub_1 = test(n1, n2)
print(sum_1)
print(sub_1)

(3)输出效果

07.png

7.函数的使用说明

(1)说明:

函数的说明都有一个标准的写法,才能调用help查看

def 函数名():

​ """

​ 功能:xxxxx

​ var1:

​ var2:

​ ....

​ return xxxx

​ """

查看帮助可以用:help(函数名) ,注意是函数名,不是函数调用。

(2)源代码

# 定义一个具有返回值的函数
def test(a, b=1):
    """
        功能:该函数实现两个值的加减,并返回结果。
    :param a: 参与运算的一个值,数字类型,不可选,无默认值
    :param b: 参与运算的另一个值,数字类型,可选,默认值为1
    :return: 和与差的结果,元组类型。例如 (1, 2)
    """
    mysum = a + b
    mysub = a - b
    return (a, b)


# 查看帮助
help(test)

(3)输出效果

08.png

作者:Mark

日期:2019/02/02 周六

posted @ 2019-02-02 12:45  梦并不遥远  阅读(451)  评论(0编辑  收藏  举报