2019-08-01_Note_Day9

一、函数概论

1. 什么是函数

函数就是对实现特定功能代码的封装

2. 函数的分类

系统函数(内置函数):系统已经声明好的函数(类似已经造好的机器),程序员只要求会使用
例如print、input、sum、max、min、hex、len、id、type等
自定义函数:程序员自己声明的函数(自己造机器)

3. 声明函数

1)语法:

def 函数名(形参列表):
    函数说明文档
    函数体

2)说明:

def:python中声明函数的关键字(固定写法)
函数名:与对变量名的要求相同
(): - 固定写法
形参列表:以'变量名1, 变量名2, 变量名3,...'的形式存在,每个变量都是形参

形参的个数根据情况可以没有,也可以有多个
形参的作用是将函数外面的数据传递到函数里面

函数说明文档:用三个双引号引起来的字符串;作用是对函数的功能进行说明
函数体:与def保持一个缩进的一行或多行语句;作用是实现函数的功能

3)初学者声明函数的步骤:

a. 确定函数的功能
b. 根据函数功能确定函数名
c. 确定函数的参数:根据实现函数的功能决定是否需要从外界传值
d. 实现函数的功能
e. 确定函数的返回值

注意(重要!!!):声明函数时不会执行函数体
# 写一个函数,求两个数的和并打印
def my_sum(num1, num2):
    """
    求两个数的和
    :param num1: 数字1
    :param num2: 数字2
    :return: num1 + num2
    """
    while num2:
        num1, num2 = num1 ^ num2, (num1 & num2) << 1
    return num1

4. 函数调用的介绍

1)语法:

函数名(实参列表)

2)说明:

函数名:已经声明过的函数名
():固定写法
实参列表:以'值1, 值2, 值3,...'的形式存在

每个值都是实参,实参是用来给形参赋值的


二、函数的调用

1. 函数调用过程

1)语法

函数名(实参列表)

2)调用函数的作用:执行函数体;获取返回值

3)函数调用过程:

第一步:跳转到函数声明的位置
第二步:传参用实参给形参赋值,保证每个形参都有值)
第三步:执行函数体
第四步:执行完函数体,确定返回值

a. 执行完函数体:函数体对应的语句执行完;执行函数体的时候遇到return
b. 确定函数体:看函数执行结束的时候有没有遇到return,如果遇到return后面的值就是返回值,没有遇到返回值为None

第五步:回到函数调用位置继续执行(这个时候函数调用表达式的值才是函数的返回值)

# 声明一个函数,求实现1 + 2 +3 +...+ N的和


def sum_n(n):
    """
    实现1 + 2 +3 +...+ n的和
    :param n: 累加最大值
    :return: 1 + 2 +3 +...+ n的和
    """
    return sum(i for i in range(1, n + 1))


# 声明一个函数,打印字符串中所有的字母字符


def get_alpha(strs):
    """
    打印字符串中所有的字母字符
    :param strs: 原字符串
    :return: 字符串中的字母字符串
    """
    return ''.join(char for char in strs if 'A' <= char <= 'Z' or 'a' <= char <= 'z')


# 声明一个函数,在指定的字符串的数字字符后都添加一个指定字符
# 'abc123', '*' --> 'abc1*2*3*'
# 'h2wo4end', '=' --> 'h2=wo4=end'


def append_to_digit(strs, sign):
    """
    在指定的字符串的数字字符后都添加一个指定字符
    :param strs: 原字符串
    :param sign: 指定字符
    :return: 处理后的字符串
    """
    # new_str = ''
    # for char in strs:
    #   if char.isdigit():
    #       new_str += char + sign
    #   else:
    #       new_str += char
    # return new_str
    return ''.join(char + sign if char.isdigit() else char for char in strs)

三、函数的实参和形参

1. 位置参数和关键字参数(针对实参)

1)位置参数:让实参和形参在位置上一一对应

第一个实参给第一个形参赋值,第二个实参给第二个形参赋值...

2)关键字参数:以'形参名=值'的形式传参

注意:位置参数和关键字参数可以同时使用,但要求位置参数必须在关键字参数之前

3)什么时候使用关键字参数

需要跳过前面某几个参数,直接给后面某个参数赋值必须使用关键字参数
def func1(a, b, c):
    print('a:{}, b:{}, c:{}'.format(a, b, c))


# 位置参数传参
func1(10, 20, 30)  # a:10, b:20, c:30

# 关键字参数传参
func1(a=100, b=200, c=300)  # a:100, b:200, c:300
func1(a=100, c=300, b=200)  # a:100, b:200, c:300

# 位置参数和关键字参数同时使用
func1(10, c=30, b=20)  # a:10, b:20, c:30

2. 参数默认值(形参)

声明函数时,形参可以设置默认值,有默认值的参数在函数调用时可以不用传参
一个函数可以给所有的参数都设置默认值,也可以给部分参数设置默认值
注意:必须保证没有默认值的参数放在有默认值参数的前面
def func2(x=11, y=22, z=33):
    print('x:{}, y:{}, z:{}'.format(x, y, z))


func2(100, 200, 300)  # x:100, y:200, z:300
func2(100)  # x:100, y:22, z:33
func2(100, 200)  # x:100, y:200, z:33
func2()  # x:11, y:22, z:33
func2(100, z=300)  # x:100, y:22, z:300

3. 参数类型说明

1)给参数赋默认值,默认值的类型就是参数的类型

2)以'参数名: 类型名'的形式声明函数


4. 不定长参数

1)在形参前加*,那么这个参数就可以接收多个实参

带*的参数会作为一个元组,对应的多个实参是元组中的元素

2)在形参前加**,那么这个参数就可以接收多个实参

关键字参数,关键字随便命名
带**的参数会作为一个字典,对应的关键字参数的关键字作为key,实参作为value
def func6(x, y, *nums):
    print(x, y, nums)


func6(1, 2, 3, 4, 5, 6, 7)  # 1 2 (3, 4, 5, 6, 7)


def func7(**nums):
    print(nums)


func7(a=1, b=2, x=4)  # {'a': 1, 'b': 2, 'x': 4}
*args**kwargs同时使用,是为了保证不定长参数传参的时候,既可以使用位置参数,也可以使用关键字参数
def func8(*args, **kwargs):
    print(args, kwargs)


func8(1, 23)  # (1, 23) {}
func8(a=2, c=90, k=34)  # () {'a': 2, 'c': 90, 'k': 34}
func8(2, 4, x=2, y=89)  # (2, 4) {'x': 2, 'y': 89}

补充:

*的用法:序列解包(取出列表/元组中的元素,字典取key值)
list1 = [98, 90, 89]
print(*list1)  # 98 90 89


def func9(x, y):
    print(x, y)


func9(1, 2)
list1 = [10, 20]
func9(*list1)
**的用法:字典解包(取出字典中的元素)
def func8(*args, **kwargs):
    print(args, kwargs)


func8(**{'a': 1, 'b': 2})  # () {'a': 1, 'b': 2}
练习
# 声明一个函数,求多个数的差
# subtract(1, 2) --> -1     subtract(10, 2, 3) --> 5
def subtract(*nums):
    if not nums:
        return 0
    return nums[0] - sum(nums[1:])


a = subtract(10, 20, 30)
print(a)  # -40

四、函数的返回值

1. 什么是返回值

返回值就是return关键字后表达式的值(怎么确定函数的返回值)
返回值就是函数调用表达式的值(怎么获取函数的返回值)
python中所有函数都有返回值,默认是None

1)什么是return

return是函数体中的关键字(只能在函数中使用)
作用有两个:结束函数/确定函数返回值
a. 结束函数
def func1():
    for x in range(10):
        if x == 2:
            return
        print(x)
    print('里面:函数结束')


# 0
# 1
func1()
b. 确定函数返回值:return 返回值(可以是具体的数据、声明过的变量、运算表达式等)

2)什么是函数调用表达式

函数调用语句就是函数调用表达式,例如:func1(10), max([1, 2])
每个函数调用的语句都有一个结果,这个结果就是这个函数执行后的结果
def func4():
    return 100


print('func4:', func4())  # func4: 100

2. 怎么使用返回值

想要用函数的返回值,就使用函数调用表达式的值
普通数据能做的事情,函数调用表达式都可以做
list1 = [100, 200]
list2 = [func4(), 200]
print(list1, list2)  # [100, 200] [100, 200]

print(100 > 200)  # False
print(func4() > 200)  # False
print(func4() * 2)  # 200

3. 什么时候需要返回值

初学者:看实现函数的功能会不会产生新的数据
return 返回值1, 返回值2,... 

你可能感兴趣的:(2019-08-01_Note_Day9)