Python函数学习记录--七十二变

目录

1. 术之本源--函数的定义

2. 灵力流转--参数与返回值

2.1 参数

2.1.1 位置参数

2.1.2 默认参数

2.1.3 关键字参数

2.1.4 可变参数--*args

2.1.5 可变参数--**kwargs

2.1.6 *args和**kwargs同时使用

2.1.7 特殊字符-- / 和 *

2.2 返回值

3. 无尽丹田--作用域

3.1 global

3.2 nonlocal

4 身化万千--高阶函数

4.1 函数作为参数

4.2 函数作为返回值

5. 隐身--匿名函数

5.1 基本用法

5.2 嵌套匿名函数

5.3 匿名函数与高阶函数

6. 生生不息--递归函数

7. 法天相地--装饰器

8. 毫毛化身--迭代器与生成器

8.1 迭代器

8.2 生成器


1. 术之本源--函数的定义

Python函数通过def关键字定义,函数的基本结构如下:

def 函数名(参数):
    # 函数体
    return 返回值

# ------示例------
def great(name):
    return f"你好, {name}"

# 调用函数
print(great('大圣'))

2. 灵力流转--参数与返回值

2.1 参数

2.1.1 位置参数

按照顺序传递的参数,输入时传入的参数按照位置与函数定义中的参数对应。示例如下:

def change_shape(shape, color):
    return f"变成了{color}的{shape}"

print(change_shape("大圣", "金色"))

2.1.2 默认参数

为参数提供默认值。当输入时没有传入参数时,函数调用默认值工作,同时要注意,使用默认参数时,参数要放在所有参数的后面。示例如下:

def change_shape(shape="大圣", color="金色"):
    return f"变成了{color}的{shape}"

print(change_shape())

2.1.3 关键字参数

接收键值对形式的参数,通过关键字针对性的传入参数,不必考虑在函数中该参数对应的位置是哪里。示例如下:

def change_shape(shape, color):
    return f"变成了{color}的{shape}"

print(change_shape(color = "金色", shape = "大圣"))

当调用函数时要注意,关键字参数必须要位置参数之后:

def change_shape(shape, color):
    return f"变成了{color}的{shape}"

print(change_shape("大圣", color="金色"))

2.1.4 可变参数--*args

接受任意数量的参数。python中提供了两种可变参数:*args和**kwargs。

*args使用示例如下:

# *args:用于接收任意数量的位置参数,存储为一个元组
def change_shape(*args):
    for shape in args:
        print(f"变成了{shape}")

change_shape("大圣", "弼马温", "猴子")

*args结合其他参数使用时,必须放在普通参数之后,此时,*args接受位置参数之后的所有参数:

def change_shape(color, *shapes):
    for shape in shapes:
        print(f"变成了{color}的{shape}")

change_shape("金色", "大圣", "孙猴子", "弼马温")

2.1.5 可变参数--**kwargs

**kwargs用于接收任意数量的关键字参数,并将它们打包成一个字典。

def change_shape(**kwargs):
    for key, value in kwargs.items():
        print(f"{key}变成了{value}!")

change_shape(猴子="老虎", 老鹰="凤凰", 大树="石头")

**kwargs结合其他参数使用时,必须放在所有参数之后。

def change_shape(color, **shapes):
    for key, value in shapes.items():
        print(f"{key}变成了{color}的{value}")

change_shape("金色", 猴子="老虎", 老鹰="凤凰", 大叔="石头")

2.1.6 *args和**kwargs同时使用

在同一个函数中,可以同时使用*args和**kwargs,但是,需要遵循以下顺序:普通参数 > *args > **kwargs。当把普通参数放在后面时,必须使用关键字参数。

def change_shape(color, *args, **kwargs):
    for shape in args:
        print(f"变成了{color}的{shape}")
    for key, value in kwargs.items():
        print(f"变成了{key}的{value}")

change_shape("金色", "老虎", "老鹰", 猴子="石头", 大树="山")

2.1.7 特殊字符-- / 和 *

 / 用于指定某些参数必须通过位置参数的方式传递,而不能通过关键字参数的方式传递。/ 左侧,必须通过位置参数传递,/ 右侧,可以通过位置参数或关键字参数传递

def greet(name, /, message):
    print(f"{name}, {message}")

greet("大圣", message="你好")

*  用于指定某些参数必须通过关键字参数的方式传递,而不能通过位置参数的方式传递。* 右侧,必须通过关键字参数传递。

def greet(*, name, message):
    print(f"{name}, {message}")

greet(name="孙悟空", message="你好")

当结合 / 与 * 使用时,/ 左侧,必须通过位置参数传递,/ 和 * 之间可以通过位置参数或者关键字参数传递,* 右侧,必须通过关键字参数传递。

def example(a, b, /, c, *, d, e):
    print(f"a={a}, b={b}, c={c}, d={d}, e={e}")

example(1, 2, c=3, d=4, e=5)

2.2 返回值

 函数可以通过return返回一个值,也可以通过元组的形式返回多个值.

def change_shape(shape, color):
    return  shape, color

result = change_shape("老虎", "金色")
print(result)

3. 无尽丹田--作用域

函数的作用域分为局部作用域和全局作用域。函数内,如果变量名相同,局部变量优先。

3.1 global

如果要修改全局变量,可以使用global关键字

shape = "猴子" # 全局变量

def change_shape():
    shape = "老虎" # 局部变量
    print(f"函数内:{shape}")

change_shape()
print(f"函数外:{shape}")

# global关键字修改局部变量
def global_change_shape():
    global shape
    shape = "牛马" # 局部变量
    print(f"函数内:{shape}")

global_change_shape()
print(f"函数外:{shape}")

3.2 nonlocal

nonlocal的作用类似于global,但是它作用于嵌套函数的外层函数的作用域,并非是全局作用域。

x = 100

def outer():
    x = 10
    def inner():
        nonlocal x # nonlocal声明的变量必须存在于外层函数的作用域
        x = 20
    inner()
    print(f"外层函数的x: {x}")

def inner_global():
    global x
    x = 200

outer()
inner_global()
print(f"全局的x: {x}")

4 身化万千--高阶函数

python中可以将函数作为参数或者返回值使用。

4.1 函数作为参数

python中,如果要将函数作为参数使用,要注意,在调用函数参数时,不加()。

def transform(shape, action):
    return action(shape)

def change_to_tiger(shape):
    return f"{shape}变成了老虎"

print(transform("猴子", change_to_tiger))

4.2 函数作为返回值

函数作为返回值使用时,类似二维列表,调用时利用()一步一步完全调用函数。也就是说,调用外层函数时,返回内层函数的引用,内层函数产生并开始准备发挥作用。通过引用再次调用函数时,内层函数开始真正的发挥作用。

def create_transformer(action):
    def transformer(shape):
        return f"{shape}{action}"
    return transformer

# 1. 调用外层函数create_transformer,此时change_to_eagle相当于transformer函数
change_to_eagle = create_transformer("变成了老鹰")
# 2.调用change_to_eagle,进入transformer函数
print(change_to_eagle("猴子"))

5. 隐身--匿名函数

匿名函数不需要明显的使用def关键字定义函数。顾名思义,匿名函数没有名字,通常应用于定义简单的、一次性的函数逻辑。

5.1 基本用法

匿名函数通过lambda定义,因此也被称为lambda函数

# 基本语法
lambda 参数1, 参数2, ... : 表达式

# 匿名函数与def定义函数对比--以求和为例
# def函数
def add(x, y):
    return x + y

print(add(3, 5))

# 匿名函数
add = lambda x, y: x + y
print(add(3, 5))

5.2 嵌套匿名函数

def make_multiplier(n):
    return lambda x: x * n

double = make_multiplier(2)
print(double(5))

5.3 匿名函数与高阶函数

python中匿名函数和高阶函数是python中非常强大的特性。匿名函数快速定义简单的逻辑,而高阶函数则允许将函数作为参数或者返回值,两者结合,可以更灵活的使用python。

# map():对集合中的每个元素应用函数
numbers = [1, 2, 3, 4, 5]
squared_numbers = list(map(lambda x: x ** 2, numbers))
print(squared_numbers)

# filter():过滤集合中的元素
numbers = [1, 2, 3, 4, 5]
even_numbers = list(filter(lambda x: x % 2 == 0, numbers))
print(even_numbers)

# reduce():对集合中的元素进行累积计算
from functools import reduce

numbers = [1, 2, 3, 4, 5]
product = reduce(lambda x, y: x * y, numbers)
print(product)

# sorted():自定义排序规则
words = ['apple', 'banana', 'cherry', 'date']
sorted_words = sorted(words, key=lambda x: len(x))
print(sorted_words)

6. 生生不息--递归函数

递归函数通过调用自身,实现无限循环。

def change_shape(n):
    if n==0:
        return "变回原形"
    else:
        print(f"第{n}次变化")
        return change_shape(n-1)

print(change_shape(3))

7. 法天相地--装饰器

装饰器允许在不修改函数代码的情况下,动态的增加功能。其本质上是一个高阶函数,即接受一个函数作为输入,并返回一个新的函数。

def magic(func):
    def wrapper(*args, **kwargs):
        print("咒语:变变变")
        return func(*args, **kwargs)
    return wrapper

""" 
@magic的实现相当于以下步骤:
change_shape = magic(change_shape)
change_shape("老虎")
事实上是将返回的wrapper()函数更名为change_shape
"""

@magic
def change_shape(shape):
    return f"变成了{shape}"

print(change_shape("老虎"))

8. 毫毛化身--迭代器与生成器

8.1 迭代器

python中,迭代器是一种可以逐步返回元素的对象。使用iter()函数将可迭代对象(如列表、元组、字符串等)转换为迭代器。

# 使用iter()
numbers = [1, 2, 3, 4]
iter_obj = iter(numbers)

print(next(iter_obj))
print(next(iter_obj))
print(next(iter_obj))
print(next(iter_obj))
# print(next(iter_obj)) 抛出StopIteration异常

8.2 生成器

生成器是一种特殊的迭代器,使用yield语句来逐步返回值。生成器在调用yield时会暂停执行,并在下一次调用时从yield语句后继续。

# 使用yield
def my_generator():
    print("Start")
    yield 1
    print("Continue")
    yield 2
    print("End")
    yield 3

gen = my_generator()
for item in gen:
    print(item)
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值