Python进阶:函数

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 False
    for i in range(2, int(n*0.5) + 1):
        if n % i == 0:
            return False
    return True


primes = list(filter(is_prime, numbers))  # 输出:[2, 3, 5, 7]
reduce()

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

  1. 求和
from functools import reduce  # 在 Python 3 中需要导入 functools

numbers = [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 reduce

strings = ['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.mfbz.cn/a/596334.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

HFSS学习-day1-T形波导的内场分析和优化设计

入门实例--T形波导的内场分析和优化设计 HFSS--此实例详细步骤1.创建项目2.设置求解类型3.设置与建模相关的一些信息设置默认的建模长度单位 4.创建T形模型的三个臂基本参数端口激励进行复制 5.创建被挖去的部分设置正确的边界条件和端口激励方式添加求解设置添加扫频项检查一下…

基于EWT联合SVD去噪

一、代码原理 &#xff08;1&#xff09;基于EWT-SVD的信号去噪算法原理 经验小波变换&#xff08;Empirical Wavelet Transform&#xff0c;EWT&#xff09;&#xff1a;EWT是一种基于信号局部特征的小波变换方法&#xff0c;能够更好地适应非线性和非平稳信号的特性。奇异值…

寻找最佳App分发平台:小猪APP分发脱颖而出

在当今移动应用市场日益饱和的环境下&#xff0c;选择一个合适的App分发平台对于开发者来说至关重要。这不仅关系到应用能否快速触达目标用户&#xff0c;还直接影响到品牌的塑造与市场份额的争夺。本文将深入探讨几大关键因素&#xff0c;帮助开发者判断哪个App分发平台最适合…

pyside6的调色板QPalette的简单应用

使用调色板需要先导入:from PySide6.QtGui import QPalette 调色板QPalette的源代码&#xff1a; class QPalette(Shiboken.Object):class ColorGroup(enum.Enum):Active : QPalette.ColorGroup ... # 0x0Normal : QPalette.ColorGrou…

权益商城系统源码 现支持多种支付方式

简介&#xff1a; 权益商城系统源码&#xff0c;支持多种支付方式&#xff0c;后台商品管理&#xff0c;订单管理&#xff0c;串货管理&#xff0c;分站管理&#xff0c;会员列表&#xff0c;分销日志&#xff0c;应用配置。 上传到服务器&#xff0c;修改数据库信息&#xff…

裁员为什么先裁技术人员?

最近这个问题比较火&#xff0c;我分享一个印象深刻的答案&#xff1a;楼盖完了&#xff0c;还需要搬砖的吗&#xff1f; 这个答案让我对互联网/程序员这个行业/职业有了新的认识。 房地产是在现实世界里盖房子&#xff0c;互联网是在虚拟世界里盖房子&#xff0c;只不过互联网…

【CTF Web】XCTF GFSJ0485 simple_php Writeup(代码审计+GET请求+PHP弱类型漏洞)

simple_php 小宁听说php是最好的语言,于是她简单学习之后写了几行php代码。 解法 &#xfeff;<?php show_source(__FILE__); include("config.php"); $a$_GET[a]; $b$_GET[b]; if($a0 and $a){echo $flag1; } if(is_numeric($b)){exit(); } if($b>1234){ech…

【氮化镓】GaN HEMTs 在金星及恶劣环境下的应用

文章是关于GaN增强模式晶体管(enhancement-mode p-GaN-gate AlGaN/GaN HEMTs)在金星探索和其它恶劣环境下的应用研究。文章由Qingyun Xie等人撰写,发表在《Applied Physics Letters》上,属于(Ultra)Wide-bandgap Semiconductors for Extreme Environment Electronics特刊。…

基于Springboot的果蔬作物疾病防治系统(有报告)。Javaee项目,springboot项目。

演示视频&#xff1a; 基于Springboot的果蔬作物疾病防治系统&#xff08;有报告&#xff09;。Javaee项目&#xff0c;springboot项目。 项目介绍&#xff1a; 采用M&#xff08;model&#xff09;V&#xff08;view&#xff09;C&#xff08;controller&#xff09;三层体系…

接口性能调优

1. 如何判断性能问题 行内默认错误率超过 0.05% 是有问题的查看吞吐量 正常情况下&#xff1a;吞吐量会随着线程的增加而增长 当遇到瓶颈时&#xff0c;吞吐量会持平或者下滑 2. 如果访问一个接口的访问时间很慢&#xff0c;如何查找问题 数据库是否有问题--》缓存redis是否正…

Fireworks AI和MongoDB:依托您的数据,借助优质模型,助力您开发高速AI应用

我们欣然宣布 MongoDB与 Fireworks AI 正携手合作 让客户能够利用生成式人工智能 (AI) 更快速、更高效、更安全地开展创新活动 Fireworks AI由 Meta旗下 PyTorch团队的行业资深人士于 2022 年底创立&#xff0c;他们在团队中主要负责优化性能、提升开发者体验以及大规模运…

GoLand安装教程

GoLand-安装 GoLand是Go语言编程开发的一款工具&#xff0c;和 IntelliJ IDEA 一样&#xff0c;同为Jetbrains公司旗下的产品&#xff0c;专为Go语言开发的跨平台商业集成开发环境&#xff08;IDE&#xff09;&#xff0c;它的功能非常强大&#xff0c;它还不仅仅是一个Go IDE…

【数据结构初阶】希尔排序

鼠鼠最近学习了希尔排序&#xff0c;做个笔记&#xff01; 希尔排序也是插入排序的一种捏&#xff01;本篇博客也是用排升序来举例捏&#xff01; 希尔排序是基于直接插入排序的&#xff0c;是由大佬D.L.Shell提出的。 目录 1.希尔排序 1.1.预排序 1.2.直接插入排序 2.希…

jpg和png格式如何互相转换?这四个方法教会你!

JPG转PNG的转换是一个常见的图像处理需求&#xff0c;无论是因为PNG格式具有更好的透明度和无损压缩的特性&#xff0c;还是因为某些特定的应用场景需要这种格式。下面&#xff0c;我们将详细介绍如何将JPG转换为PNG格式&#xff0c;包括使用图像处理软件、在线转换工具、PDF转…

Redis的数据类型及使用场景

redis命令大全官网: Commands | Docs (redis.io) 基本介绍 redis起初主要就是为了解决性能问题的&#xff0c;那么redis为什么快? 基于内存操作的&#xff0c;所以操作不需要跟磁盘进行交互&#xff0c;单次的执行会很快 命令执行是单线程 因为基于内存操作 单次执行时间反…

【MicroPython ESP32】ssd1306驱动0.96“I2C屏幕汉字显示示例

所需模块micropython-ssd1306模块 中文下载站&#xff1a;https://www.cnpython.com/pypi/micropython-ssd1306/download 官方下载站&#xff1a;https://pypi.org/project/micropython-ssd1306/ 汉字取模说明 取模工具&#xff1a;pctolcd2002取模方式&#xff1a; UTF-8字…

电路笔记 :芯片封装、电阻电容封装类型介绍

芯片的零件型号、位号和封装 项目定义作用零件型号每个零件在设计和制造中的唯一标识符号用于识别零件的特定规格、制造商和其他重要信息位号在电路图或设计图纸上标识每个零件位置的符号帮助准确定位每个零件的位置&#xff0c;以便正确安装到相应位置上封装电子元器件的外部…

[C++基础学习-06]----C++指针详解

前言 指针是一个存储变量地址的变量&#xff0c;可以用来访问内存中的数据。在C中&#xff0c;指针是一种非常有用的数据类型&#xff0c;可以帮助我们在程序中对内存进行操作和管理。 正文 01-指针简介 指针的基本概念如下&#xff1a; 声明指针&#xff1a;使用“*”符…

javaweb学习week7

javaweb学习 十四.Springboot 1.配置优先级 Springboot中支持三种格式的配置文件&#xff1a; 注意&#xff1a;虽然Springboot支持多种格式配置文件&#xff0c;但是在项目开发时&#xff0c;推荐使用一种格式的配置&#xff08;yml是主流&#xff09; Springboot除了支持…

Java的java.util.concurrent.ExecutorService简介

在Java并发编程的璀璨星空中&#xff0c;ExecutorService无疑是那颗最耀眼的明星。它不仅是Java并发编程的核心组件之一&#xff0c;更是构建高并发、高性能应用的秘密武器。今天&#xff0c;我们就来一场说走就走的探索之旅&#xff0c;揭开它的神秘面纱&#xff01; &#x1…
最新文章