首页 > 编程语言 >Python进阶学习笔记-函数篇

Python进阶学习笔记-函数篇

时间:2024-06-23 14:43:57浏览次数:20  
标签:function return 进阶 Python 笔记 func print def 函数

函数的特殊参数

# /前的参数只能是位置参数,*后面的只能是关键字参数,之间的不限参数类型
def func(a, b, /, c, *, d, e):
    print(a, b, c, d, e)

func(1, 2, 3, d=4, e=5)
func(1, 2, c=3, d=4, e=5)  # a,b不能以关键字形式传参,d,e只能以关键字参数传参

# 可变参数*args
def func(*args):
    print(type(args))
    print(*args)
func(1, 2)  # 输出的内容为 <class 'tuple'> ,通过元组的格式进行存储

# 可变参数*kwargs
def func(**kwargs):
    print(type(kwargs))
    print(kwargs)
func(a=1 , b=2)  # 输出的内容为  <class 'dict'> ,通过字典的格式进行存储

# 参数解包
def func(a, b, c):
    print(a, b, c)
args = [1, 2, 3]
func(*args)  # 解包列表 
args = (1, 2, 3)
func(*args)  # 解包元组 
s = "hello"
func(*s)  # 解包字符串,将字符串的每个字符作为单独的参数传递 
d = {'a': 1, 'b': 2, 'c': 3}
func(*d.values())  # 解包字典的值 1, 2, 3

def func(a, b, *c):
    print(a, b, c)
args = [1, 2, 3, 4, 5]
func(*args)  # 1, 2, (3, 4, 5)

def func(a, b, c, d):
    print(a, b, c, d)
args = [1, 2, 3, 4, 5]
func(args[0], *args[1:])  # 1, 2, 3, 4

闭包

# 闭包是一个函数和它所引用的环境组合的一个整体。在Python中,闭包通常是在一个函数内定义另一个函数,并且这个内部函数引用了外部函数中的变量。

def outer_func(x):
    def inner_func(y):
        return x * y
    return inner_func

my_closure = outer_func(5)
result = my_closure(7)
print(result)  # 输出: 35

装饰器

# 定义一个装饰器函数来计算函数执行时间
def timer(func):
    def wrapper(*args, **kwargs):
        start_time = time.perf_counter()
        result = func(*args, **kwargs)
        end_time = time.perf_counter()
        execution_time = end_time - start_time
        print(f"函数 {func.__name__} 执行耗时: {execution_time} 秒")
        return result
    return wrapper
 
# 使用装饰器
@timer  # 等同于 example = timer(example)
def example():
    time.sleep(1)
    print("这是一个示例函数。")
 
# 调用被装饰的函数
example()

LEGB规则(变量作用域)

# Local(局部)作用域示例
def my_function():
    x = 10
    print(x)

my_function()  # 输出结果为 10
print(x)  # 报错,x未定义

# Enclosing(嵌套)作用域示例
def outer_function():
    x = 10
    
    def inner_function():
        print(x)
    
    inner_function()  # 输出结果为 10

outer_function()

# Global(全局)作用域示例
x = 10

def my_function():
    print(x)

my_function()  # 输出结果为 10
print(x)  # 输出结果为 10

# Built-in(内建)作用域示例
print("Hello, World!")  # 输出结果为 Hello, World!

# LEGB规则的应用示例
x = 10

def outer_function():
    x = 20
    
    def inner_function():
        nonlocal x
        x = 30
        print("Inner function:", x)
    
    inner_function()
    print("Outer function:", x)

outer_function()
print("Global:", x)

Lambda表达式

# Python 中的lambda表达式是一种定义匿名函数的方式,它允许你创建简洁的、没有名字的函数。

lambda arguments: expression
# arguments 是函数的参数列表,可以包含多个参数,也可以不包含参数。
# expression 是函数体,可以是任意的表达式。
# Lambda表达式的返回值是一个函数对象,可以将其赋值给一个变量,并通过变量来调用该函数。

# 以下是一些使用lambda表达式的例子:
# 定义一个求两数之和的函数:add = lambda x, y: x + y
# 定义一个比较两个数大小的函数:mx = lambda n1, n2: n1 if n1 > n2 else n2
# 使用map函数将列表中的每个元素都平方:squares = list(map(lambda x: x**2, lst))
# 使用filter函数过滤出列表中的偶数:evens = list(filter(lambda x: x % 2 == 0, lst))
# 使用reduce函数计算列表中所有元素的和:total = reduce(lambda x, y: x + y, lst)

生成器

def fibonacci(n):  # 定义一个斐波那契数列的生成器函数
    a, b, counter = 0, 1, 0
    while True:
        if (counter > n): 
            return
        yield a
        a, b = b, a + b
        counter += 1
 
f = fibonacci(10)  # 创建一个生成器实例,生成10个数字
while True:
    try:
        print(next(f), end=" ")
    except StopIteration:
        break

生成器表达式

# 使用列表推导式生成一个平方列表
squares = [x**2 for x in range(10)]
print(squares)  # 输出: [0, 1, 4, 9, 16, 25, 36, 49, 64, 81]
 
# 使用生成器表达式替代列表推导式以节省内存
squares_gen = (x**2 for x in range(10))
print(list(squares_gen))  # 输出: [0, 1, 4, 9, 16, 25, 36, 49, 64, 81]

# 生成器迭代
squares_gen = (x**2 for x in range(10))
while True:
    try:
        print(next(squares_gen), end=" ")
    except StopIteration:
        break

递归

# 在使用递归时,必须有一个明确的退出条件,否则,递归将无限进行下去,最终导致栈溢出错误
# 计算阶乘
def factorial(n):
    if n == 0:
        return 1
    else:
        return n * factorial(n-1)
 
print(factorial(5))  # 输出: 120

# 求斐波那契数列
def fibonacci(n):
    if n == 0:
        return 0
    elif n == 1:
        return 1
    else:
        return fibonacci(n-1) + fibonacci(n-2)
 
print(fibonacci(10))  # 输出: 55

# 排列组合
def perm(lst, n):
    if n == 1:
        return [lst]
    else:
        l = []
        for i in range(len(lst)):
            t = lst[:i] + lst[i+1:]
            p = perm(t, n-1)
            for j in p:
                l.append(lst[i:i+1] + j)
        return l
 
lst = [1, 2, 3]
print(perm(lst, len(lst)))  # 输出: [[1, 2, 3], [1, 3, 2], [2, 1, 3], [2, 3, 1], [3, 1, 2], [3, 2, 1]]

# 搜索树的深度
def depth(node):
    if node is None:
        return 0
    else:
        return 1 + max(depth(node.left), depth(node.right))

高阶函数

# reduce函数累积运算
from functools import reduce
# 定义一个加法函数
def add(x, y):
    return x + y
# 使用reduce来累加列表中的数字
numbers = [1, 2, 3, 4, 5]
result = reduce(add, numbers)
print(result)  # 输出15

# 偏函数partial函数将一个或多个参数预设为特定值
from functools import partial
# 一个简单的函数,用于将两个数字相乘并返回结果
def multiply(x, y):
    return x * y
# 使用partial创建一个新函数,预设y的值为2
double = partial(multiply, y=2)
# 当调用double时,只需要提供一个x参数
result = double(3)  # 相当于multiply(3, 2)
print(result)  # 输出: 6

# warps装饰器保留原函数的元信息
import functools
def my_decorator(func):
    @functools.wraps(func)
    def wrapper(*args, **kwargs):
        # 在调用函数之前可以添加操作
        result = func(*args, **kwargs)
        # 在调用函数之后可以添加操作
        return result
    return wrapper
@my_decorator
def my_function():
    """这是一个测试函数"""
    print("Hello, World!")
print(my_function.__name__)  # 输出: my_function
print(my_function.__doc__)   # 输出: 这是一个测试函数
# 如果我们不使用functools.wraps,那么执行上述代码,将会输出:
wrapper
None

标签:function,return,进阶,Python,笔记,func,print,def,函数
From: https://www.cnblogs.com/wanghongwei-dev/p/18263436

相关文章

  • Python进阶学习笔记-面向对象篇
    组合classEngine:"""引擎类,提供基本的引擎功能"""def__init__(self,power):self.power=powerdefstart(self):print(f"引擎启动,功率:{self.power}")classCar:"""汽车类,使用引擎类的功能"&......
  • python组合数据类型(集合)
             ......
  • python组合数据类型(列表)
              ......
  • 【Python机器学习】NMF——将NMF应用于人脸图像
    将NMF应用于之前用过的Wild数据集中的LabeledFaces。NMF的主要参数是我们想要提取的分量个数。通常来说,这个数字要小于输入特征的个数(否则的话,将每个像素作为单独的分量就可以对数据进行解释)。首先,观察分类个数如何影响NMF重建数据的好坏:importmglearn.plotsimportnumpy......
  • 硬件开发笔记(二十):AD21导入外部下载的元器件原理图库、封装库和3D模型
    若该文为原创文章,转载请注明原文出处本文章博客地址:https://hpzwl.blog.csdn.net/article/details/139707771长沙红胖子Qt(长沙创微智科)博文大全:开发技术集合(包含Qt实用技术、树莓派、三维、OpenCV、OpenGL、ffmpeg、OSG、单片机、软硬结合等等)持续更新中…硬件相关开发......
  • 硬件开发笔记(二十一):外部搜索不到的元器件封装可尝试使用AD21软件的“ManufacturerPart
    若该文为原创文章,转载请注明原文出处本文章博客地址:https://hpzwl.blog.csdn.net/article/details/139869584长沙红胖子Qt(长沙创微智科)博文大全:开发技术集合(包含Qt实用技术、树莓派、三维、OpenCV、OpenGL、ffmpeg、OSG、单片机、软硬结合等等)持续更新中…硬件相关开发......
  • python基本语法
              ......
  • 《Python编程:从入门到实践》
    书籍介绍 hi,我是神虚本书是一本针对所有层次的Python读者而作的Python入门书。全书分两部分:第一部分介绍用Python编程所必须了解的基本概念,包括matplotlib、NumPy和Pygal等强大的Python库和工具介绍,以及列表、字典、if语句、类、文件与异常、代码测试等内容;第二部......
  • python---OpenCv(二),背景分离方法较有意思
    目录边界矩形旋转矩形(最小外接矩形):计算轮廓找4个点的坐标把浮点型转为Int画轮廓边界矩形--(最大外接矩形)转灰度找轮廓找顶点画矩形显示背景分离方法(这个很好玩,可以识别在动的物体)边界矩形有两种类型的边界矩形:旋转矩形(最小外接矩形):是用最小面积绘制......
  • JavaSE 面向对象程序设计进阶 继承和方法重写 2024理论与内存详解
    继承面向对象三大特征:封装继承多态封装:对象代表什么,就封装对应的数据,并提供数据对应的行为,把零散的数据变成一个整体为什么要继承两个类中重复的代码(数据和方法)太多,所以要继承extend关键字类与类之间的父子关系让一个类和另一个类建立起继承关系publicclassStude......