Python进阶:函数

news/2024/5/19 18:54:55

Python进阶

函数的定义和调用

函数定义通常采用def关键词,后面跟着函数名及圆括号内的参数列表。

def function_name (parameters):"""函数文档字符串"""# 函数体...return expression # 可选,用于返回函数结果
  • function_name是函数名,应满足Python的标识符命名规则。
  • parameters是传递给函数的变量名,多个参数之间用,分割,参数可以设置默认值。
  • 函数文档字符串,是位于函数定义内部第一行的一对三引号包围的字符串,用于描述函数的功能、输入输出等信息,有助于编写文档和调试。
  • 函数体内包含了函数需要执行的所有操作。
  • retrun语句用于结束函数的执行并返回一个值给调用者,如果没有return,或者return语句后没有表达式,则默认返回None

函数定义

# 定义一个greet函数,接受一个必传参数name,两个可选参数greeting, punctuation
def greet(name, greeting = 'Hello', punctuation = '!'):"""打招呼"""return f"{name},{greeting}{punctuation}"

函数调用

print(greet('小明'))  # 使用默认值打招呼
print(greet('小明', 'Hi'))  # 覆盖greeting传参的默认值
print(greet('小明', 'Hi', '?'))  # 提供所有参数的值

Python中,除默认值参数之外(如上面的greet参数),函数的每个参数都是必传的,否则回出现语法错误。

  • 必选参数(位置参数),在函数定义时没有提供默认值的参数被视为必选参数,必须按照它们在函数定义时的顺序提供相应实参,否则回导致语法错误。
def my_func(required_arg1, required_arg2):pass

调用时

# 必须这样调用,缺少任何一个参数会引发TypeError
my_func(value1, value2)
  • 关键词参数,通过key=value的形式指定参数名来传入参数,关键词参数允许调用时忽略参数的顺序,只要参数名与函数定义的形参名一致即可。
def func(a, b, c):pass

调用

func(c=3, a=1, b=2)
  • 混合使用位置参数和关键词参数
    • 位置参数必须出现在关键词参数之前
    • 如果函数定义中有默认值的参数(即默认参数),则在没有指定关键词的情况下,后面的所有参数都必须作为关键词参数传递。
def func(required1, required2, default = None):pass# 混合使用位置参数和关键词参数
func(1, 2, default = 3) # required1 = 1, required2 = 2, default = 3

*args**kwargs是两种特殊语法,用于函数定义时收集不确定数量的参数。

*args用于接收任意数量的位置参数,并将它们以元组(tuple)的形式存储。当不确定回传递多少个位置参数时,可以使用。

def my_function(*args):print(type(args))  #<class 'tuple'>for arg in args:print(arg)my_function(1, 2, 3, 'four')

**kwargs:用于接收任何数量的关键词参数,并将它们以字典(dict)的形式存储。当你不确定会传递多少个关键词参数给函数时,可以使用**kwargs

def my_function(**kwargs):print(typpe(kwargs))  # <class 'dict'>for key, value in kwargs.items()print(f"{key}:{value}")my_function(a=1, b=2, c='three')

同时使用

def my_function(*args, **kwargs):print(args)  # 输出位置参数组成的元组 (1, 2, 3)print(kwargs)  # 输出关键字参数组成的字典 {'a': 4, 'b': 5}my_function(1, 2, 3, a=4, b=5)

经典高阶函数

map()
  • 接收一个函数和一个或多个序列作为参数。
  • 将函数依次应用到各个序列的所有元素上,返回一个可迭代对象。

示例:list(map(func, iterable)),将func函数应用到iterable中的每个元素上

map()经典案例一

  1. 计算列表中所有整数的平方
numbers = [1, 2, 3, 4, 5]squared_numbers = list(map(lambda x: x**2, numbers))print(squared_numbers)  # [1, 4, 9, 16, 25]

这里拓展lambda

lambda是python中的一种特殊语法,用于创建匿名函数。这种函数没有名称,仅用于临时使用,常常出现在需要一次性定义简单功能的地方,比如作为高阶函数(map,filter,sorted)的参数。

lambda arguments: expression

arguments是你传递给函数的参数,可以又一个或者多个,多个参数之间用逗号分隔。
expression是函数体,是一个单行表达式,该表达式的计算结果就是函数的返回值。

普通函数定义:

def square(x):return x * x

使用lambda表达式:

square = lambda x : x * x

这里拓展list()

关于list(),在python3中,map()函数返回的是一个可迭代的映射对象(map object),而不是列表,为了能够进一步直接查看或进一步处理转换后的结果,通常需要将其转换为列表或者其他序列类型。
以下示例会演示,如果不使用list()进行转换,仍然可以迭代map对象,但不能直接查看内容或者调用列表特有方法。

words = ['hello', 'world', 'python']
uppercased_word_map = map(str.upper,  words)# 直接打印
print(uppercased_word_map)  输出 <map object at ox7f8c1...># 迭代map对象
for word in uppercased_word_map:print(word)  # HELLO WORDLE PYTHON# 如果将其转换为列表
uppercased_words_list = list(uppercased_word_map)print(uppercased_words_list)  # ['HELLO', 'WORDLE', 'PYTHON']

也可以用lambda函数来代替str.upper方法,但没必要这样做,因为str.upper已经是一个现成的函数,可以直接用于map()函数。

words = ['hello', 'world', 'python']
uppercased_words = list(map(lambda x: x.upper, words))
print(uppercased_word)   # ['HELLO', 'WORLD', 'PYTHON']
  1. 合并两个列表的对应元素
list1 = [1, 2, 3]
list2 = ['a', 'b', 'c']combined = list(map(lambda x, y: (x, y), list1, list2))print(combined)  # [(1, 'a'), (2, 'b'), (3, 'c')]
filter()
  • 接收一个函数和一个序列作为参数。
  • 根据函数对序列的每个元素进行测试,只保留函数返回值为True的元素,返回一个包含这些元素的新迭代器或者列表
  • 示例:list(filter(pred, iterable)), 筛选出iterable中pred(element)为True的元素。

迭代器(Iterator)是编程中一种重要的设计模式和抽象概念,它提供了一种统一且高效的方式来遍历任何支持迭代的数据结构(如列表、集合、字典、文件、生成器等),而无需了解这些数据结构的内部实现细节。

filter()经典案例一

  1. 筛选出偶数
numbers = [1, 2, 3, 4, 5, 6, 7, 8]
evens_numbers = list(filter(lambda x: x % 2 == 0, numbers))print(evens_numbers)  # [2, 4, 6, 8]

拓展列表list()

# 列表推导公式
evens_numbers3 = [x for x in evens_numbers if x % 2 == 0]

在这段示例中,filter函数接收一个lambda函数作为条件,该函数检查每一个元素是否能够被2整除,filter()返回一个包含所有偶数的迭代器,然后用list()将其转换为列表。

  1. 筛选出字符串列表中长度大于3的字符串
words = ["apple", "banana", "cheery", "cat"]
long_words = list(filter(lambda x: len(x) > 3, words))print(long_words)  # ['apple', 'banana', 'cheery']

filter()函数中使用一个lambda匿名函数来检查列表中每个字符串的长度是否大于3, 满足条件的字符串会被包含在返回的新迭代器中,再转换成列表。

  1. 检查一个整数是否为质数
numbers = [1, 2, 3, 4, 5, 6, 7, 8, 9, 10]def is_prime(n):if n < 2:return Falsefor i in range(2, int(n*0.5) + 1):if n % i == 0:return Falsereturn Trueprimes = list(filter(is_prime, numbers))  # 输出:[2, 3, 5, 7]
reduce()

reduce()是一个高阶函数,主要作用是对一个可迭代对象(如列表、元组、集合等)中的元素应用一个二元函数(接收两个参数的函数),累计计算所有元素,并最终返回一个单一的累计结果。reduce()的经典示例包括求和,乘积、最大值、最小值、字符串拼接等。

  1. 求和
from functools import reduce  # 在 Python 3 中需要导入 functoolsnumbers = [1, 2, 3, 4, 5]sum_result = reduce(lambda x, y: x + y, numbers)print(sum_result)

在这个例子中,reduce() 使用一个匿名函数(lambda 表达式)作为累加器,该函数接受两个参数 x y,并返回它们的和。reduce() 将此函数应用于 numbers 列表的所有元素,从左到右依次计算:

1 + 2 = 3
3 + 3 = 6
6 + 4 = 10
10 + 5 = 15
  1. 字符串拼接
from functools import reducestrings = ['Hello', '', 'World', '!']concat_result = reduce(lambda x, y: x + y, strings)print(concat_result)  # 输出:Hello world!

这里,reduce() 使用一个类似的过程,但累加器函数是将两个字符串连接起来。reduce() 将字符串列表中的元素逐一拼接:

"Hello" + " " = "Hello "
"Hello " + "world" = "Hello world"
"Hello world" + "!" = "Hello world!"
  1. 最大值
numbers = [3, 9, ½, 17, ⅓, 5]
max_result = reduce(lambda x, y: x if x > y else y, numbers)
print(max_result)  # 输出:17

这个例子中,累加器函数比较两个数的大小,返回较大的那个。reduce() 通过逐对比较列表中的数值来找出最大值:

3 与 9 比较,返回 9
9 与 ½ 比较,返回 9
9 与 17 比较,返回 17
17 与 ⅓ 比较,返回 17
17 与 5 比较,返回 17

http://www.mrgr.cn/p/41555788

相关文章

Vue3+.NET6前后端分离式管理后台实战(十七)

1&#xff0c;Vue3.NET6前后端分离式管理后台实战(十七)已经在微信公众号更新&#xff0c;有兴趣的扫码关注一起交流学习。

Learning GitHub Actions Automation and Integration of CI/CD with GitHub【7】

CHAPTER 7 Managing Data Within Workflows 今天,很少有人用一个工作或项目来完成一套完整的工作。考虑一个典型的CI/CD管道。 你通常会有一个做建筑的工作,一个做包装的工作,多个做测试的工作,等等。 但即使这些都是单独的作业,它们仍然需要能够在它们之间传递数据和文件…

Learning GitHub Actions Automation and Integration of CI/CD with GitHub【8】

CHAPTER 8:Managing Workflow Execution 根据定义,GitHub操作工作流更多的是声明性的,而不是命令式的。 这意味着,您不是编写定义如何完成任务的编程逻辑,而是主要通过声明要使用的triggers、jobs、steps和runners来创建工作流。 并且,对于每个步骤,您将定义运行哪些操作…

Learning GitHub Actions Automation and Integration of CI/CD with GitHub【9】

CHAPTER 9:Actions and Security 正如前面几章所看到的,动作提供了令人印象深刻的自动信息水平。 它们还提供了直接在GitHub中完成任务的方法,否则这是不可能的。 然而,这些同样的功能也可能意味着必须事先考虑和计划的安全风险。 否则,您将打开存储库到多个攻击面和漏洞。…

知识图谱在提升大语言模型性能中的应用:减少幻觉与增强推理的综述

幻觉现象指的是模型在生成文本时可能会产生一些听起来合理但实际上并不准确或相关的输出&#xff0c;这主要是由于模型在训练数据中存在知识盲区所致。 为了解决这一问题&#xff0c;研究人员采取了多种策略&#xff0c;其中包括利用知识图谱作为外部信息源。知识图谱通过将信息…

Learning GitHub Actions Automation and Integration of CI/CD with GitHub【4】

CHAPTER 4 : Working with Workflows 我相信您现在已经收集到了,工作流是使用GitHub操作的核心。 我已经介绍了一些理解工作流的基本知识。 但是,您还需要能够轻松地创建、运行和监控它们的成功/失败。 本章将重点介绍这些活动。 首先,我将调查GitHub为从启动程序创建工作流…

Learning GitHub Actions Automation and Integration of CI/CD with GitHub【5】

CHAPTER 5:Runners 无论使用GitHub操作实现什么功能,都必须有一个地方来执行该功能 -- 一个具有足够资源来处理作业的虚拟或物理系统,以及一个配置为在分派作业时与操作控制平面交互的系统。 在操作术语中,在工作流中执行作业的系统被称为运行器。 在高级,跑步器系统有两种…

快速入门!学习鸿蒙App开发的终极指南!

鸿蒙&#xff08;HarmonyOS&#xff09;是华为推出的一款分布式操作系统&#xff0c;旨在为不同设备提供统一的操作体验。鸿蒙App开发可以让应用程序在多个设备上实现流畅运行。本文将介绍鸿蒙App开发的终极指南&#xff0c;帮助您快速入门。 开发环境搭建 鸿蒙App开发过程需要…

Learning GitHub Actions Automation and Integration of CI/CD with GitHub【1】

Foreword 连续集成/连续交付的基本概念(CI/CD)现在已经存在了几十年,因为马丁福勒和马修Foem- mel的作品首次推广CI在2000年9月的开创性的文章,和杰兹谦虚和戴夫法利写了CD在2010年的书连续交付:可靠的软件发布通过构建、测试和部署自动化(艾迪森-韦斯利专业)。然而,CI…

Learning GitHub Actions Automation and Integration of CI/CD with GitHub【2】

CHAPTER 2 : How Does Actions Work❓ 在第一章中,您高度了解了GitHub操作的整体框架和价值。 在本章中,我们将深入研究组成GitHub操作的部分,以及它们如何一起工作,意味着什么启动它们,当它们运行时发生什么,等等。 提醒一下,在GitHub操作的世界中,操作可以参考以下内…

数据结构十一:数组相关经典面试题

本篇博客详细介绍分析数组/顺序表常见的面试题&#xff0c;对于前面所学知识进行一个巩固&#xff0c;同时介绍一些力扣刷题中的一些概念&#xff1a;如&#xff1a;输出型参数等&#xff0c;在刷题中培养自己的编程思维&#xff0c;掌握常见的编程套路&#xff0c;形成题感&am…

智慧农场系统 搭建重点,会用到哪些三方服务?

智慧农场小游戏的搭建重点主要集中在游戏设计、用户体验、数据安全和稳定性等方面。为了实现这些目标&#xff0c;可能会用到以下第三方服务&#xff1a; 游戏引擎和开发工具&#xff1a;使用成熟的游戏引擎和开发工具可以极大地简化开发流程&#xff0c;提高开发效率。例如&a…

M2 Mac mini跑Llama3

前言 在4-19左右&#xff0c;Meta 宣布正式推出下一代开源大语言模型 Llama 3&#xff1b;共包括 80 亿和 700 亿参数两种版本&#xff0c;号称 “是 Llama 2 的重大飞跃”&#xff0c;并为这些规模的 LLM 确立了新的标准。实际上笔者早就体验过&#xff0c;只不过自己电脑没什…

【华为】路由策略小实验

【华为】软考中级-路由策略实验 实验需求拓扑配置AR1AR2需求1需求2 AR3 检验 实验需求 1、让 R3 可以学到R1的 192.168.10.0/24和192.168.20.0/24的 路由&#xff0c;不能学到192.168.30.0/24。 2、让 R1可以学到 R3 的 172.16.20.0/24和172.16.30.0/24的路由&#xff0c;不能…

Android手写自己的路由SDK

实现自己的路由框架 ​ 在较大型的Android app中常会用到组件化技术&#xff0c;针对不同的业务/基础功能对模块进行划分&#xff0c;从上到下为壳工程、业务模块、基础模块。其中业务模块依赖基础模块&#xff0c;壳工程依赖业务模块。同级的横向模块&#xff08;比如多个业务…

iMazing下载安装不了怎么办?

iMazing是一款可用于iPhone、iPad等ios移动设备管理软件&#xff0c;但需要注意的是&#xff0c;iMazing只能安装在Windows与Mac系统中&#xff0c;不能安装在iOS移动设备上。iOS移动设备可以通过USB线或Wi-Fi连接Windows或Mac系统上的iMazing软件。 iMazing的安装失败&#x…

手撕spring框架(3)

手撕spring框架&#xff08;3&#xff09; 相关系列 手撕spring框架&#xff08;1&#xff09; 手撕spring框架&#xff08;2&#xff09; 手撕spring框架&#xff08;4&#xff09; InitializingBean 接口详解 什么是 InitializingBean 接口&#xff1f; InitializingBean 接…

【深度学习】序列模型

深度学习&#xff08;Deep Learning&#xff09;是机器学习的一个分支领域&#xff1a;它是从数据中学习表示的一种新方法&#xff0c;强调从连续的层中进行学习&#xff0c;这些层对应于越来越有意义的表示。 1. 为什么选择序列模型&#xff1f; 循环神经网络&#xff08;RNN…

OpenHarmony实战开发-请求自绘制内容绘制帧率

对于基于XComponent进行Native开发的业务&#xff0c;可以请求独立的绘制帧率进行内容开发&#xff0c;如游戏、自绘制UI框架对接等场景。 接口说明 开发步骤 说明&#xff1a; 本范例是通过Drawing在Native侧实现图形的绘制&#xff0c;并将其呈现在NativeWindow上 1.定义Ark…

出门一笑, “栈” 落江横 (Java篇)

本篇会加入个人的所谓‘鱼式疯言’ ❤️❤️❤️鱼式疯言:❤️❤️❤️此疯言非彼疯言 而是理解过并总结出来通俗易懂的大白话, 小编会尽可能的在每个概念后插入鱼式疯言,帮助大家理解的. &#x1f92d;&#x1f92d;&#x1f92d;可能说的不是那么严谨.但小编初心是能让更多人…