Day_09-函数(一)

一、认识函数

1.什么是函数?
定义:对实现某一特定功能的代码段的封装
使用函数就是使用这个函数里面的代码段

2.函数的分类
系统函数:系统已经定义好的函数,我们直接调用函数使用函数的功能
自定义函数:需要程序员自己定义的函数

3.函数的定义 (好比是制造机器)
a.语法
def 函数名(参数列表):
   函数体
b.说明
def:声明函数的关键字
函数名:标识符,不能是关键字
pep8命名规范,见名知义(看到函数名大概知道函数功能)
():固定格式
参数列表:参数1,参数2,参数3...;这里参数叫做形参,定义时形参就是变量
作用:将函数外面的数据从外面传递到函数里面
:固定格式
完整函数体
1.函数说明文档
2.实现函数功能的代码段
3.函数返回值

c.初学者申明函数的步骤
第一步:确定函数的功能
第二步:根据功能确定函数名
第三步:确定形参(确定参数是否需要和几个),实行函数的功能需不需要从外面传值进来,以及需要传几个
第四步:实现函数的功能
第五步:确定函数返回值

(重点!!!)注意:函数声明时,并不会执行函数体!
只有在调用的时候才会执行

4.函数的调用 (好比是使用机器)
a.语法
函数名(实参列表)
b.说明
函数名 - 已经声明过的函数
():固定写法
实参列表:实参是来给形参赋值(用实参给形参赋值的过程加传参),实参和形参要一一对应
c.调用过程(重点!!!)
第一步:回到函数声明的位置
第二步:用实参给形参赋值(传参)
第三步:执行函数体
第四步:执行完函数体,就确定并返回返回值
第五步:回到函数调用的位置,接着执行后面的其他代码
示例:

# 求两个数的和
def sum_two(num1, num2):
    """
    求两个数的和(函数功能进行说明)
    :param num1:(第一个数进行说明)
    :param num2:(第二个数进行说明)
    :return:无(返回值进行说明)
    """
    print(num1 + num2)
# 调用函数
sum_two(10, 20)  # 30

猜数字游戏

# 练习3:声明一个函数,函数功能是猜数字游戏:随机产生一个0-100的数字,用户不断输入数字,
#直到输入的数字和产生的数字一样游戏就结束,当猜错了,可以给出'大了/小了'这样的提示


# 导入random模块
"""
randint(m,n) - 产生一个m到n的随机整数
"""
# num = random.randint(0, 100)
# print(num)


def guess_num():
    import random
    num = random.randint(0, 100)
    count = 0
    while True:
        n = int(input('请输入数字:'))
        count += 1
        if n > num:
            print('真遗憾,大了,在小一点')
            continue
        elif n < num:
            print('真遗憾,小了,在大一点')
            continue
        else:
            print('猜对了!!!')
            if count > 10:
                print('正常人')
            # 结束游戏
            break


guess_num()

二、参数类型

1.位置参数和关键字参数(根据实参的传递方式分类)
a.位置参数:实参的位置和形参保持一致,按形参先后顺序一一赋值
b.关键字参数:调用函数的时候以 形参=实参的方式来传参,
这个时候顺序无所谓

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


# 通过位置参数给形参赋值
func1(10, 20, 49)


# 通过关键字参数给形参赋值
func1(a=10, b=20, c=49)

# 通过位置参数和关键字参数结合传参
# (关键字参数必须在位置参数后面),不然会报错
func1(10, 20, c=20)

2.参数默认值
说明
声明函数时,可以给参数赋默认值。
如果一个形参有默认值,调用函数时,可以不用传参

注意
a.如果有的形参有默认值,有的没有,那么有默认值的形参要放在没有默认值的形参的后面
b.调用函数要保证每个参数都有值!

# 参数c有默认值,调用函数c可以不用传参
def func2(a, b, c=0):
    print(a, b, c)


func2(10, 20, 400)  # 10 20 400
func2(100, 32)  # 100 32 0

3.参数的类型
说明:类型说明只有提示功能,没有约束功能

a.给参数设置默认值,默认值的类型就是参数值的类型
b.形参后面加:类型名,来说明参数类型。这种方式调用必须传参
c.函数声明的时候在()后面加 —>类型名,来说明函数返回值的类型

类型说明的好处
a.对实参的类型进行说明指导
b.实现函数功能的时候,有类型相关的语法提示

def list_item(list1: list, index=0)->int:  # int对返回值类型进行说明
    print(list1[index])
    return 10


list_item([2, 23])


def func4(a: list, b: str):
    a.append(b)

4.不定长参数
说明:函数参数个数不确定
a.声明函数的时候,在参数名前加 *,可以同时用来获取多个实参的值
实质:将带*号的参数变成元祖,将多个实参的值作为元祖的元素
b.在参数名前加两个,必须是关键字传参,会将这个参数变成一个字典*来获取关键字参数的值,其他关键字作为KEY,实参作为value

注意:a.如果函数中既有不定长参数,又有普通参数,那么不定长参数必须放在普通参数后面
b.两颗*的要放在一颗*的后边

# 写一个函数,计算多个数的和(位置参数,关键字参数皆可)
def sum_num(*args, **kwargs):
    sum1 = 0
    # 遍历元祖
    for num in args:
        sum1 += num
    # 遍历字典
    for num1 in kwargs:
        sum1 += kwargs[num1]
    print(sum1)


sum_num(11, 23, a=111)

三、函数返回值

1.什么是返回值:函数里面的数据传递到函数外面
定义:函数调用表达式的值,就是return关键字后面的表达式的值
注意:每个函数都有返回值,默认是None
函数调用表达式:调用函数的语句
return:关键字,只能写在函数体中
功能
1.确定函数的返回值
2.结束函数
注意:执行函数时,如遇到return,函数直接结束,并且将后面的值作为函数的返回值

def func1():
    print('****')
    return 100
    print('=====')


result = func1()  # func1()就是函数调用表达式
print(result)

2.多个返回值
return 值1, 值2, 值3... <==> (值1, 值2, 值3...)

def func3():
    return 1, 2, 3


print(func3())   # (1, 2, 3)

x, y, z = func3()
print(x, y, z)  # 1 2 3

3.怎么确定函数是否需要返回值
函数执行完后是否会产生新的数据,如果会产生新的数据,就需要返回值,并用return返回

# 声明一个函数,打印指定的n!
def factorial_1(n):
    """
    求指定数的阶乘
    :param n:
    :return:
    """
    num = 1
    for x in range(1, n+1):
        num *= x
    return num


factorial_1(3)  # 6
# 一个函数可以用多次
factorial_1(4)  # 24

你可能感兴趣的:(Day_09-函数(一))