当前位置: 首页 > news >正文

Python学习第五天

         函数是Python编程中最重要的概念之一。无论是编写简单的脚本还是开发复杂的应用程序,函数都是组织代码、提高代码复用性和可维护性的关键工具。本文将带你从基础到高级,全面了解Python函数的使用( 也可点击Python官网关于函数的叙述)。

概念

        函数是一段可重复使用的代码块(可以称为方法或者说本质就是方法),用于执行特定的任务。通过将代码封装在函数中,你可以避免重复编写相同的代码,并使程序更加模块化和易于维护。

函数的定义

        在Python中,使用 def 关键字来定义一个函数。函数定义的基本语法如下:

def function_name(parameters):
    """函数文档字符串"""
    # 函数体
    return value
  • function_name:函数的名称,遵循标识符命名规则。

  • parameters:函数的参数列表,可以有多个参数,也可以没有参数。

  • """函数文档字符串""":可选的文档字符串,用于描述函数的功能。

  • return value:可选的返回值,用于将结果返回给调用者。

函数的调用

定义函数后,可以通过函数名加括号的方式来调用函数。如果函数有参数,调用时需要传入相应的参数。

def greet(name):
    """向指定的人打招呼"""
    print(f"Hello, {name}!")

greet("Alice")  # 输出: Hello, Alice!

函数的参数

Python函数支持多种类型的参数,包括位置参数、关键字参数、默认参数和可变长度参数。

位置参数

位置参数是最常见的参数类型,调用函数时需要按照定义时的顺序传入参数。

def add(a, b):
    return a + b

result = add(3, 5)  # 输出: 8

关键字参数

关键字参数允许你通过参数名来指定参数值,这样可以不按照顺序传入参数。

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

greet(message="Hi", name="Bob")  # 输出: Hi, Bob!

默认参数

默认参数允许你为参数指定默认值。如果调用函数时没有传入该参数,则使用默认值。

def greet(name, message="Hello"):
    print(f"{message}, {name}!")

greet("Alice")  # 输出: Hello, Alice!
greet("Bob", "Hi")  # 输出: Hi, Bob!

可变长度参数

有时你可能需要处理不确定数量的参数。Python提供了两种可变长度参数:*args 和 **kwargs

  • *args:用于接收任意数量的位置参数,参数会被打包成一个元组。

  • **kwargs:用于接收任意数量的关键字参数,参数会被打包成一个字典。

def print_args(*args, **kwargs):
    print("位置参数:", args)
    print("关键字参数:", kwargs)

print_args(1, 2, 3, name="Alice", age=25)
# 输出:
# 位置参数: (1, 2, 3)
# 关键字参数: {'name': 'Alice', 'age': 25}

返回值

函数可以通过 return 语句返回一个值。如果没有 return 语句,函数默认返回 None

返回单个值

def add(a, b):
    return a + b

result = add(3, 5)  # result = 8

返回多个值

Python函数可以返回多个值,这些值会被打包成一个元组。

def get_user_info():
    name = "Alice"
    age = 25
    return name, age

name, age = get_user_info()
print(name, age)  # 输出: Alice 25

作用域

作用域决定了变量的可见性和生命周期。Python中有两种主要的作用域:全局作用域和局部作用域。

局部变量和全局变量

  • 局部变量:在函数内部定义的变量,只能在函数内部访问。

  • 全局变量:在函数外部定义的变量,可以在整个程序范围内访问。

x = 10  # 全局变量

def func():
    y = 20  # 局部变量
    print(x)  # 可以访问全局变量
    print(y)

func()
print(y)  # 报错: NameError: name 'y' is not defined

global 关键字

如果你想在函数内部修改全局变量,可以使用 global 关键字。

x = 10

def func():
    global x
    x = 20

func()
print(x)  # 输出: 20

高级函数概念

Lambda 函数

Lambda函数是一种匿名函数,通常用于编写简单的、一次性的函数。

add = lambda x, y: x + y
print(add(3, 5))  # 输出: 8

高阶函数

高阶函数是指接受其他函数作为参数或返回函数的函数。Python内置的高阶函数包括 map()filter() 和 reduce()

from functools import reduce
# 定义函数
def aaa():
    pass

# 多参数行为 *args:用于接收任意数量的位置参数,参数会被打包成一个元组。**kwargs:用于接收任意数量的关键字参数,参数会被打包成一个字典。
def print_args(*args, **kwargs):
    print("位置参数:", args)
    print("关键字参数:", kwargs)
print_args(1, 2, 3, name="Alice", age=25)

def args(*ars,**param):
    print("位置参数:", ars)
    print("关键字参数:", param)

print_args(1, 'Alice', 3, name="Alice", age=25)

f = lambda a: a**2
print(f(2))

# filter 过滤使用 filter(第一个参数是bool,第二个参数是元组)
even_numbers = list(filter(lambda x: x % 2 == 1, range(10)))
print(even_numbers)  # 输出:[1, 3, 5, 7,9]


# reduce() 函数会对参数序列中元素进行累积 比如 两数相加(LeetCode真题) 0 -10的数相加是多少
reduce_value = reduce(lambda x,y: x+y , range(10)) # 使用时pycharm 自动会引入 from functools import reduce如果不会请手动
print(reduce_value)  # 输出:45 = 0+1+2+3+4+5+6+7+8+9
total = 0
# 测试正确性 lambda x,y: x+y 就是每一项  total += i 累加过程就是reduce的作用
for i in range(10):
    total += i
print(total) # 输出:45 

装饰器

装饰器是一种用于修改或扩展函数行为的高阶函数。装饰器通常用于日志记录、权限检查、性能测试等场景。

def my_decorator(func):
    def wrapper():
        print("Something is happening before the function is called.")
        func()
        print("Something is happening after the function is called.")
    return wrapper

@my_decorator
def say_hello():
    print("Hello!")

say_hello()
# 输出:
# Something is happening before the function is called.
# Hello!
# Something is happening after the function is called.

实践项目

计算器程序

编写一个简单的计算器程序,使用函数实现加、减、乘、除操作。

def add(a, b):
    return a + b

def subtract(a, b):
    return a - b

def multiply(a, b):
    return a * b

def divide(a, b):
    if b == 0:
        return "Error: Division by zero"
    return a / b

print(add(10, 5))  # 输出: 15
print(subtract(10, 5))  # 输出: 5
print(multiply(10, 5))  # 输出: 50
print(divide(10, 5))  # 输出: 2.0

猜数字游戏

编写一个简单的猜数字游戏,使用函数实现游戏逻辑。

import random

def guess_number():
    number = random.randint(1, 100)
    attempts = 0

    while True:
        guess = int(input("Guess the number (1-100): "))
        attempts += 1

        if guess < number:
            print("Too low!")
        elif guess > number:
            print("Too high!")
        else:
            print(f"Congratulations! You guessed the number in {attempts} attempts.")
            break

guess_number()

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.dtcms.com/a/50587.html

相关文章:

  • 城市管理综合执法系统源码,B/S模式与手机等移动终端架构,java语言开发,可扩展性强
  • 基于 vLLM 部署 LSTM 时序预测模型的“下饭”(智能告警预测与根因分析部署)指南
  • 【学Rust写CAD】10 加法器
  • C++ Primer 动态数组
  • React面试葵花宝典之三
  • Gpt翻译完整版
  • CentOS 7使用RPM安装MySQL
  • 区块链-未来世界的网络形态?
  • 蓝桥杯备考:记忆化搜索之function
  • 通义万相2.1:开启视频生成新时代
  • 若依ruoyi响应json参数
  • LeetCode 21. 合并两个有序链表(Python)
  • 阿里万相,正式开源
  • SLAM文献之-DROID-SLAM: Deep Visual SLAM for Monocular, Stereo, and RGB-D Cameras
  • Android中的ANR(Application Not Responding)现象
  • 计算机网络进化史:从烽火台到元宇宙的信息高速公路
  • Android中的AtomicLong:原理、使用与实战指南
  • SpringBoot 整合 Vault - 解决敏感配置信息的动态加密与权限管控问题
  • 一些有用的电子书
  • 四十二:VSCODE打开新文件覆盖上一个文件窗口问题
  • 特征工程如何让KNN准确率提升20%?标准化、筛选与编码全解析
  • 动规【力扣】72. 编辑距离
  • 【Python运维】用Python自动化AWS资源管理:利用boto3实现高效管理S3桶和EC2实例
  • MySQL-简介与基本命令
  • LeetCode 热题 100----1.两数之和
  • 题目 3216 ⭐团建⭐【DFS】蓝桥杯2024年第十五届省赛
  • AI 编译器学习笔记之十六 -- TVM
  • 在 MyBatis 中,若数据库字段名与 SQL 保留字冲突解决办法
  • Spring Boot Gradle 项目中使用 @Slf4j 注解
  • 容器与虚拟机:云时代的底层架构博弈