day-

返回值

1.返回值——返回值就是从函数内部传递到函数外部数据

1)怎么确定函数返回值————怎么讲函数内部的数据传递出去
return后面的值就是函数返回值,(需要将那个数据从函数内部传递到函数外部,就将那个数据放到return的后面)

2)怎么获取返回值
获取函数调用表达式的值,就是获取函数的返回值(每一个函数调用表达式都有结果,结果就是这个函数的返回值)
函数调用表达式————调用函数的语句

3)什么时候需要函数返回值
如果实现函数的功能产生了新的数据局,就将新的数据作为返回值返回(而不是在函数内部打印这个数据)

def func(num1, num2):
    result = num1 + num2
    return result

func(20, 30)
print('2', func(20, 30))

s = func(20, 30)
print(s*2)

nums = [30, 40, func(20, 30)]
print(nums)

result = print('a')   #(没有return,返回值默认为None,返回None)
print(result)
return

1.确定函数返回值
2.提前结束函数_在执行函数体的时候,什么时候遇到return,函数什么时候结束。

def func3():
    print('====')
    print('++++')
    for i in range(3):
        if i == 1:
            return 100
        print(i)
    print('hello world')
    return 100

result = func3()
print(result)
变量的作用

1.变量的作用域————变量定义后可以使用的范围
更具变量作用域的不同,可以将变量分为全局变量和局部变量两种

2.全局变量和局部变量

1)全局变量
Python中没有定义在函数中,类中的变量就是全局变量。
全局变量的作用域:从定义开始,到程序结束
全局变量默认保存在全局栈区间(全局栈区间在程序结束后才会自动释放)

a = 1

for x in range(3):
    b = 300    # x和b均为全局变量
print('函数外面', x, b)

def func1():
    print('函数里面', x, b)
func1()

2)局部变量
Python中定义在函数中的变量就是局部变量(形参是属于定义在函数中的变量)。
局部变量的作用域:从定义开始,到函数结束
每次调用函数的时候系统都会自动为这个函数创建一个临时的栈区间,这个函数中产生的所有数据,默认情况下都是保存在这个临时栈区间中的,当函数调用结束的时候,这个临时栈区间会自动释放(里面的数据都会被自动销毁,返回值传出后就销毁)

def func2(c):
    d = 200    # c和d是局部变量
    print('函数里面', c, d)
# print('函数外面', c, d)   报错,c 和d 没有定义
func2(4)

3.global的用法

用法1:如果想要在函数中修改一个全局变量的值,就可以在函数中变量使用前用global对变量进行说明
用法2:在函数中定义全局变量,也可以使用global

m = 100
n = 100

def fun3():
    # 在函数里面修改全局变量的值,不会修改成功,而是定义一个新的局部变量。
    m = 299
    print('函数里面的m:', m)
    global n,t
    t = 100
    n = 299
    print('函数里面的n:', n)

fun3()
print('函数外面的m:', m)
print('函数外面的n:', n)
print('函数外面的t:', t)
参数

1.位置参数和关键字参数
根据实参提供方式不同,将实参分为位置参数和关键字参数两种

1)位置参数:以‘数据1, 数据2,数据3…’的形式存在,让实参对应的数据和形参对应的变量位置上一一对应.
2)关键字参数:以’参数名1=数据1,参数名2= 数据2,参数名3= 数据3…'的形式存在
注意:多个关键字参数可以随意交换位置,他不会影响形参和实参的对应关系

3)混用:调用函数的时候未知参数和关键字参数可以一起使用,但是位置参数必须放在关键字参数的前面

def func1(x,y,z):
    print(f'x:{x},y:{y},z:{z}')

func1(100, 200, 300)
func1(200, 100, 300)
func1(x=100, y=200, z=300)
func1(y=200, x=100, z=300)
func1(100, z=300, y=200)
func1(100, 200, z=300)
# func1(100, y=200, 300)   # 报错未知参数必须放在关键字参数的前面

2.参数默认值

定义函数的时候:可以以’变量名=值’的形式,给形参赋默认值,已经有默认值的参数,在调用函数的时候可以不用传参。

定义函数的时候,可以有的参数有默认值有的参数没有默认值,但是没有默认值的参数放前面,有默认值的参数放后面

print('---------害羞的分割线-----------')
def func2(x=100,y=200,z=300):
    print(f'x:{x},y:{y},z:{z}')

func2()   # x:100,y:200,z:300
func2(150)    # x:150,y:200,z:300
func2(150, 250)   # x:150,y:250,z:300
func2(z=350)   # x:100,y:200,z:350

3.参数类型说明

没有默认值的参数——形参名:类型名
有默认值的参数,默认值的类就是对应的参数类型

def func3(str1:str,st2='') -> int:  #-> 表示提前告诉你返回值的类型
    pass

4.不定长参数

1)带的不定长参数:定义函数的时候,在某个形参前面加 ,那么这个参数就变成了一个不定长参数,一个不定长参数可以同时接受多个实参。

本质:带一个* 的不定长参数的本质就是一个元组,他接收到的所有的实参是这个元祖中的元素
注意:*对应的不定长参数传参的时候只能用位置传参
2)带**的不定长参数

# 案例1:定义一个函数,计算多个数的和
def sum1(*nums):
    return sum(nums)

n = sum1(10,20,30,40,50,60)
print(n)

def func_a(x,*y):
    print(x, y)
func_a(100)  # 给x,没有给y,
func_a(100,200,300,400)   # 第一个给x,后面的给y

# 如果一个定长参数放在一个不定长参数的后面,那么这个定长参数必须用关键字参数传参!
def func_b(*x,y):
    print(x,y)
func_b(y = 10)
func_b(10,20,30,40,y=50)
# !!!!单独的*后面的参数必须使用关键字参数传参(约束作用)
def func_c(x,*,y):
    print(x, y)
func_c(10,y = 20)
func_c(x=10, y=30)

# 案例2:定义一个函数手机一个学生的信息(姓名,年龄,电话,和各科成绩)
def creat_stu(name, age, tel, **score):
    print(score)
stu1 = creat_stu('阿酱',18,'110',math=98,english=70,chinese=97)
stu2 = creat_stu('酱酱',18,'110',math=88,english=100,physics=89)