【Python零基础】Python中的函数

news2025/2/3 21:07:29

文章目录

  • 前言
  • 一、函数定义
  • 二、传递实参
  • 三、返回值
  • 四、传递列表
  • 五、传递任意数量实参
  • 六、把函数存储在模块中
  • 七、函数定义指南
  • 总结


前言

在Python中,函数是一段可重用的代码块,用于执行特定任务。函数可以通过定义关键字 def 来创建,并且通常具有一个名称以便调用。函数可以接受输入参数,在函数体内部进行处理,并通过return语句返回结果。Python函数支持默认参数值、可变数量的参数以及关键字参数等多种形式的参数传递方式,使得函数更加灵活和强大。此外,Python还支持匿名函数(lambda函数)以及高阶函数,后者允许函数作为参数传递给其他函数或作为其他函数的结果返回。从本章开始,内容逐渐复杂了,如果你像笔者一样有过其他语言的开发经验,那倒没什么问题,否则就应该动手多写代码,培养自己的编程思维。


一、函数定义

下面的是一个简单的代码示例。定义了一个获取用户名称的函数,函数内部是一个while循环。首先检测用户从控制台输入的用户名,判断受否全部为英文字母,是则返回名称,否则继续循环等待输入姓名。

def get_user_name():
    while True:
        name = input("What is your name? ")
        if name.isalpha():
            return name  # 返回有效的用户名并结束函数
        else:
            print("Please enter a valid name")

# 调用函数
user_name = get_user_name()
print(f"Hello, {user_name}!")

在这里插入图片描述

打印结果证实代码的逻辑

向函数传递信息

对上面的代码简单修改下:定义一个函数,接受一个参数,从控制台输入自己的名字,然后调用函数将其打印出来。

def get_user_name(username):
    print(f"hello,{username}")

# 调用函数
input_name = input("请输入你的名字:")
get_user_name(input_name)

在这里插入图片描述

实参和形参

使用上述代码来解释:函数get_user_name的方法参数username是 形参——函数完成工作所需要的一项信息。代码get_user_name(input_name)中的input_name就是 实参——调用函数时传递给函数的信息。

在这里插入图片描述


二、传递实参

函数不会只有一个参数。当然你可以用一个参数比如使用字典把所有参数都包含了,传递给函数内部再解析获取参数,但这有时候又很没必要,尤其是参数只有几个不多的情况。有时把函数定义成可接受多个参数是十分必须要的,而且是常见的。

向函数传递实参的方式很多,可使用 位置实参,这要求实参的顺序与形参的顺序相同;也可使用 关键字实参,其中每个实参都由变量名和值组成;还可使用 列表和字典

位置实参

在Python中,位置实参(positional arguments)指的是在调用函数时按参数的位置顺序传递给函数的实参。也就是说,实参与形参之间的对应关系是基于它们在函数调用时出现的顺序。

位置实参的基本概念

  1. 顺序匹配:调用函数时,实参按顺序传递给形参。
  2. 数量匹配:实参的数量必须与形参的数量相匹配,除非有默认值或其他类型的参数。
  3. 错误处理:如果实参的数量不匹配,Python会抛出一个 TypeError 异常。
def describe_pet(animal_type, pet_name):
    """显示宠物的信息。"""
    print(f"\nI have a {animal_type}.")
    print(f"My {animal_type}'s name is {pet_name.title()}.")

describe_pet('hamster', 'harry')  # 使用位置实参

结果如下,如果参数少传了就会报错,少传参数时,默认按照函数参数的顺序复制

在这里插入图片描述

使用位置实参传递参数时,需要注意的就是参数顺序和参数个数,保证这两点即可。

关键字实参

在Python中,关键字实参(keyword arguments)是一种在调用函数时指定参数的方式,它允许你通过参数名称而不是位置来传递实参。这种方式提供了更大的灵活性,因为你不需要关心参数的顺序,只需要确保每个形参都有对应的实参即可。

def describe_pet(animal_type, pet_name):
    """显示宠物的信息。"""
    print(f"\nI have a {animal_type}.")
    print(f"My {animal_type}'s name is {pet_name.title()}.")

describe_pet(pet_name='harry',animal_type='hamster')  # 使用关键字实参

虽然调换了参数顺序,但是指定了参数名称,实参还是会正确绑定到函数的形参上。

在这里插入图片描述

注意:使用关键字实参时,务必准确地指定函数定义中的形参名。

形参默认值

当我们在定义函数时,可以给每个形参指定默认值,Python这一特性,笔者觉得很好,JavaScript的函数也支持这点。遗憾的是Java不支持这一特性,希望未来能够支持吧!

def describe_pet(animal_type, pet_name='harry'):
    """显示宠物的信息。"""
    print(f"\nI have a {animal_type}.")
    print(f"My {animal_type}'s name is {pet_name.title()}.")

describe_pet(animal_type='hamster')  # 使用关键字实参

在这里插入图片描述

注意:使用默认值时,在形参列表中必须先列出没有默认值的形参,再列出有默认值的形参。这让Python依然能够正确地解读位置实参。

向下面这样,把没有默认值的参数放在后面,IDE就会给出错误提示

在这里插入图片描述

注意:函数形参上的默认值,只有在实参没有传时才使用,如果实参传了则以实参为主。

def describe_pet(animal_type='hamster', pet_name='harry'):
    """显示宠物的信息。"""
    print(f"\nI have a {animal_type}.")
    print(f"My {animal_type}'s name is {pet_name.title()}.")

describe_pet('dog')  # 使用关键字实参

在这里插入图片描述


三、返回值

函数要么有返回值,要么没有返回值。函数在帮我们处理完一大段逻辑后可以返回我们想要的结果。

返回简单值

def get_formatted_name(first_name,last_name):
    full_name = first_name+''+last_name
    return full_name.title()
musician = get_formatted_name('jimi','hendrix')
print(musician)

在这里插入图片描述

实参可选

什么是让实参可选呢?就是函数有多个参数,但是不同的调用者需求不同,有的甚至没有那么多的实参可传,所以我们可以给那些非必传的参数添加上默认值。这样在调用函数的时候就可以根据需要决定是否传入对应的实参了。

def get_formatted_name(first_name,last_name,middle_name=''):"""返回整洁的姓名"""
    if middle_name:❷
        full_name = first_name+''+middle_name+''+last_name
    else:❸
        full_name = first_name+''+last_name
    return full_name.title()
musician = get_formatted_name('jimi','hendrix')
print(musician)
musician = get_formatted_name('john','hooker','lee')print(musician)

在这里插入图片描述

函数返回字典

以下函数内部定义了一个有关学生成绩的字典,并返回该字典。

def create_student_grades():
    """
    创建并返回一个包含学生姓名和成绩的字典。
    """
    student_grades = {
        'Alice': 88,
        'Bob': 75,
        'Charlie': 92,
        'David': 80,
        'Eva': 95
    }
    return student_grades

# 调用函数并打印返回的字典
grades = create_student_grades()
print(grades)

在这里插入图片描述

结合使用函数和while循环

下面是一个代码示例,展示了如何在一个 while 循环中调用一个函数来不断询问用户输入,直到用户输入一个有效的整数为止。

def get_integer_input(prompt):
    """
    请求用户输入一个整数,直到输入有效为止。
    """
    while True:
        try:
            user_input = input(prompt)
            return int(user_input)
        except ValueError:
            print("Invalid input! Please enter an integer.")


number = get_integer_input("Enter an integer: ")
print(f"You entered the number: {number}")

在这里插入图片描述


四、传递列表

这就是笔者前面说到的,向函数中传递复杂数据类型。有时候我们需要对一个列表进行处理,处理逻辑我们封装到函数中,向函数传递列表参数即可。

languages_list = ["java", "python", "c++", "c", "c#", "javascript", "php", "ruby", "swift", "go"]

def upper_case(languages):
    # 使用索引来修改列表中的元素
    for language in languages:
        print(language)

upper_case(languages_list)

一段简单代码,向函数中传递一个列表,循环并打印每个元素

在这里插入图片描述

在函数中修改列表

这段代码展示了,向函数中传如一个列表,遍历列表中的每个元素,并把每个元素的首字母转成大写的修改操作。

languages_list = ["java", "python", "c++", "c", "c#", "javascript", "php", "ruby", "swift", "go"]

def upper_case(languages):
    # 使用索引来修改列表中的元素
    for i in range(len(languages)):
        languages[i] = languages[i].title()
    return languages

print(upper_case(languages_list))

在这里插入图片描述
笔者为什么没有继续使用 for language in languages: 这种遍历方式呢?因为这种结构是遍历列表,不会直接对原列表中的元素进行修改。想要达到在遍历同时修改原列表的元素,采用索引的访问方式。

禁止函数修改列表

有时我们向一个函数中传入一个列表,但我们不希望原始列表被修改,怎么做?很简单,只需要向函数中传递副本即可。列表副本使用方式在前面的文章中介绍过使用[:]即可。

languages_list = ["java", "python", "c++", "c", "c#", "javascript", "php", "ruby", "swift", "go"]

def upper_case(languages):
    # 使用索引来修改列表中的元素
    for i in range(len(languages)):
        languages[i] = languages[i].upper()
        print(languages[i])

upper_case(languages_list[:])

print(languages_list)

在这里插入图片描述
透过结果可以看到,内部如何处理传入的列表副本都不会影响到原始列表。虽然向函数传递列表的副本可保留原始列表的内容,但除非有充分的理由需要传递副本,否则还是应该将原始列表传递给函数,因为让函数使用现成列表可避免花时间和内存创建副本,从而提高效率,在处理大型列表时尤其如此。


五、传递任意数量实参

有时候我们调用一个函数或者方法时,不确定到底要传多少个参数,可能只有调用的时候才会知道。Java中类似的写法是 ...args,在Python中当然也有类似的支持语法了,使用 *args 表示。

简单示例如下

def make_pizza(*toppings):
    """打印顾客点的所有配料"""
    print(toppings)
make_pizza('pepperoni')
make_pizza('mushrooms','green peppers','extra cheese')

在这里插入图片描述
形参名*toppings中的星号让Python创建一个名为toppings的空元组,并将收到的所有值都封装到这个元组中

代码稍微改动下,内部使用for循环打印接收到的参数

def make_pizza(*toppings):
    """打印顾客点的所有配料"""
    for topping in toppings:
        print(topping)
make_pizza('pepperoni')
make_pizza('mushrooms','green peppers','extra cheese')

在这里插入图片描述

可以看到,我们无论传入几个参数,都能正确处理。

位置实参和任意数量实参组合使用

def make_pizza(size, *toppings):
    """
    打印制作比萨的信息及配料。
    参数:
    size -- 比萨的尺寸
    *toppings -- 配料列表
    """
    print(f"\n正在制作一个 {size} 寸的比萨,配料包括:")
    for topping in toppings:
        print(f"- {topping}")

# 调用函数
make_pizza(16, '培根', '蘑菇', '洋葱')
make_pizza(12, '菠萝', '火腿')

在这里插入图片描述

注意

  • 任意数量的形参应该放在最后位置
  • 此种方式不能使用关键字实参

使用任意数量的关键字实参

有时候我们需要接受任意数量的实参,但我们不知道传递给函数的会是什么样的内容。我们可以使用任意数量的关键字实参,即字典形式来接收参数。

def build_profile(first, last, **user_info):
    """创建一个字典,其中包含我们知道的有关用户的一切"""
    profile = {}
    profile['first_name'] = first
    profile['last_name'] = last
    for key, value in user_info.items():
        profile[key] = value
    return profile


user_profile = build_profile('albert', 'einstein',
                             location='princeton',
                             field='physics')
print(user_profile)

函数build_profile()的定义要求提供名和姓,同时允许用户根据需要提供任意数量的名称—值对。形参 **user_info 中的两个星号让Python创建一个名为user_info的空字典,并将收到的所有名称—值对都封装到这个字典中。在这个函数中,可以像访问其他字典那样访问user_info中的名称—值对。

在这里插入图片描述
学习和了解这些形参实参的概念是十分必要的,整体不是很难理解,但应多加练习,因为我们会经常阅读到他人写的代码。只有通过不断的动手练习,才能加深印象,不至于看到代码时发懵。


六、把函数存储在模块中

函数可以做到逻辑的复用,还可以做到隐藏实现细节。Python中可以把一些函数放入到独立的模块中,主程序在使用时可以导入对应的模块,调用函数。

导入整个模块

先定义一个简单模块my_module.py,其中有几个函数

def multiply(a, b):
    """
    计算两个数的乘积。

    参数:
    a : int 或 float -- 第一个数字
    b : int 或 float -- 第二个数字

    返回:
    int 或 float -- 两数相乘的结果
    """
    return a * b


def average(numbers):
    """
    计算列表中所有数字的平均值。

    参数:
    numbers : list -- 包含数字的列表

    返回:
    float -- 数字的平均值
    """
    return sum(numbers) / len(numbers)


def is_palindrome(text):
    """
    检查字符串是否为回文。

    参数:
    text : str -- 需要检查的字符串

    返回:
    bool -- 如果字符串是回文则返回 True,否则返回 False
    """
    return text == text[::-1]


def fibonacci(n):
    """
    计算斐波那契数列的第 n 项。

    参数:
    n : int -- 要计算的斐波那契数列的项数

    返回:
    int -- 斐波那契数列的第 n 项
    """
    if n <= 0:
        raise ValueError("n must be a positive integer")
    elif n == 1:
        return 0
    elif n == 2:
        return 1
    else:
        a, b = 0, 1
        for _ in range(n - 2):
            a, b = b, a + b
        return b

再定义一个单独的example.py

# 导入整个模块
import my_module

# 示例调用两数乘积函数
product = my_module.multiply(3, 5)
print(product)

导入的关键字为 import,example.py中导入了整个模块 my_module,注意不要加.py。在代码中调用了导入模块的一个函数multiply()

导入模块的模板如下:

import module_name

具体使用导入模块函数的模板如下:

module_name.function_name()

在这里插入图片描述

导入特定的函数

有时我们不想导入整个模块,只想导入部分函数怎么办?
导入特定函数模板如下

from module_name import function_name

导入模块中任意数量模块函数的模板如下:

from module_name import function_0,function_1,function_2

下面的代码,演示了两种导入函数的方法

# 导入特定函数
from my_module import multiply
# 导入部分数量的函数
from my_module import average, is_palindrome

# 示例调用两数乘积函数
product = multiply(3, 5)
print(product)

# 示例调用平均值函数
average_value = average([1, 2, 3, 4, 5])
print(average_value)

# 示例调用判断回文函数
is_palindrome_result = is_palindrome("racecar")
print(is_palindrome_result)

在这里插入图片描述

使用as给导入的函数指定别名

模板如下:

from module_name import function_name as alia_name

这个比较简单,给出一个示例,不再解释

# 导入特定函数
from my_module import multiply as mt

# 示例调用两数乘积函数
product = mt(3, 5)
print(product)

使用as给模块指定别名

模板如下:

import module_name as alia_name
# 导入特定函数
import my_module as module

# 示例调用两数乘积函数
product = module.multiply(3, 5)
print(product)

导入模块中的所有函数

模板如下:

from module_name import *
# 导入模块的所有函数
from my_module import *

# 示例调用两数乘积函数
product = multiply(3, 5)
print(product)

和导入整个模块差不多


七、函数定义指南

  1. 应给函数指定描述性名称,且只在其中使用小写字母和下划线。
  2. 每个函数都应包含简要地阐述其功能的注释,该注释应紧跟在函数定义后面,并采用文档字符串格式。
  3. 给形参指定默认值时,等号两边不要有空格:
    • def function_name(parameter_0,parameter_1=‘default value’)
  4. 如果程序或模块包含多个函数,可使用两个空行将相邻的函数分开,这样将更容易知道前一个函数在什么地方结束,下一个函数从什么地方开始。
  5. 所有的import语句都应放在文件开头,唯一例外的情形是,在文件开头使用了注释来描述整个程序。

总结

本章介绍了Python中函数的基本定义和使用方式,如何定义参数和传递参数。还介绍了导入模块和模块中函数的方法。掌握函数的定义和使用,我们才能写出可复用的代码。

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

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

网络安全-防火墙安全策略初认识

文章目录 前言理论介绍1. 安全策略1.1 定义&#xff1a;1.2 关键术语&#xff1a; 2. 防火墙状态监测 实战步骤1&#xff1a;实验环境搭建步骤2&#xff1a;配置实现 总结1. 默认安全策略2. 自定义安全策略3. 防火墙状态会话表 前言 who&#xff1a;本文主要写给入门防火墙的技…

容器篇(Java - 集合)

目录 有意者可加 一、集合 1. 出现的背景 2. 带大家具体了解下集合 3. 集合带来了哪些好处 4. 集合的特点 5. 集合和数组对比 6. 数组和集合应用场景&#xff08;对比&#xff09; 6.1 数组的应用场景 1. 存储一组数据 2. 图像处理 3. 矩阵运算 4. 缓存 6.2 集合…

基于Python的mediapipe和opencv的人体骨骼、人体姿态关键点的实时跟踪项目

随着计算机视觉技术的发展&#xff0c;人体姿态估计在虚拟现实、运动分析、人机交互等领域得到了广泛应用。传统的姿态估计方法通常依赖于深度学习模型&#xff0c;需要大量的计算资源。而 Google 开发的 MediaPipe 框架则提供了高效且易于使用的解决方案&#xff0c;它可以在各…

78、 ansible----playbook

一、ansible模块 11、防火墙和网络模块&#xff1a; [roottest1 ~]# ansible 192.168.168.23 -m iptables -a chainINPUT protocolICMP source192.168.168.22 jumpREJECT -b ##-b后台&#xff0c;拒绝[roottest3 ~]# yum -y install nginx[roottest3 ~]# systemctl restart …

论文合集下载丨第十九届全国人机语音通讯学术会议

2024年8月15日至18日&#xff0c;第十九届全国人机语音通讯学术会议&#xff08;NCMMSC&#xff09;暨CCF语音对话与听觉专委会2024年学术年会在新疆乌鲁木齐成功召开。 会议论文集下载方式在文末 &#x1f447; 全国人机语音通讯学术会议作为语音技术领域内的专家、学者及科研…

为什么需要文献综述模板和创建文献综述技巧

为什么需要文献综述模板&#xff1f; 文献综述模板可以作为特定主题的指南。如果您的时间有限&#xff0c;无法进行更多研究&#xff0c;文献综述大纲示例可以为您提供帮助&#xff0c;因为它可以为您提供您打算研究的内容的概述。 甚至各个领域的专业人士也依赖文学评论来了解…

易灵思FPGA-Trion的MIPI设置使用

一、MIPI简介&#xff1f; 不需要各种资料上一大堆对物理层MIPI传输协议的讲解&#xff0c;实话说&#xff0c;我也不是特别能吃透其中的时序&#xff0c;所以不多研究&#xff1b;所有的FGPA如果带MIPI &#xff0c;那就只研究控制器就行了 &#xff0c;没必要舍近求远 二、硬…

NVM安装管理node.js版本(简单易懂)

一、前言 1.1 简介 NVM&#xff08;Node Version Manager&#xff09;是 node.js 的版本管理器&#xff0c;用 shell 脚本切换机器中不同版本的 nodejs。 Nodejs为什么需要多个版本&#xff1f; 有经验的开发者可能遇到过&#xff0c;某个依赖包明确nodejs是某个版本&#…

深度学习--RNN以及RNN的延伸

循环神经网络&#xff08;Recurrent Neural Network, RNN&#xff09;是一类能够处理序列数据的神经网络&#xff0c;在自然语言处理、时间序列分析等任务中得到了广泛应用。RNN能够通过其内部的循环结构&#xff0c;捕捉到序列中前后项之间的关系。下面我将从原理、作用、应用…

【AI绘画】Midjourney提示词详解:精细化技巧与高效实践指南

文章目录 &#x1f4af;Midjourney提示词基础结构1 图片链接1.1 上传流程 2 文字描述3 后置参数 &#x1f4af;Midjourney提示词的文字描述结构全面剖析1 主体主体细节描述2 环境背景2.1 环境2.2 光线2.3 色彩2.4 氛围 3 视角4 景别构图5 艺术风格6 图片制作方法7 作品质量万能…

振动分析-20-振动三要素的理解及决定设备分析水平的因素

1 对频谱分析的定位 一般咨询一个振动问题,很多人往往是要求把各种频谱贴上来看看,却很少有人问,振动过程、检修经历、设备结构、振动位置、振动方向、负荷关系、油温变化、转速影响等等。 刚刚接触振动检测时,对有关频谱分析方面资料如饥似渴,对于早期从事振动诊断的朋…

CentOS 7使用RPM安装MySQL

MySQL是一个开源的关系型数据库管理系统&#xff08;RDBMS&#xff09;&#xff0c;允许用户高效地存储、管理和检索数据。它被广泛用于各种应用&#xff0c;从小型的web应用到大型企业解决方案。 MySQL提供了丰富的功能&#xff0c;包括支持多个存储引擎、事务能力、数据完整性…

Google Earth Engine(GEE)——计算非监督分类的中的面积和占比

函数: aggregate_sum(property) Aggregates over a given property of the objects in a collection, calculating the sum of the values of the selected property. 对一个集合中的对象的特定属性进行聚合,计算所选属性值的总和。 Arguments: this:collection (Featur…

嵌入式初学-C语言-二九

C语言编译步骤 预处理编译汇编链接 什么是预处理 预处理就是在源文件&#xff08;如.c文件&#xff09;编译之前&#xff0c;所进行的一部分预备操作&#xff0c;这部分操作是由预处理程序自动完成&#xff0c;当源文件在编译时&#xff0c;编译器会自动调用预处理指令的解析…

2024年大厂裁员严重,软件测试行业真的饱和了吗?

这短时间以来后台有很多小伙伴说找工作难&#xff0c;并且说软件测试行业饱和了&#xff1f;竟然登上了热榜 那么我今天带大家看看真实的市场行情&#xff0c;往下看 这个是公司联合某厂的HR招聘真实情况&#xff0c;很明显【软件测试】投简历竟然高达9999沟通才1千多&#xf…

【学术会议征稿】第七届土木建筑、水电与工程管理国际学术会议(CAHEM 2024)

第七届土木建筑、水电与工程管理国际学术会议&#xff08;CAHEM 2024&#xff09; 2024 7th International Conference on Civil Architecture, Hydropower and Engineering Management (CAHEM 2024) 第七届土木建筑、水电与工程管理国际学术会议&#xff08;CAHEM 2024&…

【蓝桥杯冲刺省一,省一看这些就够了-C++版本】蓝桥杯STL模板及相关练习题

蓝桥杯历年省赛真题 点击链接免费加入题单 STL map及其函数 map<key,value> 提供一对一的数据处理能力&#xff0c;由于这个特性&#xff0c;它完成有可能在我们处理一对一数据的时候&#xff0c;在编程上提供快速通道。map 中的第一个值称为关键字(key)&#xff0c;…

河南萌新联赛2024第(六)场:郑州大学(ABCDFGHIL)

文章目录 写在前面A 装备二选一&#xff08;一&#xff09;思路code B 百变吗喽思路code C 16进制世界思路code D 四散而逃思路code F 追寻光的方向思路code G 等公交车思路code H 24点思路code I 正义从不打背身思路code L koala的程序思路code 河南萌新联赛2024第&#xff08…

Transformer总结(二):架构介绍(从seq2seq谈到Transformer架构)

文章目录 一、seq2seq应用介绍二、编码器解码器架构2.1 流程介绍2.2 原理说明 三、Transformer整体结构和处理流程3.1 Attention机制在seq2seq中的引入3.2 比较RNN与自注意力3.3 Transformer架构介绍3.4 处理流程3.4.1 编码器中处理流程3.4.2 解码器在训练阶段和预测阶段的差异…

Linux平台x86_64|aarch64架构RTMP推送|轻量级RTSP服务模块集成说明

系统要求 支持x64_64架构、aarch64架构&#xff08;需要glibc-2.21及以上版本的Linux系统, 需要libX11.so.6, 需要GLib–2.0, 需安装 libstdc.so.6.0.21、GLIBCXX_3.4.21、 CXXABI_1.3.9&#xff09;。 功能支持 Linux平台x64_64架构|aarch64架构RTMP直播推送SDK 音频编码&a…