pyhton基础【15】函数进阶一

目录

[一. 函数进阶](#一. 函数进阶)

[1. 默认参数:](#1. 默认参数:)

[2. 关键字参数:](#2. 关键字参数:)

[3. 可变参数:](#3. 可变参数:)

[4. 装饰器:](#4. 装饰器:)

[5. 匿名函数lambda:](#5. 匿名函数lambda:)

[6. 高阶函数:](#6. 高阶函数:)

[7. 递归函数:](#7. 递归函数:)

[8. 类型注解:](#8. 类型注解:)

二.函数参数的高级使用

缺省参数

命名参数

不定长参数

三.返回值拆包


一. 函数进阶

Python函数的进阶使用包含多个重要的知识点,这些知识点可以帮助开发人员编写更为高效、灵活且强大的代码。以下是一些关键的进阶概念:

1. 默认参数:
  • 函数可以定义默认参数,让函数调用时某些参数可选。这提高了函数的可用性和灵活性。
  • 默认参数值通过在函数定义时赋值给参数实现。
2. 关键字参数:
  • 函数调用时可以通过键=值的形式指定参数,这样参数的顺序就不重要了。
  • 关键字参数增加了代码的可读性。
3. 可变参数:
  • 使用星号*args允许函数接受任意数量的位置参数。
  • 使用双星号**kwargs允许函数接受任意数量的关键字参数。
  • 这使得函数能够处理不确定数量的输入参数。
4. 装饰器:
  • 装饰器是一种特殊的函数,用于修改另一个函数的行为,而不需要改动其代码。
  • 通过在函数之前添加@decorator_name来应用装饰器。
  • 常用于日志记录、性能测试、事务处理等场景。
5. 匿名函数lambda:
  • 通过lambda关键字创建匿名函数,通常用于短小的函数定义。
  • lambda函数可以接受任意数量的参数,但仅能有一个表达式。
  • 一般与高阶函数(如filter、map、reduce)一同使用。
6. 高阶函数:
  • 高阶函数是将函数作为参数或返回值的函数。
  • 常见的高阶函数包括map(), filter(), reduce()等。
  • 这些函数通常用于数据处理和函数式编程。
7. 递归函数:
  • 函数可以调用自身,这称为递归。
  • 递归通常用于解决可以分解为相同问题的小规模问题的场景,如遍历目录、解析嵌套数据等。
  • 需要谨慎使用递归以避免无限递归和栈溢出的问题。
8. 类型注解:
  • 从Python 3.5开始,可以通过类型注解来指定函数的参数和返回值类型。
  • 类型注解不影响Python的动态类型特性,主要用于代码提示和静态类型检查。

这些进阶知识点帮助开发者更好地理解和利用Python中的函数,从而编写出更加简洁、高效和健壮的代码。了解并掌握这些概念对于成为高级Python程序员至关重要

二.函数参数的高级使用
缺省参数

引入

缺省参数也叫做默认参数,是指定义函数时形参变量有默认值,如果调用函数时没有传递参数,那么函数就用默认值,如果传递了参数就用传递的那个数据。

示例:

python 复制代码
def print_info(name, age=35):
    print(f'name: {name}')
    print(f'age: {age}')

print_info('小明')
print_info('小明', 18)

缺省参数的作用

当调用函数时,有些参数不必传递,而是用默认值,这样的场景往往都用缺省参数

例如,一个学校现在开始检查每个学生的信息,学生说:报告老师我是xxx学校xxx系xxx年级xxx班学生,名字叫xxxx,大家想只要是这学校的学生那么xxx学校就可以省略不用说了,因为大家都知道。所以就可以认为默认的学校就是xxx,而当其他学校的学生介绍时yyy学校名字案例说就一定要说清楚,否则会让人混淆。

示例:

python 复制代码
def print_info(name, class_name, grade, department_name, school_name="清华大学"):
    print("老师好:我是来自 %s(大学) %s系 %s年级 %s班级 的学生,我叫%s" % (
        school_name,
        department_name,
        grade,
        class_name,
        name
    ))


print_info("小明", "爬虫", "二", "软件工程")
print_info("小明", "爬虫", "二", "软件工程", "北京大学")

注意点

  • 缺省参数只能在形参的最后(即最后侧)
  • 缺省参数全挨在一起(在右侧),不是缺省参数挨在一起(在左侧)
python 复制代码
>>> def printinfo(name, age=35, sex):
...     print(name)
...
File "<stdin>", line 1
SyntaxError: non-default argument follows default argument
命名参数

引入

命名参数是指:在调用函数时,传递的实参带有名字,这样的参数叫做命名参数

示例:

python 复制代码
def test(a, b):
    print('-----')
    print(f'a={a}')
    print(f'b={b}')

test(11, 22)
test(a=11, b=22)
test(a=22, b=11)  # 根据名称将值传入到指定的变量中

命名参数的作用

命名参数能够在调用函数的时候,不受位置的影响,可以给需要的参数指定传递数据

注意点

  • 命名参数的名字要与形参中的名字相同,不能出现命名参数名字叫做num,而形参中没有变量num
  • 如果形参左侧有普通的形参,调用函数时传递的参数一定要先满足这些形参,然后再根据需要编写命名参数
python 复制代码
def test(a, b, c=100, d=200):
    print("a=%d, b=%d, c=%d, d=%d" % (a, b, c, d))


# 下面的方式都成功
test(11, 22)
test(11, 22, 33)
test(11, 22, 33, 44)
test(11, 22, d=33, c=44)

# 下面的方式都失败
test(c=1, d=2)  # 缺少a、b的值
test(c=1, d=2, 11, 22)  # 11, 22应该在左侧
不定长参数

引入

不定长参数:定义函数的时候形参不确定到底有多少个,这样的参数就叫做不定长参数

不定长参数有两种方式表示:

  • *args :表示调用函数时多余的未命名参数都会以元组的方式存储到args中
  • **kwargs:表示调用函数时多余的命名参数都会以键值对的方式存储到kwargs中

注意:

  • *和**是必须要写的,否则就变成了普通的形参了
  • 当我们说不定长参数的时候,就是指*args和**kwargs

示例:

python 复制代码
def test(a, b, *args, **kwargs):
    print(a, type(a))
    print(b, type(b))
    print(args, type(args))
    print(kwargs, type(kwargs))

test(11, 22, 33, 44, 55, 66, name='小明', address='兰州')

不定长参数的作用

通过不定长参数,能够实现调用函数时传递实参个数可以随意变换的需求

注意点

  • 加了星号*的变量args会存放所有未命名的变量参数,args为元组
  • 而加**的变量kwargs会存放命名参数,即形如key=value的参数, kwargs为字典
  • 一般情况下*args、**kwargs会在形参的最右侧
  • args与kwargs的名字可以变,例如叫*aa,**bb都是可以,但一般为了能够让其他的开发者快速读懂我们的代码最好还是不改

特殊情况

缺省参数在*args的后面

python 复制代码
def sum_nums_3(a, *args, b=22, c=33, **kwargs):
    print(a)
    print(b)
    print(c)
    print(args)
    print(kwargs)


sum_nums_3(100, 200, 300, 400, 500, 600, 700, b=1, c=2, mm=800, nn=900)

输出结果:

100
1
2
(200, 300, 400, 500, 600, 700)
{'mm': 800, 'nn': 900}

说明:

  • *args后可以有缺省参数,想要给这些缺省参数在调用时传递参数,需要用命名参数传递,否则多余的未命名参数都会给args
  • 如果有**kwargs的话,**kwargs必须是最后的
三.返回值拆包

返回值拆包概述

函数返回值拆包:如果一个函数通过return返回了一个元组、列表、集合,可以通过拆包的方式将返回值进行拆分到每个变量中,这就是返回值拆包。

示例:

python 复制代码
def test():
    return 11, 22, 33

a, b, c = test()
print(a, b, c)

返回值拆包的作用

通过函数返回值拆包,可以快速的将具体的数据用变量进行存储,这样对数据的处理会更加方便

示例:

python 复制代码
def test():
    return 11, 22, 33


# 通过返回值拆包,快速使用每个数据
a, b, c = test()
print(a + b + c)

# 没有通过返回值拆包,这样用数据时稍微复杂
ret = test()
print(ret[0] + ret[1] + ret[2])

拆包的使用

python 复制代码
def get_my_info():
    high = 178
    weight = 100
    age = 18
    return high, weight, age


# result = get_my_info()
# print(result)

# 通过返回值拆包,能够更加方便的对每个数据使用
my_high, my_weight, my_age = get_my_info()
print(my_high)
print(my_weight)
print(my_age)

使用拆包时的注意点

  • 拆包时要注意,需要拆的数据的个数要与变量的个数相同,否则程序会异常
相关推荐
思则变2 小时前
[Pytest] [Part 2]增加 log功能
开发语言·python·pytest
漫谈网络3 小时前
WebSocket 在前后端的完整使用流程
javascript·python·websocket
try2find4 小时前
安装llama-cpp-python踩坑记
开发语言·python·llama
博观而约取5 小时前
Django ORM 1. 创建模型(Model)
数据库·python·django
精灵vector6 小时前
构建专家级SQL Agent交互
python·aigc·ai编程
Zonda要好好学习7 小时前
Python入门Day2
开发语言·python
Vertira7 小时前
pdf 合并 python实现(已解决)
前端·python·pdf
太凉7 小时前
Python之 sorted() 函数的基本语法
python
项目題供诗7 小时前
黑马python(二十四)
开发语言·python
晓13138 小时前
OpenCV篇——项目(二)OCR文档扫描
人工智能·python·opencv·pycharm·ocr