首页 > 编程语言 >函数:Python中的瑞士军刀

函数:Python中的瑞士军刀

时间:2023-11-14 11:32:32浏览次数:35  
标签:return 函数 Python numbers print 瑞士军刀 def name

在Python编程语言中,函数是实现代码复用和模块化设计的重要工具。函数允许我们将一段可重用的代码块封装起来,并在需要时进行调用。这种抽象方式使代码更易于理解和维护。在这篇文章中,我们将深入探讨Python中的函数,并通过详细的代码案例来展示其用途和用法。

  1. 函数的定义

在Python中,函数可以通过def关键字进行定义。下面是一个简单的函数定义示例:

pythondef greet(name):
    return "Hello, " + name + "!"
def greet(name):
    return "Hello, " + name + "!"

这个函数接受一个参数name,并返回一个字符串,其中包含问候语和输入的名字。

  1. 函数的调用

定义函数后,我们可以使用函数名和传递给函数的参数来调用函数。以下是调用上述greet函数的示例:

pythonprint(greet("Alice"))  # 输出:Hello, Alice!
print(greet("Alice"))  # 输出:Hello, Alice!
  1. 参数传递

Python支持按值传递参数。这意味着在函数调用时,参数的值被传递给函数,而不是参数本身。在函数内部对参数进行的修改不会影响到原始的变量。

pythondef add_one(num):
    num += 1  # 对num进行加1操作
    return num

x = 5
print(add_one(x))  # 输出:6
print(x)  # 输出:5,原始值没有改变
def add_one(num):
    num += 1  # 对num进行加1操作
    return num

x = 5
print(add_one(x))  # 输出:6
print(x)  # 输出:5,原始值没有改变
  1. 默认参数和可变数量参数

我们可以为函数参数设置默认值,这样在调用函数时如果没有提供该参数的值,函数将使用默认值。可变数量参数允许函数接受任意数量的位置参数或关键字参数。

a. 默认参数

pythondef greet(name="World"):
    return "Hello, " + name + "!"

print(greet("Alice"))  # 输出:Hello, Alice!
print(greet())  # 输出:Hello, World!,因为name没有提供值,所以使用默认值World
def greet(name="World"):
    return "Hello, " + name + "!"

print(greet("Alice"))  # 输出:Hello, Alice!
print(greet())  # 输出:Hello, World!,因为name没有提供值,所以使用默认值World

b. 可变数量参数

*args 和 **kwargs

*args**kwargs是两个特殊的关键字参数,允许函数接受任意数量的位置参数和关键字参数。*args是一个元组,用于存储位置参数;**kwargs是一个字典,用于存储关键字参数。

pythondef sum_numbers(*numbers):
    total = 0
    for num in numbers:
        total += num
    return total

print(sum_numbers(1, 2, 3, 4, 5))  # 输出:15,因为1+2+3+4+5=15
def sum_numbers(*numbers):
    total = 0
    for num in numbers:
        total += num
    return total

print(sum_numbers(1, 2, 3, 4, 5))  # 输出:15,因为1+2+3+4+5=15

14:24

继续

  1. 返回值

函数可以通过return语句返回任何类型的值。这使得函数不仅可以计算和返回结果,还可以返回其他数据类型,例如列表、字典或自定义对象。

a. 返回简单值

pythondef add_two_numbers(num1, num2):
    result = num1 + num2
    return result

print(add_two_numbers(3, 5))  # 输出:8
def add_two_numbers(num1, num2):
    result = num1 + num2
    return result

print(add_two_numbers(3, 5))  # 输出:8

b. 返回多个值

Python允许函数返回多个值,这些值会以元组的形式返回。

pythondef get_details():
    name = "Alice"
    age = 25
    return name, age

person = get_details()
print(person[0])  # 输出:Alice
print(person[1])  # 输出:25
def get_details():
    name = "Alice"
    age = 25
    return name, age

person = get_details()
print(person[0])  # 输出:Alice
print(person[1])  # 输出:25

c. 返回字典

函数也可以返回字典,以便将数据存储在键值对中。

pythondef get_person_details(name, age):
    person = {"name": name, "age": age}
    return person

person = get_person_details("Bob", 30)
print(person["name"])  # 输出:Bob
print(person["age"])    # 输出:30
def get_person_details(name, age):
    person = {"name": name, "age": age}
    return person

person = get_person_details("Bob", 30)
print(person["name"])  # 输出:Bob
print(person["age"])    # 输出:30
  1. 局部变量和全局变量

在函数内部声明的变量是局部变量,只能在函数内部访问。而在函数外部声明的变量是全局变量,可以在函数外部访问。当需要在函数内部修改全局变量的值时,需要使用global关键字。

a. 局部变量

pythondef add_numbers(num1, num2):
    sum = num1 + num2  # 局部变量
    return sum
def add_numbers(num1, num2):
    sum = num1 + num2  # 局部变量
    return sum

b. 全局变量

pythonname = "Alice"  # 全局变量
name = "Alice"  # 全局变量

c. 使用global关键字修改全局变量

pythondef change_name():
    global name  # 使用global关键字声明name是全局变量
    name = "Bob"  # 修改全局变量的值
def change_name():
    global name  # 使用global关键字声明name是全局变量
    name = "Bob"  # 修改全局变量的值

继续

  1. 递归函数

递归函数是那些在其定义中调用自身或引用其他递归函数的函数。递归函数通常用于解决分治策略的问题,即将问题分解为更小的子问题,直到到达基本情况。

a. 递归示例:计算阶乘

下面是计算阶乘的递归函数示例:

pythondef factorial(n):
    if n == 0 or n == 1:  # 基本情况
        return 1
    else:
        return n * factorial(n-1)  # 递归调用

print(factorial(5))  # 输出:120,因为5的阶乘是120
def factorial(n):
    if n == 0 or n == 1:  # 基本情况
        return 1
    else:
        return n * factorial(n-1)  # 递归调用

print(factorial(5))  # 输出:120,因为5的阶乘是120

b. 递归示例:寻找列表中的最大值

下面是使用递归在列表中找到最大值的函数示例:

pythondef find_max_recursive(lst, index=0):
    if index == len(lst):  # 基本情况
        return lst[index]
    else:
        return max(lst[index], find_max_recursive(lst, index+1))  # 递归调用

numbers = [4, 2, 9, 7, 5, 1]
print(find_max_recursive(numbers))  # 输出:9,因为9是列表中的最大值
def find_max_recursive(lst, index=0):
    if index == len(lst):  # 基本情况
        return lst[index]
    else:
        return max(lst[index], find_max_recursive(lst, index+1))  # 递归调用

numbers = [4, 2, 9, 7, 5, 1]
print(find_max_recursive(numbers))  # 输出:9,因为9是列表中的最大值
  1. 装饰器

装饰器是一种高级Python功能,允许你在不修改原始函数的情况下,给函数添加额外的功能或修改其行为。装饰器本质上是一个接受函数作为参数的可调用对象,并返回一个新的函数。

a. 使用装饰器打印函数调用信息

下面是一个使用装饰器在函数调用时打印信息的示例:

pythondef log_calls(func):
    def wrapper(*args, **kwargs):
        print(f"Calling {func.__name__} with args: {args} and kwargs: {kwargs}")
        return func(*args, **kwargs)
    return wrapper

@log_calls  # 将log_calls装饰器应用于下面的add_numbers函数
def add_numbers(num1, num2):
    return num1 + num2

print(add_numbers(3, 5))  # 输出:Calling add_numbers with args: (3,) and kwargs: {},然后输出:8,因为3+5=8
def log_calls(func):
    def wrapper(*args, **kwargs):
        print(f"Calling {func.__name__} with args: {args} and kwargs: {kwargs}")
        return func(*args, **kwargs)
    return wrapper

@log_calls  # 将log_calls装饰器应用于下面的add_numbers函数
def add_numbers(num1, num2):
    return num1 + num2

print(add_numbers(3, 5))  # 输出:Calling add_numbers with args: (3,) and kwargs: {},然后输出:8,因为3+5=8

继续

  1. 生成器

生成器是Python中的一种特殊类型的迭代器,允许你在需要时按需生成数据。生成器通常用于处理大量数据,因为它们只需保存当前迭代的状态,而不是将所有数据都存储在内存中。

a. 创建生成器

生成器可以通过定义包含yield语句的函数来创建。每次从生成器中请求一个值时,执行会停止在yield语句处,并将结果作为值返回。下一次请求时,执行会从停止的地方继续。

pythondef simple_generator():
    yield "Hello"
    yield "World"
    yield "!"

# 创建生成器对象
generator = simple_generator()

# 请求生成器的值
print(next(generator))  # 输出:Hello
print(next(generator))  # 输出:World
print(next(generator))  # 输出:!
def simple_generator():
    yield "Hello"
    yield "World"
    yield "!"

# 创建生成器对象
generator = simple_generator()

# 请求生成器的值
print(next(generator))  # 输出:Hello
print(next(generator))  # 输出:World
print(next(generator))  # 输出:!

b. 使用生成器处理大型数据集

生成器在处理大型数据集时非常有用,因为它们不会一次性将所有数据加载到内存中。例如,我们可以使用生成器处理一个包含数百万条记录的大型CSV文件:

pythonimport csv

def read_csv_file(filename):
    with open(filename, 'r') as file:
        reader = csv.reader(file)
        for row in reader:
            yield row

# 使用生成器处理大型CSV文件
for row in read_csv_file('large_file.csv'):
    print(row)  # 逐行处理CSV文件,而不一次性加载所有数据到内存中。
import csv

def read_csv_file(filename):
    with open(filename, 'r') as file:
        reader = csv.reader(file)
        for row in reader:
            yield row

# 使用生成器处理大型CSV文件
for row in read_csv_file('large_file.csv'):
    print(row)  # 逐行处理CSV文件,而不一次性加载所有数据到内存中。
  1. 上下文管理器(Context Manager)

上下文管理器是Python中一个非常强大的工具,它允许我们在代码块开始和结束时执行特定的操作,比如打开和关闭文件,建立和取消线程锁等。这主要是通过使用with关键字和定义实现了__enter____exit__方法的类来实现的。

a. 使用上下文管理器处理文件操作

上下文管理器的一个常见用途是处理文件操作。使用with关键字可以确保文件在使用后被正确关闭:

pythonwith open('file.txt', 'r') as file:
    content = file.read()  # 在这个代码块中,可以安全地进行文件读取操作
# 文件现在已经被关闭,即使在读取过程中发生了异常
with open('file.txt', 'r') as file:
    content = file.read()  # 在这个代码块中,可以安全地进行文件读取操作
# 文件现在已经被关闭,即使在读取过程中发生了异常

b. 自定义上下文管理器

我们也可以创建自己的上下文管理器。例如,下面是一个创建线程锁的简单上下文管理器:

pythonclass Lock:
    def __init__(self):
        self.lock = threading.Lock()
    def __enter__(self):
        self.lock.acquire()  # 获取锁
    def __exit__(self, type, value, traceback):
        self.lock.release()  # 释放锁

# 使用自定义上下文管理器
with Lock():
    # 这个代码块会在获取锁后执行,并在执行结束后释放锁
    print("This is a locked block of code.")
class Lock:
    def __init__(self):
        self.lock = threading.Lock()
    def __enter__(self):
        self.lock.acquire()  # 获取锁
    def __exit__(self, type, value, traceback):
        self.lock.release()  # 释放锁

# 使用自定义上下文管理器
with Lock():
    # 这个代码块会在获取锁后执行,并在执行结束后释放锁
    print("This is a locked block of code.")

这些是Python的一些高级特性,它们提供了更大的灵活性和控制力,使得Python代码更加简洁、易于理解和维护。当然,Python还有许多其他的特性和库,等待你去探索和学习。

标签:return,函数,Python,numbers,print,瑞士军刀,def,name
From: https://blog.51cto.com/u_15288375/8364527

相关文章

  • Python selenium Chrome正在受到自动软件的控制 disable-infobars无效 的解决方法
    问题解决前两天更新了google浏览器版本,今天运行以前的脚本,发现options一个参数的配置不生效了。运行了几次都发现该参数没有生效,也检查了自己的代码参数,没有写错,于是就有了这一波“网中寻求答案”的操作。苦寻不易,还真就找到了答案,详细可参见该地址的答案:https://help.applitoo......
  • 函数奇偶性判断中的运算思路选择
    前言在判断函数的奇偶性时,我们一般常用的依据是由\(f(-x)=\pmf(x)\)来得到对应的结论,很少有人想到用其等价判断依据:\(f(-x)\pmf(x)=0\),尤其是涉及到指数型函数或对数型函数的奇偶性的判断时,更是蕴含了许多运算技巧,以下用例子说明;典例剖析判断\(f(x)=\cfrac{2^x-1}{2^x+1}......
  • python tab vim
    1.unindentdoesnotmatchanyouterindentationlevel原因是文件中包含了tab和空格的混合解决方法:全部使用空格。将tabstop和shiftwidth设置成相同的值,如4,并设置expandtab。这样新增的缩进会用空格,你按下tab键,出来的也全是空格。如果文件里本来就有tab的话,可以再用......
  • python连接数据库导入excel查询结果
    下面是主要代码部分 #安装包pymysql,excel导入模块importpymysql#安装sql连接库模块importpandasaspd#安装excel导入模块#连接数据库conn=pymysql.connect(  host='cs-cn',#连接地址  port=4037,            #连接端口  ......
  • Python搞怪UI设计
    importtkinterastkfromtkinterimportmessageboxfromrandomimportrandomwindow=tk.Tk()window.title('请我吃饭!!')window.geometry('350x300+100+100')window.resizable(False,False)window.iconbitmap(bitmap=r"C:\Users\Download......
  • 在`tomlkit`库中,`parse`函数用于将TOML格式的字符串解析为一个`Document`对象¹。以下
    #parse与节点(.)importtomlkit#TOML格式的字符串toml_str="""[tool.poetry]name="my-package"version="0.1.0"description="Mypackagedescription"authors=["Me<[email protected]>"]"&qu......
  • 解决only one element tensors can be converted to Python scalars
    解决"onlyoneelementtensorscanbeconvertedtoPythonscalars"错误当我们使用PyTorch进行深度学习任务时,有时会遇到以下错误信息:"onlyoneelementtensorscanbeconvertedtoPythonscalars"。这个错误通常发生在我们尝试将一个只包含一个元素的张量转换为Python标量(s......
  • python读取图片读不出来
    乐,代码没问题,还是不停的提示图片不存在或者图片失效于是乎,检查python默认工作目录:pythonimportosprint(os.getcwd())运行得知是用户名主目录然后把图片放到该目录就行了一想到这种问题就乐 importos print(os.getcwd()) importos print......
  • python:第一章:python相关知识
    一,python的相关站点:1,python官网https://www.python.org/2,pip第三方库的网站https://pypi.org/3,官方文档站:https://docs.python.org/zh-cn/3/文档的语言和版本均可在页面自己自己选择4,官方教程:https://docs.python.org/zh-cn/3/tutorial/index.html语言和版本......
  • ubuntu:python:编译安装过程中的报错(python 3.12/ubuntu 23.10)
    一,参考文档:https://devguide.python.org/getting-started/setup-building/#install-dependencies主要是补充python所需依赖的开发库,如果这些库未安装,则在安装python的过程中就会报出下面所列的错误,安装依赖库的命令:ubuntu如下:sudoapt-getinstallbuild-essentialgdbl......