为了账号安全,请及时绑定邮箱和手机立即绑定

【2023年】第44天 python中函数的定义和使用

标签:
Python

一、函数的定义

1.前置内容

  • 将一件事情的步骤封装在一起并得到最终结果。
  • 函数名代表了整个函数要做的事情。
  • 函数是实现函数功能的流程。
  • 函数也可以称为方法和功能。
  • 函数可以帮助我们重复使用,通过函数名我们可以知道函数的作用。
  • 常见的内置函数有print,id,int,str,max,min,range
  • 自定义函数,自己根据业务进行封装的函数。

2.函数书写的格式

def names(args...):
	todo something..
	返回值

函数名+小括号用来执行函数。

3.函数的返回值return

  • 将函数结果返回的关键字
  • return只能在函数体内使用。
  • return支持返回所有的python类型。
  • 有返回值的函数可以直接赋值给一个变量。
# coding:utf-8

def capitalize(data):
    index = 0
    temp = ''

    for item in data:
        if index == 0:
            temp = item.upper()
        else:
            temp += item
        index += 1
    
    return temp


# result = capitalize('hello xiao')
result = capitalize(data='hello xiao')
print(result)
  • 实现一个首字母大写的函数capitalize(data),带有一个参数。
  • 因为要改变的是首字母,所以我们可以定义一个index=0的变量,然后再定义一个空的字符串,用于储存需要改变首字母的数据data。
  • 然后对整个输入的data进行循环遍历。
  • 在循环中,首先判断是否是首字母,如果是就是用upper函数对它进行大写,如果不是就使用temp加上循环的这一项。
  • 最后设置跳出循环的条件index+=1,最后返回temp。
  • 使用例子测试函数的功能是否可以实现,最后打印并输出。
def message(message, message_type):
    new_message = '[%s] %s' % (message_type, message)
    print(new_message)


message(message='今天下雨了', message_type='info')
  • 没有返回值的函数。
  • 首先传入两个参数message和message_type
  • 然后进行格式化两个参数
  • 最后对格式化的内容进行输出。
  • 然后调用定义的函数,并且传入参数。

4.print()函数和return的区别

  • print只是单纯的将对象进行打印,不支持赋值语句。
  • return是对函数执行结果的返回,也支持赋值语句。
def test():
    for i in range(10):
        if i == 5:
            return i


print('test结果是:', test())
  • 首先定义了一个没有参数的test函数
  • 然后对i进行循环10次
  • 判断如果i等于5的时候,就返回i,并且结束循环
  • 最后调用test()函数。

二、函数的参数

1. 默认参数与必传参数

  • 函数中定义的参数没有默认值,在调用函数时如果不传入则报错。
  • 在定义函数的时候,参数后面没有符号于默认值。
  • 错误的方式是:def add(a=3, b=4),直接在定义函数时,情况是必传参数,直接赋值是不对的。
  • 在定义函数的时候,没有默认值且必须在函数执行的时候传递进去的参数,且顺序与参数顺序相同,就是必传参数。
  • 在定义函数的时候,定义的参数含有默认值,通过赋值语句给他是一个默认的值,比如def add(a, b=1)。
  • 如果默认参数在调用函数的时候给予了新的值,函数将优先使用后传入的值进行工作。
# coding:utf-8
def add(a, b, c=3):
    return a + b + c

result = add(1, 2)  # 像a,b这样的参数都是必传参数,如果不传就会报错
print(result)

result = add(1, 2, 6)  # 这里第三个参数传入6之后,就会去替代原来的默认参数
print(result)

2. 不确定参数,可变参数

  • 没有固定的参数名和数量(不知道要传的参数名具体是什么)
def add(*args, **kwargs):
...
add(1,2,3, name='dewei', age=33)
  • *args代表:将无参数的值合并成元组
  • **kwargs代表将有参数与默认值的赋值语句合并成字典。
def test_args(*args, **kwargs):
    print(args, type(args))
    print(kwargs, type(kwargs))


test_args(1, 2, 3, 4, 5, 6, name='xiao', age=33, top=165)
  • 首先定义一个test_args的函数。
  • 然后对args和args的类型进行打印。
  • 最后对kwargs和kwargs的类型进行打印。
  • 调用test_args函数,并且传入参数进行验证。
  • 返回的结果是args是元组,kwargs是字典。
def test_args_super(*args, **kwargs):
    if len(args) >= 1:
        print(args[0])

    if 'name' in kwargs:
        print(kwargs['name'])
    else:
        print('no name')
    print(args, len(args))
    print(kwargs, len(kwargs))


test_args_super(1, name='xiao')
a = ('python', 'django')
b = {'name': 'xiao'}
test_args_super(*a, **b)
  • 首先定义一个test_args_super的函数,传入了两个不定参数,*args和**kwargs。
  • 对args参数的长度进行判断,如果长度大于1的话,打印出它的0索引。
  • 如果’name’包含在kwargs中的话,则打印出name的值。如果不存在则打印出没有名字。
  • 调用函数test_args_super函数,并且传入参数1和name, 运行后得到了我们传入的参数。
  • 重写书写了a和b参数,分别表示args和kwargs,并进行调用函数test_args_super,这里必须要加上*号,如果不加就会导致调用失败,传入的参数不能正常的打印。

3. 参数规则

def add(a, b=1, *args, **kwargs)
  • 参数的定义从左到右依次是必传参数,默认参数,可变元组参数,可变字典参数。
  • 函数的参数传递非常的灵活。
  • 必传参数与默认参数的传参多样化。
def add(a, b=1):
    print(a + b)


add(1, 2)
add(1)
add(a=1, b=2)
add(b=2, a=1)
# add(b=2)  # 会报错
  • 调用函数传参时,一定要注意,如果是必传参数没有传参数进去,结果就会报错。
def test(a, b=1, *args):
    print(a, b, args)


s = (1, 2)
test(1, 2, *s)
  • 首先定义了一个test函数,包含了必传参数,默认参数,和可变元组参数。
  • 那我们传参数的时候就可以直接传入不需要再用赋值的形式了。
def test2(*args, a, b=1):
    print(a, b, args)


s = (1, 2)
test2(a=1, b=2, *s)
  • 首先传入了test2函数,传入可变的元组参数,必传参数以及默认参数。
  • 如果我们首先传入了可变元组参数,那我们就可以在调用函数的时候,使用赋值的形式实现参数部分。
  • 但是这种方式不推荐使用。
def test3(a, b=1, **kwargs):
    print(a, b, kwargs)


test3(1, 2, name='xiao')
test3(a=1, b=2, name='xiao')
test3(name='xiao', age=33, a=1, b=2)

d = {'name': '小高'}
test3(a=1, b=2, **d)
test3(**d, a=1, b=2)
# test3(**d, 1, 2)  # 如果在调用函数时参数的位置(顺序)发生变化,一定要使用赋值语句的方式进行传参。
  • 我们定义了一个test3函数,并且传入必传参数,默认参数,以及字典可变参数。
  • 需要注意一点就是,如果在调用函数时参数的位置(顺序)发生变化,一定要使用赋值语句的方式进行传参。

4. 函数的参数类型的定义

def person(name:str, age:int=33):
	print(name, age)
  • 参数名+冒号+类型
  • 参数名+冒号+类型+等号+默认值
  • 函数定义在python3.7之后可用
  • 函数不会对参数类型进行验证
def add(a: int, b: int = 3):
    print(a + b)


add(1, 2)
add('hello', '小高')  # 虽然我们在定义函数的时候已经定义了参数类型,但是当我们调用函数并传入参数的时候并不会对它进行匹配验证
  • 定义函数add,传入必传参数a,并且定义为int类型,传入默认参数b,不但定义类型为int,而且定义值为3
  • 虽然我们在定义函数的时候已经定义了参数类型,但是当我们调用函数并传入参数的时候并不会对它进行匹配验证
def test(a: int, b: int = 3, *args: int, **kwargs: str):
    print(a, b, args, kwargs)


test(1, 2, 3, '4', name='小高')
  • 定义了函数test,传入了a,b,*args,**kwargs参数,并且对每一部分都进行了类型的定义。
def test2(a: int, b, c=3):
    print(a, b, c)


test2(1, 3, 4)
  • 定义了一个函数test2,传入a,b,c三个参数,并且对a的类型定义为int类型,b为必传参数,c为默认参数。
点击查看更多内容
TA 点赞

若觉得本文不错,就分享一下吧!

评论

作者其他优质文章

正在加载中
  • 推荐
  • 评论
  • 收藏
  • 共同学习,写下你的评论
感谢您的支持,我会继续努力的~
扫码打赏,你说多少就多少
赞赏金额会直接到老师账户
支付方式
打开微信扫一扫,即可进行扫码打赏哦
今天注册有机会得

100积分直接送

付费专栏免费学

大额优惠券免费领

立即参与 放弃机会
意见反馈 帮助中心 APP下载
官方微信

举报

0/150
提交
取消