day10-python函数基础

一 函数的参数

1.1 位置参数和关键字参数(实参)

根据函数调用的时候实参的传递方式将实参分为位置参数和关键字参数
① 位置参数 - 调用函数的时候直接在括号里面写多个实参,实参和形参是一一对应的。
func(10, 20, 30)

② 关键字参数 - 调用函数的时候以 形参名=实参 的形式来确定实参。关键字参数不能重复。也不能少。(位置不影响结果)
func(a=10, b=20, c=30)

注意:位置参数和关键字参数可以一起使用,但是位置参数必须在关键字参数的前面。
不管以什么形式传参,最终都要给每个参数赋值。
func(10, c=30, b=20)

1.2 参数默认值(形参)

在定义函数的时候可以给形参赋默认值;如果一个形参有默认值,那么这个参数在调用的时候可以不传实参。
如果定义函数的时候有的参数有默认值,有的参数没有默认值,没有默认值的参数要放到前面,有默认值的参数要放到后面。

def func2(b, a=10, c=30)

def func2(a=10, b=20, c=30):

    :param a:
    :param b:
    :param c:
    print(f'a:{a}, b:{b}, c:{c}')


func2(100)  # a:100, b:20, c:30
func2(100, 200, 300)  # a:100, b:200, c:300
func2(c=290)  # a:10, b:20, c:290

1.3 不定长参数(参数个数不确定)

① 定义函数的时候,在一个参数前*,那么这个参数就是一个不定长参数,可以同时接受多个实参
注意:

  1. 带*的这个参数本质就是一个元组。
  2. 在调用的时候这个参数必须用位置参数传参。

练习:定义一个函数求多个数的和

def sum1(*nums):
    """

    :param nums:
    :return:
    """
    sum2 = 0
    for x in nums:
        sum2 += x
    return sum2


print(sum1(10, 20, 30))  # 60

定义一个函数计算一个学生所有学科的总成绩

def total_score(name, *scores):
    pass

② 定义函数的时候在一个参数前加**,那么这个参数就是一个不定长参数,可以同时接受多个参数。
注意:
1)带**的参数本质是一个字典
2)在调用的时候这个参数必须使用关键字传参(关键字是自己随便命名)。

def func5(**num):
    pass

func5(a=10, name='小明')

问题:定义函数的时候经常看到一种结构:*args,**kwargs,问题:这样写的意义和目的是什么。
调用函数既可以传参数也可以不传,并且既可以传位置参数,也可以传关键字参数,还可以了二者一起传。

1.4 参数类型说明

方便别人在看函数的时候知道参数是什么类型,也方便自己在写代码的时候能够有提示。

def func3(a:str, b=0):
    a.join()
    pass

二 函数的返回值

2.1 什么是返回值

① 概念
返回值就是从函数内部传递到函数外部的数据;
返回值就是return关键字后面的表达式的值;
返回值就是函数调用表达式的值。

② return关键字
return时只能在函数体中使用的关键字,作用有两个:

  1. 确定函数的返回值(return后面是什么,函数的返回值就是什么)
  2. 提前结束函数(只要遇到return,整个函数直结束)
  3. 函数调用表达式:
    调用函数的表达式就是函数调用表达式,
    注意:如果在执行函数的时候没有遇到return,那么函数的返回值就是 None。

2.2 怎么确定函数是否需要返回值:看实现函数的功能会不会产生新的数据,如果有就将这个系的数据作为返回值返回。

练习:定义一个函数,取出指定字符串中所有的数字字符。

def get_num(str1:str):
    num_str = ''
    for x in str1:
        if '0' <= x <= '9':
            num_str += x
    return num_str
print(get_num('asdffe851af8945a6f465as6'))
  • 返回值对应的数据能做的事情,函数调用表达式都可以做
def sum1(a:int, b:int):
    return a + b
print(30)
print(sum1(10, 20))

2.3 函数调用过程(执行过程)

第一步:回到函数定义的位置
第二步:传参(用实参给形参赋值;传参的时候必须保证每个参数都有值)
第三步:执行函数体
第四步:执行完函数体确定返回值
执行完函数体:① 执行到函数体的最后一条语句
② 遇到return
怎么确定返回值:就看函数执行完的时候有没有遇到return,如果遇到了,返回值就是return后面的值
没有遇到return,返回值就是None
第五步:回到函数调用的位置接着往后执行(这个时候函数调用表达式的值就是函数的返回值)

2.4 多个返回值

函数的返回值永远都只有一个,如果同时返回多个数据,就返回一个容器,常用元组。
如果一个函数要同时返回多个数据,将多个数据作为一个元组中的元素返回

三 变量的作用域

变量的作用域指的是变量的作用范围,根据变量使用范围,我们将变量分为全局变量和局部变量。

3.1 全局变量和局部变量

① 全局变量
定义在函数和类的外部的变量就是全局变量。
作用域:从定义开始到文件结束的任何位置都可以使用

② 局部变量
定义在函数中的变量
作用域:从定义开始到函数结束的任何位置都可以使用

  • 全局变量
a = 10
for x in range(4):
    print(x)
  • 局部变量
x, y, a
def func(x, y):
    a=10
    pass

3.2 global和nonlocal

global和nonlocal都只能在函数体中使用。
用global在函数内部定义一个全局变量。
用法:
global 变量
注意:用global生命我的变量只能在声明后以后再使用,尽管在函数外面有对该变量的定义。

nonlocal:在局部的局部中修改变量的值

练习:有一个银行账号,定义两个函数对这个账号进行存钱和取钱的的操作,调用函数进行多次存钱和取钱操作后打印账号的余额。

account = {
    'name': '小明',
    'id': 1569562,
    'tel': 123456,
    'balance': 10000
}
num = account.get('balance')
def save_money(money1:int):
    global num
    num += money1
    return num

def get1(money2:int):
    if account.get('balance') < money2:
        print('余额不足')
    else:
        account['balance'] -= money2

num = int(input('请输入你要存入的金额:'))
print('您的账户余额为:', save_money(num))

四 匿名函数

4.1 什么是匿名函数

匿名函数的本质还是函数,除了定义的语法以外,其他的和普通函数没有区别

语法:
函数名 = lambda 参数列表:返回值

相当于:
def 函数命(参数列表):
return 返回值

练习1:写一个匿名函数求两个数的和:

sum1 = lambda num1, num2: num1 + num2

练习2:写一个匿名函数根据年龄的范围返回’成年’、‘未成年’

age1 = lambda age:'成年' if age >= 18 else '未成年'

print(age1(5))
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值