数据分析 --- day12函数基础2

一、函数的参数

一. 位置参数和关键字参数

根据调用函数的时候实参的提供方式不同来分类的

1. 位置参数: 以’数据1,数据2,数据3,…'形式存在,通过位置来和形参一一对应
2. 关键字参数: 以’形参1一=数据1,形参2=数据2,形参3=数据3,…'形式存在(交换关键字参数位置,不影响结果)

注意:

  • 位置参数可以和关键字参数一起用,但是位置参数必须放在关键字参数的前面
  • 不管以什么形式传参,都必须保证每个参数都有值
def func1(a, b, c):
    print(f'a:{a}, b:{b}, c:{c}')

func1(10,20,30)                 # a:10, b:20, c:30
func1(20,10,30)                 # a:20, b:10, c:30
func1(a=10,b=20,c=30)           # a:10, b:20, c:30
func1(b=20,a=10,c=30)           # a:10, b:20, c:30
func1(10,b=20,c=30)             # a:10, b:20, c:30

# func1(10,a=20,c=30)             # 报错
# func1(a=10,20,c=30)             # 报错

二. 参数默认值

  • 在定义函数的时候,可以以’形参名=数据’的方式给参数赋默认值;
  • 调用函数的时候有默认值的参数可以不用传参

注意: 定义函数的时候,如果有的函数有默认值,有的没有,没有默认值的参数必须在有默认值的参数前面

def func2(a=1, b=2, c=3):
    print(f'a:{a}, b:{b}, c:{c}')

func2()             # a:1, b:2, c:3
func2(100)          # a:100, b:2, c:3
func2(c=300)        # a:1, b:2, c:300

def func3(b, a=1, c=3):
    print(f'a:{a}, b:{b}, c:{c}')

func3(200)          # a:1, b:200, c:3

三. 参数类型说明

  • 可以让形参在函数体中使用的时候有相关代码提示
    1. 没有默认值的参数直接在参数后加’:类型名’
    2. 有默认值的参数默认值的类型就是说明的类型
def func4(a:str):
    pass

list1 = [
    {'a':10, 'b':200},
    {'a':100, 'b':'abc'}
]

补充: 通过类型注释,对变量进行类型说明

c = list1[-1]['b']      # type:str

四. 不定长参数(了解)

参数个数不确定

**1. 带*的不定长参数: **
定义函数的时候在某个参数前加*,就可以让这个参数同时接受多个实参(只能是位置参数)。
*的不定长参数的本质是一个元组,它接收到的所有的实参会成为这个元组的元素。

  • 注意:
    • *的不定长参数只能用位置参数传参
    • *的不定长参数前面的定长参数也只能用位置参数传参
    • 在带*后面的定长参数只能使用关键字参数传参

2. 带**的不定长参数
+ 定义函数的时候再某个参数前加**,就可以让这个参数同时接收多个实参(只能是关键字参数)。
+ 带**的不定长参数的本质是一个字典,它接收到的所有的关键字参数会成为这个字典的元素。

案例:定义一个函数求多个数的和

def sum2(*nums):
    s = 0
    for x in nums:
        s += x
    print(s)

sum2()
sum2(10, 20)
sum2(10, 20, 30)
sum2(1, 23, 4, 5, 90)


def student_info(name, age, *score):
    print(score)


student_info('小明', 18, 89)
student_info('小花', 18, 90, 89, 46)

*的不定长参数只能用位置参数传参

def func5(*num):
    pass

func5(10, 20, 30)

*的不定长参数前面的定长参数也只能用位置参数传参

def func6(x, y, *num):
    print(x, y, num)


func6(10, 20, 67, 34, 56)

在带*后面的定长参数只能使用关键字参数传参

def func6(*num, x, y):
    pass

func6(10, 20, 30, x=40, y=50)

def func7(a, b, *num, x, y):
    pass

形参列表中如果单独出现一个*,它的目的只是想要在调用这个函数的时候*后面的参数必须使用关键字参数,*前面的参数必须使用位置参数。

def func8(a, *, b):
    pass


def func9(**x):
    print(x)


func9()
func9(a=10)
func9(a=10, b=20, c=30)
func9(c=90, m=100, e=87, h=56)

*args, **kwargs 存在的目的是为了让这个函数在调用的时候可以足够灵活(既可以使用不定个数位置参数,也可以使用不定个数关键字参数,位置参数和关键字参数还可以一起使用。

def func10(*args, **kwargs):
    pass


func10(10, 20)
func10(10, 20, 30, 40)
func10(k=100, t=200)
func10(10, 20, a=10, b=30, c=40)

二、函数的返回值

1. 什么是返回值

  • 返回值就是从函数内部传递到函数外部的数据(每次函数只能传递一个数据到函数外部)

1. 在函数内部怎么确定函数返回值

  • eturn后面的值就是函数的返回值

    • 在函数体实现函数功能的时候,可以在任何你需要的地方(一般在最后)通过return关键字,将需要传递到函数外部的数据作为返回值返回
  • return使用方法: return 需要返回的数据

  • 注意:

    • return出来可以返回数据,还会提前结束函数(执行函数体的时候只要遇到return整个函数直接结束)
    • 如果执行函数体的时候没有遇到return,这个函数的返回值就是None

2. 在函数外部怎么使用函数返回值

  • 使用函数调用表达式的值,就是使用函数返回值(函数调用表达式有结果,这个结果就是这次调用函数的时候获得的返回值)
  • 返回值能做的事情,函数调用表达式都可以做

return会提前结束函数

def func1():
    print('=====')
    # return None
    for i in range(5):
        print(i,'!!!!')
        return                  # 只会打印 ===== 与 0 !!!!
    print('+++++')
    print('-----')

func1()

案例: 定义函数求任意两个数的乘积以及和

def sum3(num1,num2):
    return num1 + num2, num1 * num2
# return 后边的相当于一个元组(没有歧义情况下,括号可以省略),也可以return后跟列表

print(sum3(2,5))

案例: 定义函数求任意两个数的和

def sum2(num1, num2):
    return num1 + num2

print(sum2(10, 20))
print(sum2(3,4))
  • 返回的值能做到,函数调用表达式都可以做
print(300)
print(sum2(100, 200))

a = 300
b = sum2(100, 200)

list1 = [300,sum2(100, 200)]
print(list1)

print(300 * 2)
print(sum2(100, 200) * 2)

def func2():
    return 'abc'

print(func2()[-1])          # c
print(func2().upper())          # ABC

# 例如
reslut = max(10,20,30,5,35,19)
print(reslut)
# name = input('输入名字')

三、变量作用域

  • 根据变量作用域(可使用范围)不同,可以将变量分为全局变量和局部变量两种

1. 全局变量

  • 全局变量指没有定义在函数或者类中的变量,
  • 全局变量的作用域是从定义开始到程序结束。

a是全局变量

a = 10
print(f'在外面使用a:{a}')

for i in range(3):
    print(f'在循环中使用a:{a}')

def func1():
    print(f'在函数中使用a:{a}')

func1()

x和b都是全局变量

for x in range(3):
    b = 2
    print(f'循环中使用x和b:{x},{b}')

print(f'循环外使用x和b:{x},{b}')

def func2():
    print(f'函数中使用x和b:{x}{b}')

func2()

2. 局部变量

  • 定义在函数中的变量就是局部变量,局部变量的作用域是从定义开始到函数结束。(形参是局部变量)

m和n都是局部变量

def func3(m):
    n = 100
    print(f'在函数使用m和n:{m},{n}')

func3(5)

# print(f'在函数外的m和n:{m},{n}')          # 报错!

3. 关键字global

  • 如果想要在函数里面定义一个全局变量或者修改一个全局变量的值,需要在函数中使用这个变量前加global进行说明。
num = 19

def func4():
    num = 20
    print(f'内部函数:{num}')

func4()
print(f'函数外部:{num}')


def func5():
    global num
    num = 20

    global name
    name = input('输入姓名:')

func5()
print(f'函数外部num:{num}')
print(f'函数外部name:{name}')
  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值