【python】(5)函数(python里面函数)
toyiye 2024-09-09 08:59 3 浏览 0 评论
def 函数名(参数1,参数2....):
...
reture 结果 #可以不返回
def greet_user():
"""显示简单的问候语"""
print("hello")
greet_user()
参数
关键字参数
指定参数指向,如果不加关键字必须顺序一致
def greet_user(animal_type, pet_name):
print(f"我有一只宠物{animal_type},它叫做{pet_name}") greet_user( pet_name="皮特",animal_type="狗")
greet_user("狗", "皮特")
默认参数
函数参数可以有默认值。如果没有为这些参数提供值,将自动使用定义函数时指定的默认值。
定义具有默认值的参数只需要在函数定义中将值赋给参数即可。
def greet(name, msg="Hello"):
print(f"{msg}, {name}!")
greet("Alice") # 使用默认消息
greet("Bob", "Good morning") # 提供自定义消息
在这个例子中, msg 参数有一个默认值 "Hello"。如果调用 greet 时没有提供 msg 参数的值,就会使用这个默认值。
当默认值是可变对象(例如列表、字典或其他可变类型)时,可能会遇到预期之外的行为。
def append_number(numbers=[]):
numbers.append(1)
return numbers
print(append_number()) # 输出: [1]
print(append_number()) # 输出: [1, 1]
这个行为是因为函数的默认值只在函数定义时评估一次,所以每次调用 append_number 时,如果不提供 numbers 参数,都会使用同一个列表对象。为了避免这个问题,推荐使用不可变对象作为默认值。
对于需要使用可变对象作为默认值的情况,推荐的做法是使用 None 作为默认值,在函数体内部检查它,并据此初始化。
def append_number(numbers=None):
if numbers is None:
numbers = []
numbers.append(1)
return numbers
print(append_number()) # 输出: [1]
print(append_number()) # 输出: [1]
这样每次调用 append_number 时,如果没有提供 numbers 参数,都会创建一个新的空列表。
可变参数
可变参数允许函数调用时传入任意数量的参数,无论是位置参数还是关键字参数。这通过使用 *args 和 **kwargs 语法实现。
使用*args接受任意数量的位置参数
当你在函数定义中使用 *args 时,所有传入的位置参数都会被收集到一个名为 args 的元组中。 args 是约定俗成的名称,你也可以使用其他名称,但 * 符号是必须的。
def print_args(*args):
for arg in args:
print(arg)
print_args('hello', 'world', 123)
这里, print_args 可以接受任意数量的位置参数,并将它们依次打印出来。
使用**kwargs接受任意数量的关键字参数
使用 **kwargs 时,所有传入的关键字参数都会被收集到一个名为 kwargs 的字典中。同样地, kwargs 只是一个习惯用法,你可以使用任何你喜欢的参数名,关键是 ** 符号。
def print_kwargs(**kwargs):
for key, value in kwargs.items():
print(f"{key}: {value}")
print_kwargs(name='Alice', age=30)
在这个例子中, print_kwargs 函数接受任意数量的关键字参数,并遍历 kwargs 字典,打印出所有的键值对。
同时使用*args和**kwargs
你可以在同一个函数中同时使用 *args 和 **kwargs 来让它接受任意数量的位置参数和关键字参数。
def print_everything(*args, **kwargs):
for arg in args:
print(arg)
for key, value in kwargs.items():
print(f"{key}: {value}")
print_everything('apple', 'banana', color='red', count=5)
在这个例子中, print_everything 函数同时接受任意数量的位置参数和关键字参数,并分别处理它们。
注意
- 当同时使用 *args 和 **kwargs 时, *args 必须位于 **kwargs 之前。
- 在调用函数时,位置参数必须在关键字参数之前。
- 使用可变参数时,要注意函数内部对 args 和 kwargs 的处理逻辑,确保函数的行为符合预期。
函数返回值
通过 return 语句,函数能够返回一个或多个值。
单个返回值
最基本的形式是函数返回单个值。这通过简单地在函数中使用 return 语句实现。
def square(number):
return number ** 2
result = square(4)
print(result) # 输出: 16
在这个例子中, square 函数计算传入数字的平方并返回结果。
返回多个值
可以一次性返回多个值,这通常是通过返回一个元组实现的。在实际应用中,你不需要显式地创建元组;只需在 return 语句中用逗号分隔多个返回值即可。
def get_user():
name = "Alice"
age = 30
return name, age
# 直接解包赋值
user_name, user_age = get_user()
print(user_name, user_age) # 输出: Alice 30
这里, get_user 函数返回了两个值: name 和 age。调用函数时,可以通过多个变量接收这些返回值。
没有返回值
如果函数没有 return 语句,或者 return 语句没有跟随任何值,那么函数会默认返回 None。
def print_message(message):
print(message)
result = print_message("Hello, Python!")
print(result) # 输出: None
即便 print_message 函数执行了打印操作,但由于没有 return 语句,它返回了 None。
使用return提前退出函数
return 语句不仅用于返回值,还可以用于提前退出函数,即使在函数的其他部分还有代码。
def divide(x, y):
if y == 0:
print("Error: Division by zero.")
return
return x / y
result = divide(10, 0)
print(result) # 输出: Error: Division by zero.
# None
在这个例子中,如果尝试除以零,则函数会打印错误消息并提前退出,返回 None。
匿名函数
匿名函数或 lambda 函数是一种定义简单函数的快捷方式,它们不需要使用标准的 def 关键字。匿名函数主要用于编写简洁的代码,尤其是在需要将函数作为参数传递给其他函数的场景中。
基本语法
匿名函数的基本语法如下:
lambda arguments: expression
这里, lambda 是定义匿名函数的关键字, arguments 是函数的参数, expression 是函数体,它是一个表达式,表达式的计算结果就是函数的返回值。
square = lambda x: x ** 2
print(square(5)) # 输出: 25
在这个例子中,我们定义了一个匿名函数来计算数字的平方,并将这个函数赋值给变量 square。然后,我们调用这个匿名函数并打印结果。
使用场景
匿名函数通常用于函数调用的参数中,特别是那些接受其他函数作为参数的高阶函数。例如, filter()、 map() 和 sorted() 等。
使用map()应用匿名函数
map() 函数可以将匿名函数应用于序列中的每个元素。
numbers = [1, 2, 3, 4, 5]
squared = list(map(lambda x: x ** 2, numbers))
print(squared) # 输出: [1, 4, 9, 16, 25]
使用filter()过滤序列
filter() 函数可以使用匿名函数来过滤序列,只保留满足条件的元素。
numbers = [1, 2, 3, 4, 5, 6]
even_numbers = list(filter(lambda x: x % 2 == 0, numbers))
print(even_numbers) # 输出: [2, 4, 6]
在sorted()中使用自定义排序
通过 sorted() 函数的 key 参数,我们可以使用匿名函数来自定义排序逻辑。
points = [(1, 2), (3, 1), (5, 4)]
sorted_points = sorted(points, key=lambda point: point[1])
print(sorted_points) # 输出: [(3, 1), (1, 2), (5, 4)]
限制
虽然匿名函数非常灵活且代码简洁,但它们也有一些限制:
- 只能包含一个表达式,不能包含复杂的逻辑。
- 不能包含命令,例如循环或多个语句。
相关推荐
- 为何越来越多的编程语言使用JSON(为什么编程)
-
JSON是JavascriptObjectNotation的缩写,意思是Javascript对象表示法,是一种易于人类阅读和对编程友好的文本数据传递方法,是JavaScript语言规范定义的一个子...
- 何时在数据库中使用 JSON(数据库用json格式存储)
-
在本文中,您将了解何时应考虑将JSON数据类型添加到表中以及何时应避免使用它们。每天?分享?最新?软件?开发?,Devops,敏捷?,测试?以及?项目?管理?最新?,最热门?的?文章?,每天?花?...
- MySQL 从零开始:05 数据类型(mysql数据类型有哪些,并举例)
-
前面的讲解中已经接触到了表的创建,表的创建是对字段的声明,比如:上述语句声明了字段的名称、类型、所占空间、默认值和是否可以为空等信息。其中的int、varchar、char和decimal都...
- JSON对象花样进阶(json格式对象)
-
一、引言在现代Web开发中,JSON(JavaScriptObjectNotation)已经成为数据交换的标准格式。无论是从前端向后端发送数据,还是从后端接收数据,JSON都是不可或缺的一部分。...
- 深入理解 JSON 和 Form-data(json和formdata提交区别)
-
在讨论现代网络开发与API设计的语境下,理解客户端和服务器间如何有效且可靠地交换数据变得尤为关键。这里,特别值得关注的是两种主流数据格式:...
- JSON 语法(json 语法 priority)
-
JSON语法是JavaScript语法的子集。JSON语法规则JSON语法是JavaScript对象表示法语法的子集。数据在名称/值对中数据由逗号分隔花括号保存对象方括号保存数组JS...
- JSON语法详解(json的语法规则)
-
JSON语法规则JSON语法是JavaScript对象表示法语法的子集。数据在名称/值对中数据由逗号分隔大括号保存对象中括号保存数组注意:json的key是字符串,且必须是双引号,不能是单引号...
- MySQL JSON数据类型操作(mysql的json)
-
概述mysql自5.7.8版本开始,就支持了json结构的数据存储和查询,这表明了mysql也在不断的学习和增加nosql数据库的有点。但mysql毕竟是关系型数据库,在处理json这种非结构化的数据...
- JSON的数据模式(json数据格式示例)
-
像XML模式一样,JSON数据格式也有Schema,这是一个基于JSON格式的规范。JSON模式也以JSON格式编写。它用于验证JSON数据。JSON模式示例以下代码显示了基本的JSON模式。{"...
- 前端学习——JSON格式详解(后端json格式)
-
JSON(JavaScriptObjectNotation)是一种轻量级的数据交换格式。易于人阅读和编写。同时也易于机器解析和生成。它基于JavaScriptProgrammingLa...
- 什么是 JSON:详解 JSON 及其优势(什么叫json)
-
现在程序员还有谁不知道JSON吗?无论对于前端还是后端,JSON都是一种常见的数据格式。那么JSON到底是什么呢?JSON的定义...
- PostgreSQL JSON 类型:处理结构化数据
-
PostgreSQL提供JSON类型,以存储结构化数据。JSON是一种开放的数据格式,可用于存储各种类型的值。什么是JSON类型?JSON类型表示JSON(JavaScriptO...
- JavaScript:JSON、三种包装类(javascript 包)
-
JOSN:我们希望可以将一个对象在不同的语言中进行传递,以达到通信的目的,最佳方式就是将一个对象转换为字符串的形式JSON(JavaScriptObjectNotation)-JS的对象表示法...
- Python数据分析 只要1分钟 教你玩转JSON 全程干货
-
Json简介:Json,全名JavaScriptObjectNotation,JSON(JavaScriptObjectNotation(记号、标记))是一种轻量级的数据交换格式。它基于J...
- 比较一下JSON与XML两种数据格式?(json和xml哪个好)
-
JSON(JavaScriptObjectNotation)和XML(eXtensibleMarkupLanguage)是在日常开发中比较常用的两种数据格式,它们主要的作用就是用来进行数据的传...
你 发表评论:
欢迎- 一周热门
- 最近发表
- 标签列表
-
- r语言矩阵 (127)
- browsererror (114)
- exportexcel (119)
- cv2.bitwise_not (137)
- dump命令 (128)
- es6concat (126)
- heapify (127)
- java.security.egd (130)
- javax.annotation (117)
- jsstringsplit (117)
- js数字 (115)
- maven编译 (132)
- mysqlleft (128)
- nodejsbuffer (149)
- org.apache.commons.httpclient (126)
- org.jsoup (141)
- org.springframework.web (128)
- robotframework-ride (115)
- setnocounton (141)
- socket.gethostbyname (122)
- sqlmid (121)
- time.strptime (133)
- vscode格式化 (125)
- win32con (129)
- window.localstorage (126)