# ===== CodeLab: Python 函数进阶:参数与作用域 =====
# 来源: https://aoerliang.dpdns.org/articles/python-functions
# 以下代码片段按文章出现顺序拼接, 共 8 段

# ----- 片段 1 (python) -----
def change(a, lst):
    a = a + 1          # 重新绑定,外部不受影响
    lst.append(99)     # 原地修改,外部可见

x, my_list = 10, [1, 2]
change(x, my_list)
print(x)        # 10
print(my_list)  # [1, 2, 99]

# ----- 片段 2 (python) -----
def greet(name, greeting):
    return f"{greeting},{name}!"

print(greet("小明", "你好"))           # 位置参数
print(greet(greeting="早上好", name="小红"))  # 关键字参数,顺序无关

# ----- 片段 3 (python) -----
# 错误示范:默认列表会被共享
def bad(item, bag=[]):
    bag.append(item)
    return bag

print(bad("a"))  # ['a']
print(bad("b"))  # ['a', 'b']  ← 上次的结果还在!

# 正确写法:用 None 占位
def good(item, bag=None):
    if bag is None:
        bag = []
    bag.append(item)
    return bag

# ----- 片段 4 (python) -----
def collect(*args, **kwargs):
    print("位置参数:", args)
    print("关键字参数:", kwargs)

collect(1, 2, 3, name="Python", year=1991)
# 位置参数: (1, 2, 3); 关键字参数: {'name': 'Python', 'year': 1991}

# ----- 片段 5 (python) -----
def divide(a, b):
    return a // b, a % b   # 商和余数

quotient, remainder = divide(17, 5)
print(quotient, remainder)   # 3 2

# ----- 片段 6 (python) -----
count = 0   # 全局变量

def increment():
    global count   # 声明后才可以修改全局
    count += 1

increment()
increment()
print(count)   # 2

# ----- 片段 7 (python) -----
def counter():
    n = 0
    def add():
        nonlocal n
        n += 1
        return n
    return add

c = counter()
print(c())
print(c())

# ----- 片段 8 (python) -----
students = [("Ada", 92), ("Bob", 78), ("Cara", 85)]
# 按分数降序排序
students.sort(key=lambda s: s[1], reverse=True)
print(students)   # [('Ada', 92), ('Cara', 85), ('Bob', 78)]

nums = [1, 2, 3, 4, 5]
print(list(filter(lambda x: x % 2 == 1, nums)))  # [1, 3, 5]
print(list(map(lambda x: x * 10, nums)))         # [10, 20, 30, 40, 50]
