Python基础 1.5 函数

1.5 函数

1.5.1 函数的作用和定义

1.函数的作用

​ 函数是为了提高编码的利用率,能多次重复使用,提高效率

2.函数的定义和调用

函数的定义

def 函数名():
	函数内容

谨记,函数内容靠缩进来限定范围,必须严格缩进

函数调用

函数名()

3.函数的执行流程

1.调用函数,寻址函数定义,找到接口,如为找到则报错。

2.执行函数,有的函数会需要传参,有的函数会返回数据。

3.执行完毕,回到调用函数的位置。

4.debug的单步调试使用

1.5.2 函数的参数和返回值

​ 通过传递数据给函数内部,让数据参与函数内的运算,增加函数的通用性。

带参数的函数定义格式

def 函数名(形参1,形参2,形参3,形参···):
	函数内容
	return (函数想返回的内容)

调用参数函数的格式

函数名(实餐1,实餐2,实餐3···)

​ 实例

def test_add(num1, num2):
    add_result = num1 + num2
    print(add_result)


a = 20
b = 80
test_add(a, b)

1.函数形参的作用域

形参的作用域只应用于函数体内,变量起作用的范围只在函数体内。

2.函数的返回值

​ 有时候会希望函数调用后,会返回一个数据告诉调用者一个结果,亦或者是调用函数就是为了取得一个数据来做后续处理,就会需要返回值。

​ 之前我们用的print() input()内置函数,都是自带返回值的,如果我们自己编写函数,需要用到return。

def test_add(num1, num2):
    add_result = num1 + num2
    return add_result


a = 20
b = 80
c = test_add(a, b)
print("a和b相加等于%d" % c)

​ 函数内部如果没有return语句,默认返回None。return如果不设置任何返回值,默认也是返回None

return中断函数,程序一旦执行return,后面的语句不会执行。

3.传参的类型

1)位置参数

​ 按照行参的位置,从左到右一一对应

2)关键字参数

​ 通过形参=值的形式直接传参,不需要对应位置,但是注意 ,混用的时候关键字参数必须在位置参数右边

# 函数调用时,通过形参=值方式为函数形参传值
# 不用按照位置为函数形参传值,这种方式叫关键字参数

# 函数定义
def foo(name, age, sex):
    print(f"我叫{name},我今年{age}岁, 我的性别是{sex}")

# 函数调用
# foo("小明", 23, '男')

# 关键字参数
# 关键字=值
# 形参=值
foo(age=23,name="小芳",sex='女')

# 位置参数 + 关键字参数
foo("小明", sex='男', age=20)

# 注意1: 关键字参数必须在位置参数的右边
# foo(sex='男', "小郭",  age=20)

# 注意2: 形参不能重复赋值
# SyntaxError: keyword argument repeated
# foo(name="小郭", name="小李", sex='男', age=22)

4.默认参数

​ 形参设置默认值则为缺省参数,也叫默认参数,调用函数时候如果没有传入默认参数对应的实参,则用默认值

默认参数必须在普通参数后面

# 默认参数必须在普通参数的后边
def foo(a, b=20, c=30):
    print(a, b, c)


# 函数调用
foo(1)  # a=1, b=20, c=30
foo(1, 2)  # a=1, b=2, c=30
foo(1, 2, 3)  # a=1, b=2, c=3

5.不定长参数(重点)

​ 函数可以定义不定长参数,用于接收任意数量的位置实参

5.1 元组型不定长参数

​ 形参变量名前面加一个 ,这个参数则为元组型不定长参数,形参变量名一般叫args,也可以叫其他名字,函数体使用不定长参数的时候直接使用变量名即可,无需加****。

​ 不定长参数的本质是将传递的参数组包装成元组。

def fun_args(*args):
    print(args, type(args))


fun_args()
fun_args(2, "d", 4)

输出

() <class 'tuple'>
(2, 'd', 4) <class 'tuple'>
5.2 字典型不定长参数

​ 不定长参数还有一种形式,可以接收任意数量的关键字实餐。

定义参数需要在形参前面加**,则为字典型不定长参数,同样函数体使用变量的时候不需要加星号,形参变量名默认叫kwargs,这种不定长参数会把关键字参数包装成字典。

def fun_kwargs(name,**profile):
    print(name, profile, type(profile))


fun_kwargs(name="Tom", age=19, sex="female")

输出

Tom {'age': 19, 'sex': 'female'} <class 'dict'>

可以由此得出

1.已经存在的形参,不会被包装到字典当中

2.字典型的不定长参数,必须放在形参列表最后面。(比默认参数还后面)

1.5.3 函数的类型

​ 函数有参数也有返回值,可以二二组合成四种类型,一般写函数我们从需求来选择写什么类型的函数。

1.无参数,无返回值

​ 一般只是用来显示内容的函数,无需参数,也无需返回值

2.无参数,有返回值

3.有参数,无返回值

import random


def fun01(person_h):
    computer = random.randint(1, 3)
    if person_h == 1 and computer == 2:
        print("You Win")
    elif person_h == 2 and computer == 3:
        print("You Win")
    elif person_h == 2 and computer == 1:
        print("You Win")
    elif person_h == computer:
        print("Wow,Draw!")
    else:
        print("What a pity, U lose")


your_h = input("请出示你的猜拳(1=拳头 2=剪刀 3= 布):")
fun01(int(your_h))

4.有参数,有返回值

1.5.4 函数的嵌套调用

def fun001():
    print("调用函数001")
    print("调用函数001结束")


def fun002():
    print("调用函数002")
    fun001()
    print("调用函数002结束")


fun002()
调用函数002
调用函数001
调用函数001结束
调用函数002结束

案例

def lines_print(num, char):
    print(char*num)


def n_lines_print(n, num, char):
    i = 0
    while i < n:
        lines_print(num, char)
        i += 1


n_lines_print(2, 8, 'Hololive')

1.5.5 全局变量和局部变量

​ 在函数里的声明的变量为局部变量,不可在函数外调用,在函数外面的是全局变量,所有地方都能调用,局部变量是临时调用的变量,存储临时需要存储的数据。如以下例子。

num = 0
def fun_var():

    num = 250
    print("在函数里的局部变量", num)


fun_var()
print("在函数外的全局变量", num)

​ 输出

在函数里的局部变量 250
在函数外的全局变量 0

​ 虽然会提醒局部变量名字和全局的一样,但是并不会改变全局变量num的值。因为在函数内如果不声明全局变量,直接赋值是创建了一个新的局部变量,而并不是外面的全局变量。

如果要修改外面的全局变量,则需要优先声明全局变量,使用和调用不需要声明。

num = 0
def fun_var():
    global num
    num = num +100
    print("在函数里的局部变量", num)


fun_var()
print("在函数外的全局变量", num)

输出

在函数里的局部变量 100
在函数外的全局变量 100
拓展:闭包

闭包是介于局部变量与全局变量的一种变量

def fun_01():
    k = 1

    def fun_02():
        i = 0
        while i < 5:
            i = i + k
        return i
    return fun_02()


print(fun_01())

此时变量k就是闭包,变量k可以被里函数调用,但是不可以被外面调用

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值