Python函数知识点大全(一)

简介: 教程来源 http://unbgv.cn/category/shengxiaocaiyun.html 本文系统梳理Python函数核心知识:从基础定义、返回值、类型注解,到参数传递(位置/关键字/可变/特殊参数)、作用域(LEGB规则、闭包、nonlocal)、嵌套函数等,涵盖简洁语法与高级特性,助力初学者构建完整体系,也为进阶者提供深度参考。

函数是Python程序的基本组成单元,是组织代码、实现逻辑复用、降低复杂度的核心手段。Python的函数设计体现了“简洁、优雅、高效”的语言哲学:从灵活的参数传递机制、强大的装饰器,到支持函数式编程的Lambda表达式和高阶函数,Python的函数体系为开发者提供了丰富而强大的编程能力。本文将系统全面地梳理Python函数的核心知识点,从基础语法到高级特性,帮助初学者建立完整的知识体系,也为有经验的开发者提供深入的技术参考。
42acce4e-feee-4be1-b3f0-ef10e1d78aeb.png

一、函数基础

1.1 函数定义与调用

# 函数定义:使用def关键字
def say_hello():
    """简单的问候函数"""
    print("Hello, World!")

# 带参数的函数
def greet(name):
    """带参数的函数"""
    print(f"Hello, {name}!")

# 带返回值的函数
def add(a, b):
    """返回两个数的和"""
    return a + b

# 函数调用
say_hello()
greet("Python")
result = add(10, 20)
print(f"结果: {result}")

# 函数文档字符串
print(help(add))
print(add.__doc__)

1.2 函数返回值

# 返回单个值
def square(x):
    return x ** 2

# 返回多个值(实际是返回元组)
def get_min_max(numbers):
    return min(numbers), max(numbers)

# 无返回值(返回None)
def do_nothing():
    pass  # 隐式返回None

# 提前返回
def check_age(age):
    if age < 0:
        return  # 提前退出,返回None
    return age >= 18

# 返回列表
def get_even_numbers(limit):
    return [i for i in range(limit) if i % 2 == 0]

# 返回字典
def get_person_info(name, age):
    return {"name": name, "age": age}

# 使用示例
num = square(5)
print(f"平方: {num}")

min_val, max_val = get_min_max([1, 3, 5, 2, 4])
print(f"最小值: {min_val}, 最大值: {max_val}")

even_nums = get_even_numbers(10)
print(f"偶数: {even_nums}")

1.3 类型注解(Type Hints)

# Python 3.5+ 支持类型注解
from typing import List, Dict, Optional, Union, Tuple

# 基本类型注解
def add_numbers(a: int, b: int) -> int:
    """带类型注解的函数"""
    return a + b

# 列表类型
def process_numbers(numbers: List[int]) -> List[int]:
    return [n * 2 for n in numbers]

# 字典类型
def get_user_info(user_id: int) -> Dict[str, str]:
    return {"id": str(user_id), "name": "张三"}

# 可选类型
def find_user(user_id: int) -> Optional[Dict[str, str]]:
    if user_id == 1:
        return {"name": "张三"}
    return None

# 联合类型
def process_value(value: Union[int, str]) -> str:
    return str(value)

# 元组类型
def get_coordinates() -> Tuple[int, int]:
    return (10, 20)

# 自定义类型别名
UserId = int
UserInfo = Dict[str, str]

def get_user(uid: UserId) -> UserInfo:
    return {"id": str(uid), "name": "用户"}

# 类型注解不影响运行时
result = add_numbers(10, 20)
print(result)

二、参数传递

2.1 位置参数与关键字参数

# 位置参数:按位置传递
def describe_pet(name, animal_type):
    print(f"我有一只{animal_type},名字叫{name}")

# 关键字参数:按名称传递
describe_pet(name="旺财", animal_type="狗")
describe_pet(animal_type="猫", name="咪咪")

# 混合使用:位置参数必须在关键字参数之前
describe_pet("小黑", animal_type="兔子")

# 默认参数
def greet(name, greeting="Hello"):
    print(f"{greeting}, {name}!")

greet("张三")           # 使用默认问候语
greet("李四", "Hi")     # 自定义问候语

# 默认参数陷阱:不要使用可变对象作为默认值
# 错误示例
def add_item(item, lst=[]):  # 危险!默认列表会被共享
    lst.append(item)
    return lst

# 正确示例
def add_item_correct(item, lst=None):
    if lst is None:
        lst = []
    lst.append(item)
    return lst

print(add_item_correct(1))  # [1]
print(add_item_correct(2))  # [2] 不会被共享

2.2 可变参数

# *args:接收任意多个位置参数(元组)
def sum_all(*args):
    """计算所有参数的和"""
    total = 0
    for num in args:
        total += num
    return total

print(sum_all(1, 2, 3))        # 6
print(sum_all(10, 20, 30, 40)) # 100

# **kwargs:接收任意多个关键字参数(字典)
def print_info(**kwargs):
    """打印关键字参数"""
    for key, value in kwargs.items():
        print(f"{key}: {value}")

print_info(name="张三", age=25, city="北京")

# 混合使用
def process_data(name, *args, **kwargs):
    print(f"姓名: {name}")
    print(f"位置参数: {args}")
    print(f"关键字参数: {kwargs}")

process_data("张三", 1, 2, 3, age=25, city="北京")

# 解包参数
numbers = [1, 2, 3, 4, 5]
print(sum_all(*numbers))  # 解包列表

info = {"name": "李四", "age": 30}
print_info(**info)  # 解包字典

2.3 参数解包

# 序列解包
def add_three(a, b, c):
    return a + b + c

numbers = [10, 20, 30]
result = add_three(*numbers)
print(f"解包列表: {result}")

# 字典解包
def describe_person(name, age, city):
    print(f"{name},{age}岁,来自{city}")

person_info = {"name": "张三", "age": 25, "city": "北京"}
describe_person(**person_info)

# 混合解包
def mixed_params(a, b, *args, **kwargs):
    print(f"a={a}, b={b}")
    print(f"args={args}")
    print(f"kwargs={kwargs}")

list_args = [1, 2, 3, 4]
dict_kwargs = {"x": 10, "y": 20}
mixed_params(100, 200, *list_args, **dict_kwargs)

2.4 特殊参数(Python 3.8+)

# / 表示位置参数(不能使用关键字传递)
def func1(a, b, /, c, d):
    """a, b必须使用位置参数;c, d可以使用位置或关键字"""
    print(a, b, c, d)

func1(1, 2, 3, 4)           # 正确
func1(1, 2, c=3, d=4)       # 正确
# func1(a=1, b=2, c=3, d=4) # 错误:a,b不能使用关键字

# * 表示关键字参数(必须使用关键字传递)
def func2(a, b, *, c, d):
    """a, b可以使用位置或关键字;c, d必须使用关键字"""
    print(a, b, c, d)

func2(1, 2, c=3, d=4)       # 正确
# func2(1, 2, 3, 4)         # 错误:c,d必须使用关键字

# 组合使用
def func3(a, b, /, c, *, d, e):
    """
    a, b: 位置参数
    c: 位置或关键字
    d, e: 关键字参数
    """
    print(a, b, c, d, e)

func3(1, 2, 3, d=4, e=5)    # 正确

三、函数作用域

3.1 局部变量与全局变量

# 全局变量
global_var = "我是全局变量"

def my_function():
    # 局部变量
    local_var = "我是局部变量"
    print(f"函数内: {local_var}")
    print(f"函数内访问全局: {global_var}")

my_function()
# print(local_var)  # 错误:局部变量在函数外不可见

# 修改全局变量
counter = 0

def increment():
    global counter  # 声明使用全局变量
    counter += 1

increment()
increment()
print(f"counter = {counter}")

# 全局变量与局部变量同名
name = "张三"

def show_name():
    name = "李四"  # 这是局部变量
    print(f"函数内: {name}")

show_name()
print(f"函数外: {name}")

# globals()和locals()函数
x = 10
def test():
    y = 20
    print("全局变量:", globals())
    print("局部变量:", locals())

test()

3.2 嵌套函数与闭包

# 嵌套函数
def outer_function(x):
    def inner_function(y):
        return x + y
    return inner_function

# 闭包:内部函数引用外部函数的变量
def make_multiplier(n):
    """创建一个乘数函数"""
    def multiplier(x):
        return x * n
    return multiplier

times_2 = make_multiplier(2)
times_3 = make_multiplier(3)

print(times_2(10))  # 20
print(times_3(10))  # 30

# 闭包的实际应用:计数器
def make_counter():
    count = 0
    def counter():
        nonlocal count  # 声明使用外部变量(非全局)
        count += 1
        return count
    return counter

counter1 = make_counter()
counter2 = make_counter()

print(counter1())  # 1
print(counter1())  # 2
print(counter2())  # 1(独立的计数器)

# nonlocal关键字
def outer():
    x = "outer"
    def inner():
        nonlocal x  # 修改外部函数的变量
        x = "inner"
        print(f"inner: {x}")
    inner()
    print(f"outer: {x}")

outer()

3.3 LEGB规则

# LEGB: Local -> Enclosing -> Global -> Built-in

# 1. Local(局部)
def func():
    x = "local"  # 局部作用域
    print(x)

# 2. Enclosing(闭包)
def outer():
    x = "enclosing"
    def inner():
        print(x)  # 查找闭包作用域
    inner()

# 3. Global(全局)
x = "global"
def func2():
    print(x)  # 查找全局作用域

# 4. Built-in(内置)
print(len("hello"))  # len是内置函数

# 演示查找顺序
def demonstrate_legb():
    x = "local"
    def inner():
        # 注释掉以下行来测试不同层级
        x = "inner_local"
        print(x)
    inner()

demonstrate_legb()

来源:
http://unbgv.cn/category/shengxiaoxingge.html

相关文章
|
13天前
|
存储 JavaScript 前端开发
JavaScript学习知识点大全(三)
教程来源 https://app-aakcgtuh1ywx.appmiaoda.com 本文系统讲解前端核心 DOM/BOM 操作与错误处理:涵盖元素选择、增删改查、属性/样式控制、事件绑定与委托;BOM 中 window、navigator、location、history 及本地存储;以及 try-catch、错误类型识别、全局异常捕获等健壮性实践,助力高效开发。
|
4天前
|
存储 弹性计算 JavaScript
阿里云服务器优惠价格:月付9.9元与年付38元、99元和199元配置及购买资格介绍
2026年,阿里云推出多款特价云服务器,新用户可享轻量应用服务器限时抢购:2核2G配置38元/年,2核4G配置9.9元/月或199元/年。新老用户同享ECS特惠:经济型e实例2核2G 99元/年,通用算力型u1实例2核4G 199元/年,覆盖多地域,支持同价续费。
|
网络协议 Android开发 数据安全/隐私保护
Android手机上使用Socks5全局代理-教程+软件
Android手机上使用Socks5全局代理-教程+软件
11763 2
|
10天前
|
人工智能 机器人 网络安全
新手必看!阿里云部署OpenClaw保姆级图文步骤+企业微信接入教程+新手避坑指南
在2026年企业数字化与AI自动化深度融合的浪潮中,OpenClaw(原Clawdbot,曾用名Moltbot)凭借开源特性、灵活的插件生态与强大的任务执行能力,成为企业办公、团队协作与个人效率提升的核心工具。这款开源AI智能体框架,截至2026年3月,在GitHub平台星标数量已突破24万,Fork数超4.5万,支持通过自然语言完成文件管理、信息检索、流程自动化、多端协同等多样化任务。而企业微信作为国内领先的企业级协同办公平台,覆盖超6000万企业组织,具备消息触达、客户联系、客户群管理、客户朋友圈、审批流、微盘存储、机器人集成等核心优势,是企业办公、团队协作、内部沟通与客户服务的首选载体。
740 1
|
25天前
|
弹性计算 运维 安全
阿里云轻量应用服务器与ECS云服务器的区别及选择指南
阿里云轻量应用服务器与ECS云服务器定位互补:前者开箱即用、一键部署,适合个人开发者及轻量场景;后者弹性灵活、性能卓越,支撑企业级复杂业务。本文从定位、配置、网络、安全、成本等维度深度对比,帮助大家按需选型,降本增效。
212 2
|
27天前
|
存储 弹性计算 关系型数据库
阿里云“99计划”是什么?99计划云服务器具体配置、价格和购买规则介绍
阿里云“99计划”是面向开发者、初创企业及个人用户的长期优惠活动,提供低价长效云服务器,含经济型e实例(99元/年)和通用算力型u1实例(199元/年),旨在降低上云门槛。计划包含多种配置,满足不同业务需求,且支持新购与续费同价,活动延期至2027年3月31日。此外,阿里云还提供云服务器与域名、数据库、存储的组合套餐,简化上云流程,助力用户轻松实现数字化转型。
|
1月前
|
弹性计算 运维 安全
阿里云轻量应用服务器 vs ECS:区别 + 选择指南,看完不踩坑!
阿里云ECS是企业级云服务器,支持高并发、弹性伸缩与复杂架构,适合中大型应用;轻量应用服务器则面向个人开发者,预装应用镜像、操作简单、成本可控,适用于博客、学习测试等轻量场景。二者在性能、功能、运维及计费上各有侧重,按需选择即可。(239字)
317 1
|
云安全 人工智能 安全
马年专属平安签已上线,诚邀您参与「云上体检 开签纳福」互动活动!
阿里云「云上体检 开签纳福」活动:扫码抽马年平安签,获云上安全寄语;完成「2026云上安全健康体检」即领福气盲盒(100%中奖),分享签文截图还可抽AirPods 4等大奖!
|
13天前
|
人工智能 Linux API
OpenClaw+大模型构建超级个体工作流:阿里云、MacOS/Linux/Windows11部署详细步骤与自动化开发实战
在AI辅助开发全面普及的2026年,掌握OpenClaw智能体编排框架,搭配高性能大模型,能够快速实现从需求分析、代码生成、单元测试到部署上线的全流程自动化,让个人开发者实现“一人成团队”的超级个体工作模式。本文基于实战场景,完整讲解OpenClaw环境配置、MiniMax与千问/Coding Plan API对接、多模型回退保障、自动化项目生成流程,同时提供2026年阿里云服务器部署、MacOS/Linux/Windows11本地部署详细步骤,搭配全套可直接运行代码命令与常见问题解决方案,帮助开发者快速从手动编码转向AI指挥模式,大幅提升开发效率。
664 6
|
17天前
|
JavaScript 前端开发 API
VUE前端初级新手知识大全(一)
教程来源 https://app-a6nw7st4g741.appmiaoda.com/ Vue.js是轻量、易上手的渐进式前端框架,专注视图层,支持声明式编程与MVVM模式。本文系统讲解入门知识:从CDN/CLI环境搭建、核心语法(插值、指令、ref/reactive)、响应式原理,到计算属性与侦听器,助你快速构建首个Vue应用。

热门文章

最新文章