python day08 函数

day 08 函数

复习

  1. 字符编码

    只能输入英文字符—————ASCII格式的二进制(内存)—————ASCII格式的二进制(硬盘)

    只能输入中文和英文字符—————GBK格式的二进制(内存)—————GBK格式的二进制(硬盘)

    只能输入日文和英文字符—————shift-JIS 格式的二进制(内存)—————shift-JIS 格式的二进制(硬盘)

​ 可以输入万国字符—————unicode格式的二进制————utf-8格式的二进制

​ 只能输入中文和英文字符—————unicode格式的二进制————gbk格式的二进制

​ 只能输入日文和英文字符—————unicode格式的二进制————shift-JIS格式的二进制

​ 可以输入万国字符—————utf-8格式的二进制————utf-8格式的二进制

utf8mb4————>可以存表情

​ 保证不乱码:

​ 1.存不乱

​ 存入硬盘用utf-8

​ 2.取不乱

​ 取的编码与读的编码保持一致

  1. 指针移动

1.函数介绍

  1. 什么是函数

    函数就是盛放代码的容器,把实现某一功能的一组代码丢到一个函数中就做成了一个小工具

    具备某一功能的工具————>函数

    事先准备工具的过程————>函数的定义

    遇到应用场景拿来就用———>函数的调用

  2. 为何要用函数

没有用函数前面临的问题:

  1. 代码冗余,程序组织结构不清晰、可读性差

  2. 扩展性差

  3. 如何用函数:先定义,后调用

  4. 如何用函数

    原则:先定义、后调用

    定义函数的语法

    def 函数名(参数1,参数2,......):

    ​ """

    ​ 文档注释

    ​ """

    ​ 代码1

    ​ 代码2

    ​ 代码3

    ​ return 返回值

    如何调用函数:

    ​ 函数名(1,2)

函数————————工厂

函数名———————地址

参数————————原材料

函数体代码—————工厂的流水线

返回值———————工厂的产品

一、先定义、后调用

二、函数在定义阶段发生了什么事情

定义函数不执行函数体代码,但是会检测函数体的语法

x = 10
print(x)


def func():  # func=函数的内存地址
    print('start...')
    print('xxx...')
    print('end...')


print(func)

三、函数在调用阶段发生了什么事情

先通过函数名找到函数的内存地址,然后函数的内存地址()会触发函数体代码的运行

四、定义与调用函数的三种形式

​ 定义的三种方式

  1. 无参

  2. 有参

  3. 空函数

​ 调用的三种方式

​ 2.1语句形式:input('>>:')

​ 2.2表达式形式:res = input('>>:')

​ 2.3可以把函数调用当做参数传给另外一个函数

2.函数的返回值

# 用return控制函数的返回值:
# 函数内可以有多个return,但只要执行一次,整个函数就立即结束,并且将return后的值
# 当做本次调用的结果返回,具体来说,函数的返回值又分为三类

# 1.return值:返回的就是该值本身
# 2.return值1,值2,值3 返回的就是一个元组
# 3.函数内可以没有return,或者就一个return后没有值,返回的就是None

3.函数的参数

  1. 形参:在函数定义阶段括号内定义的变量名,称之为形式参数,简称形参

  2. 实参:在函数调用阶段括号内传入的值,称之为实际参数,简称实参

    形参与实参的关系是:

​ 在调用函数参数时,实参的值会绑定给形参名,然后可以在函数内使用,函数调用完毕后,解除绑定

# 一 函数参数分为两大类:
# 1、形参:在函数定义阶段括号内定义的变量名,称之为形式参数,简称形参
# 2、实参:在函数调用阶段括号内传入的值,称之为实际参数,简称实参

# 形参与实参的关系是:
# 在调用函数时,实参的值会绑定给形参名,然后可以在函数内使用,函数调用完毕后,解除绑定
# def func(x,y):
#     # x=1
#     # y=2
#     print(x+y)
#
# m = 1
# n = 2
# func(m,n)

# 二:参数详解
# 2.1 位置形参::在函数定义阶段按照从左到右的顺序依次定义的形参,称之为位置形参
#     特点:必须被传值,多一个不行少一个也不行
# def func(x,y):
#     print(x+y)

# func(1,2)
# func(1,2,3)
# func(1,)

# 2.2 默认形参:在函数定义阶段就已经为某个形参赋值了,称之为默认形参
#     特点:在函数定义阶段就已经赋值了,意味着在调用阶段可以不用为其赋值

#     ps: 可以混用位置形参与默认形参,但是位置形参必须在前
# def func(x,y=2):
#     print(x)
#     print(y)

# func(1,3)
# func(1)

# def register(name,age,gender="male"):
#     print(name,age,gender)
#
# register("李铁蛋",38)
# register("王全蛋",19)
# register("赵银蛋",28)
# register("lili",18,"female")

#   默认形参需要注意的问题是:
#   1、默认形参的值只在函数定义阶段被赋值一次
#   2、默认形参的值通常应该是不可变类型
# 案例1
# m = 100
# def func(x,y=m):  # y -> 100的内存地址
#     print(x,y)
#
# m = 200
# func(1)
>>>>
(1,100)


# 案例2
# m = [11,22,]
# def func(x,y=m):  # y -> [11,22,]的内存地址
#     print(x,y)
#
# # m = 200
# m.append(33)
# func(1)
>>>>
(1,[11,22,33])

def register(name, x, hobbies=[]):  # hobbies = []内地址
    hobbies.append(x)
    print("%s 的爱好是 %s" % (name, hobbies))


register("egon", 'read')
register("liu", 'chou')
register("hxx", 'tang')
>>>>
egon 的爱好是 ['read']
liu 的爱好是 ['read', 'chou']
hxx 的爱好是 ['read', 'chou', 'tang']


def register(name,x,hobbies=None):  # hobbies = []内地址
    if hobbies is None:
        hobbies = []
    hobbies.append(x)
    print("%s 的爱好是 %s" %(name,hobbies))

register("egon",'read')
register("liu",'chou')
register("hxx",'tang')
>>>>
egon 的爱好是 ['read']
liu 的爱好是 ['chou']
hxx 的爱好是 ['tang']






# 2.3 位置实参:在函数调用阶段按照从左到右的顺序依次传入的值,称之为位置实参
#      特点:按照顺序与形参一一对应
# def func(x,y):
#     print(x)
#     print(y)
#
# func(1,2)
# func(2,1)

# 2.4 关键字实参:在函数调用阶段按照key=value的格式传入的值,称之为关键字实参
#     特点:可以打乱顺序,但是仍然能够为指定的形参赋值

#     ps:可以混用位置实参与关键字实参,但是
#         1、位置实参必须在关键字实参前
#         2、不能为同一个形参重复赋值
# def func(x,y):
#     print(x)
#     print(y)

# func(y=2,x=1)  >>>>2,1
# func(1,y=2)    >>>>1,2
# func(y=2,1)    >>>>ERROR
# func(1,2,y=3)  >>>>ERROR
# 2.5 *与**在形参与实参中的应用
# 可变长的参数:可变长指的是在函数调用阶段,实参的个数不固定,而实参是为形参赋值的,所以对应着必须要有一种特殊格式的形参
#            能用来接收溢出的实参

# 形参中带*:*会接受溢出的位置实参,将其存成元组,然后赋值给紧跟其后的变量名
# def func(x, **y):  # y = (2, 3, 4, 5, 6)
#     print(x)
#     print(y)


# func(1, 2, 3, 4, 5, 6)


# 形参中带**:**会接受溢出的位置实参,将其存成字典,然后赋值给紧跟其后的变量名
# def func(x, **y):  # y = {'a': 2, 'b': 3, 'c': 4}
#     print(x)
#     print(y)


# func(1, a=2, b=3, c=4)
# func(1, 2, 3, a=1, b=2, c=3)  # 报错

# def my_sum(*x):
#     print(sum(x))
#
#
# my_sum(1, 2, 3, 4)

# 实参中带*:*后跟的必须是一个可以被for循环遍历的类型,
# *会将实参打散成位置实参
# def func(x, y, z):
#     print(x)
#     print(y)
#     print(z)
#
#
# func(*[11, 22, 33])


# 实参中带**:**后跟的必须是一个字典,
# **会将实参打散成关键字实参
def func(x, y, z):
    print(x)
    print(y)
    print(z)


func(**{'x': 1, 'y': 2, 'z': 3})
def index(x, y, z):
    print(x, y, z)


def wrapper(*args, **kwargs):  # args = (1,2,3,4,5,6,7)  kwargs = {"a":1,"b":2,"c":3}
    print(args)
    print(kwargs)

    index(*args, **kwargs)  # index(*(1,2,3,4,5,6,7),**{"a":1,"b":2,"c":3})
    # index(1,2,3,4,5,6,7,a=1,b=2,c=3)


# wrapper(1, 2, 3, 4, 5, 6, 7, a=1, b=2, c=3)
>>>>
(1, 2, 3, 4, 5, 6, 7)
{'a': 1, 'b': 2, 'c': 3}
Traceback

wrapper(1, z=2, y=3)
>>>>
(1,)
{'z': 2, 'y': 3}
1 3 2
posted @ 2021-03-30 08:42  橘丶阳菜  阅读(44)  评论(0编辑  收藏  举报