首页 > 编程语言 >设计Python函数参数的19个高级指南

设计Python函数参数的19个高级指南

时间:2024-11-02 14:50:13浏览次数:7  
标签:19 name 示例 Python 代码 pet 函数参数 参数 print

我们将深入探讨如何设计Python函数的参数,让你的代码更加灵活、高效和易用。我们会从基础开始,逐步引入更高级的概念和技术,确保你能够全面掌握这些技巧。

在这里插入图片描述

包含编程资料、学习路线图、源代码、软件安装包等!【[点击这里]】领取!


1.使用默认参数值

  • 理论知识:默认参数值允许你在调用函数时省略某些参数。这使得函数更加灵活,用户可以根据需要选择是否传递这些参数。
示例代码:
def greet(name, greeting="Hello"):  
return f"{greeting}, {name}!"    
# 调用示例  
print(greet("Alice"))  # 输出: Hello, Alice!  
print(greet("Bob", "Hi"))  # 输出: Hi, Bob!  
代码解释:
  • greet 函数有两个参数:namegreeting
  • greeting 参数有一个默认值 "Hello"
  • 当调用 greet("Alice") 时,greeting 使用默认值 "Hello"
  • 当调用 greet("Bob", "Hi") 时,greeting 使用传入的值 "Hi"

2.可变参数列表

  • 理论知识:使用 argskwargs 可以让函数接受任意数量的位置参数和关键字参数。这使得函数更加通用,适用于多种情况。
示例代码:
def print_args(*args):  
for arg in args:  
print(arg)    
def print_kwargs(**kwargs):  
for key, value in kwargs.items():  
print(f"{key}: {value}")    
# 调用示例  
print_args(1, 2, 3)  # 输出: 1 2 3  
print_kwargs(a=1, b=2, c=3)  # 输出: a: 1 b: 2 c: 3  
代码解释:
  • print_args 函数使用 args 接受任意数量的位置参数。
  • print_kwargs 函数使用 kwargs 接受任意数量的关键字参数。
  • argskwargs 都是元组和字典的形式,可以在函数内部进行遍历。

3.关键字参数

  • 理论知识:关键字参数允许你在调用函数时指定参数名称,这样可以提高代码的可读性和灵活性。
示例代码:
def describe_pet(animal_type, pet_name):  
return f"I have a {animal_type} named {pet_name}."   
# 调用示例  
print(describe_pet(animal_type="hamster", pet_name="Harry"))  # 输出: I have a hamster named Harry.  
代码解释:
  • describe_pet 函数有两个参数:animal_typepet_name
  • 在调用函数时,使用关键字参数 animal_type="hamster"pet_name="Harry",使代码更易读。

4.位置参数和关键字参数混合使用

  • 理论知识:你可以同时使用位置参数和关键字参数,但位置参数必须在关键字参数之前。
示例代码:
def describe_pet(pet_name, animal_type="dog"):  
return f"I have a {animal_type} named {pet_name}."    
# 调用示例  
print(describe_pet("Willie"))  # 输出: I have a dog named Willie.  
print(describe_pet("Harry", animal_type="hamster"))  # 输出: I have a hamster named Harry.  
代码解释:
  • describe_pet 函数有一个位置参数 pet_name 和一个带有默认值的关键字参数 animal_type
  • 在调用函数时,位置参数必须在关键字参数之前。

5.强制关键字参数

  • 理论知识:使用 * 可以强制某些参数必须以关键字形式传递,这有助于提高代码的可读性和清晰度。
示例代码:
def describe_pet(pet_name, *, animal_type="dog"):  
return f"I have a {animal_type} named {pet_name}."   
# 调用示例  
print(describe_pet("Willie"))  # 输出: I have a dog named Willie.  
# print(describe_pet("Harry", "hamster"))  # 报错  
print(describe_pet("Harry", animal_type="hamster"))  # 输出: I have a hamster named Harry.  
代码解释:
  • describe_pet 函数中,* 后面的参数 animal_type 必须以关键字形式传递。
  • 如果尝试以位置参数的形式传递 animal_type,会引发错误。

6.带有默认值的强制关键字参数

  • 理论知识:你可以为强制关键字参数设置默认值,这样在调用函数时可以选择是否传递这些参数。
示例代码:
def describe_pet(pet_name, *, animal_type="dog", age=None):  
description = f"I have a {animal_type} named {pet_name}."  
if age is not None:  
description += f" It is {age} years old."  
return description    
# 调用示例  
print(describe_pet("Willie"))  # 输出: I have a dog named Willie.  
print(describe_pet("Harry", animal_type="hamster", age=2))  # 输出: I have a hamster named Harry. It is 2 years old.  
代码解释:
  • describe_pet 函数中有两个强制关键字参数:animal_typeage
  • age 参数有一个默认值 None,如果未传递 age,则不会包含年龄信息。

7.使用类型注解

  • 理论知识:类型注解可以帮助你更好地理解和维护代码,提高代码的可读性和健壮性。
示例代码:
def add_numbers(a: int, b: int) -> int:  
return a + b    
# 调用示例  
result = add_numbers(3, 5)  
print(result)  # 输出: 8  
代码解释:
  • add_numbers 函数的参数 ab 都有类型注解 int
  • 返回值也有类型注解 int
  • 类型注解不强制执行类型检查,但可以在开发工具中提供更好的提示和支持。

8.使用可选类型注解

  • 理论知识:使用 Optional 类型注解可以表示某个参数或返回值可能是 None
示例代码:
from typing 
import Optional  
def greet(name: str, greeting: Optional[str] = None) -> str:  
if greeting is None:  
greeting = "Hello"  
return f"{greeting}, {name}!"    
# 调用示例  
print(greet("Alice"))  # 输出: Hello, Alice!  
print(greet("Bob", "Hi"))  # 输出: Hi, Bob!  
代码解释:
  • greet 函数的 greeting 参数使用 Optional[str] 类型注解,表示它可以是 strNone
  • 如果 greetingNone,则使用默认值 "Hello"

9.使用列表和字典类型注解

  • 理论知识:使用 ListDict 类型注解可以更精确地描述参数和返回值的类型。
示例代码:
from typing 
import List, Dict    
def process_data(data: List[Dict[str, int]]) -> int:  
total = 0  
for item in data:  
total += item["value"]  
return total    
# 调用示例  
data = [{"value": 10}, {"value": 20}, {"value": 30}]  
result = process_data(data)  
print(result)  # 输出: 60  
代码解释:
  • process_data 函数的参数 data 是一个包含字典的列表,每个字典都有一个键 "value"
  • 返回值是一个整数,表示所有字典中 "value" 键的值之和。

10.使用自定义类型注解

  • 理论知识:你可以定义自己的类型别名,使类型注解更加清晰和简洁。
示例代码:
from typing 
import List, Dict    
# 定义类型别名  
DataItem = Dict[str, int]  
DataList = List[DataItem]    
def process_data(data: DataList) -> int:  
total = 0  
for item in data:  
total += item["value"]  
return total    
# 调用示例  
data = [{"value": 10}, {"value": 20}, {"value": 30}]  
result = process_data(data)  
print(result)  # 输出: 60  
代码解释:
  • DataItemDataList 是自定义的类型别名,分别表示包含整数值的字典和包含这些字典的列表。
  • 使用类型别名可以使代码更易读和维护。

11.使用命名元组

  • 理论知识:命名元组(namedtuple)是一种轻量级的类,可以用来创建具有命名字段的不可变对象。使用命名元组可以提高代码的可读性和结构化。
示例代码:
from collections 
import namedtuple   
# 定义命名元组  
Person = namedtuple('Person', ['name', 'age'])    
def greet_person(person: Person) -> str:  
return f"Hello, {person.name}! You are {person.age} years old."    
# 调用示例  
alice = Person(name="Alice", age=30)  
print(greet_person(alice))  # 输出: Hello, Alice! You are 30 years old.  
代码解释:
  • Person 是一个命名元组,有两个字段:nameage
  • greet_person 函数接受一个 Person 对象作为参数,并使用其字段生成问候语。

12.使用数据类

  • 理论知识:数据类(dataclass)是Python 3.7引入的一个装饰器,用于自动生成特殊方法(如 __init____repr__),使类的定义更加简洁。
示例代码:
from dataclasses 
import dataclass    
@dataclass  
class Person:  
name: str  
age: int    
def greet_person(person: Person) -> str:  
return f"Hello, {person.name}! You are {person.age} years old."    
# 调用示例  
alice = Person(name="Alice", age=30)  
print(greet_person(alice))  # 输出: Hello, Alice! You are 30 years old.  
代码解释:
  • Person 类使用 @dataclass 装饰器,自动生成 __init____repr__ 方法。
  • greet_person 函数接受一个 Person 对象作为参数,并使用其字段生成问候语。

13.使用类型别名和泛型

  • 理论知识:类型别名和泛型可以进一步提高类型注解的灵活性和可读性。泛型允许你定义可以处理多种类型的函数和类。
示例代码:
from typing 
import TypeVar, List    
T = TypeVar('T')  
def get_first_element(lst: List[T]) -> T:  
return lst[0]    
# 调用示例  
numbers = [1, 2, 3]  
fruits = ["apple", "banana", "cherry"]    
print(get_first_element(numbers))  # 输出: 1  
print(get_first_element(fruits))  # 输出: apple  
代码解释:
  • T 是一个类型变量,表示 get_first_element 函数可以接受任何类型的列表。
  • get_first_element 函数返回列表的第一个元素,类型与列表元素类型相同。

14.使用 @staticmethod和@classmethod

  • 理论知识:静态方法(@staticmethod)和类方法(@classmethod)可以让你在类中定义不需要实例化的方法,适用于一些工具函数和工厂方法。
示例代码:
class MathUtils:  
@staticmethod  
def add(a: int, b: int) -> int:  
return a + b    
@classmethod  
def multiply(cls, a: int, b: int) -> int:  
return a * b    
# 调用示例  
print(MathUtils.add(3, 5))  # 输出: 8  
print(MathUtils.multiply(3, 5))  # 输出: 15  
代码解释:
  • MathUtils 类有两个方法:addmultiply
  • add 是一个静态方法,不需要类实例即可调用。
  • multiply 是一个类方法,可以通过类名调用。

15.使用 @property装饰器

  • 理论知识:属性(@property)装饰器允许你将方法伪装成属性,提供更自然的访问方式。
示例代码:
class Circle:  
def __init__(self, radius: float):  
self.radius = radius    
@property  
def diameter(self) -> float:  
return 2 * self.radius    
# 调用示例  
circle = Circle(5)  
print(circle.diameter)  # 输出: 10.0  
代码解释:
  • Circle 类有一个 radius 属性和一个 diameter 属性。
  • diameter 使用 @property 装饰器,可以通过 circle.diameter 访问,而无需调用方法。

16.使用*分割位置参数和关键字参数

  • 理论知识:使用 * 可以明确区分位置参数和关键字参数,提高函数的可读性和灵活性。
示例代码:
def describe_pet(pet_name, *, animal_type, age=None):  
description = f"I have a {animal_type} named {pet_name}."  
if age is not None:  
description += f" It is {age} years old."  
return description    
# 调用示例  
print(describe_pet("Willie", animal_type="dog"))  # 输出: I have a dog named Willie.  
print(describe_pet("Harry", animal_type="hamster", age=2))  # 输出: I have a hamster named Harry. It is 2 years old.  
代码解释:
  • describe_pet 函数中,* 后面的参数 animal_typeage 必须以关键字形式传递。
  • 这样可以避免位置参数和关键字参数的混淆。

17.使用**解包字典

  • 理论知识:使用 ** 可以将字典解包为关键字参数,方便传递多个参数。
示例代码:
def describe_pet(pet_name, animal_type, age=None):  
description = f"I have a {animal_type} named {pet_name}."  
if age is not None:  
description += f" It is {age} years old."  
return description    
# 调用示例  
pet_info = {"pet_name": "Willie", "animal_type": "dog"}  
print(describe_pet(**pet_info))  # 输出: I have a dog named Willie.    
pet_info_with_age = {"pet_name": "Harry", "animal_type": "hamster", "age": 2}  
print(describe_pet(**pet_info_with_age))  # 输出: I have a hamster named Harry. It is 2 years old.  
代码解释:
  • pet_infopet_info_with_age 是包含关键字参数的字典。
  • 使用 ** 将字典解包为关键字参数传递给 describe_pet 函数。

18.使用*解包列表

  • 理论知识:使用 * 可以将列表解包为位置参数,方便传递多个参数。
示例代码:
def add_numbers(a, b, c):  
return a + b + c    
# 调用示例  
numbers = [1, 2, 3]  
print(add_numbers(*numbers))  # 输出: 6  
代码解释:
  • numbers 是一个包含三个数字的列表。
  • 使用 * 将列表解包为位置参数传递给 add_numbers 函数。

19.使用 functools.partial创建部分应用函数

  • 理论知识:functools.partial 可以创建一个部分应用函数,固定某些参数,减少函数调用时的参数数量。
示例代码:
from functools 
import partial    
def power(base, exponent):  
return base ** exponent    
# 创建部分应用函数  
square = partial(power, exponent=2)  
cube = partial(power, exponent=3)    
# 调用示例  
print(square(2))  # 输出: 4  
print(cube(2))  # 输出: 8  
代码解释:
  • power 函数接受两个参数:baseexponent
  • 使用 partial 创建两个部分应用函数:squarecube
  • square 固定了 exponent 为 2,cube 固定了 exponent 为 3。

实战案例:日志记录器

  • 假设你正在开发一个应用程序,需要记录不同级别的日志(如调试、信息、警告和错误)。我们可以设计一个灵活的日志记录器函数,支持不同的日志级别和格式化选项。
示例代码:
import logging  
from typing 
import Optional  
# 设置日志格式  
logging.basicConfig(level=logging.DEBUG, format='%(asctime)s - %(levelname)s - %(message)s')    
def log_message(level: str, message: str, extra_info: Optional[str] = None):  
if level.lower() == "debug":  
logging.debug(message if extra_info is None else f"{message} - {extra_info}")  
elif level.lower() == "info":  
logging.info(message if extra_info is None else f"{message} - {extra_info}")  
elif level.lower() == "warning":  
logging.warning(message if extra_info is None else f"{message} - {extra_info}")  
elif level.lower() == "error":  
logging.error(message if extra_info is None else f"{message} - {extra_info}")  
else:  
raise ValueError("Invalid log level")    
# 调用示例  
log_message("debug", "This is a debug message")  
log_message("info", "This is an info message", "Additional info")  
log_message("warning", "This is a warning message")  
log_message("error", "This is an error message", "Error details")  
代码解释:
  • log_message 函数接受三个参数:levelmessageextra_info
  • level 参数指定日志级别,可以是 debuginfowarningerror
  • message 参数是日志消息。
  • extra_info 参数是可选的附加信息。
  • 根据 level 参数的不同,使用 logging 模块记录相应级别的日志。
    图片

总结

  • 最后希望你编程学习上不急不躁,按照计划有条不紊推进,把任何一件事做到极致,都是不容易的,加油,努力!相信自己!

文末福利

  • 最后这里免费分享给大家一份Python全套学习资料,希望能帮到那些不满现状,想提升自己却又没有方向的朋友,也可以和我一起来学习交流呀。

包含编程资料、学习路线图、源代码、软件安装包等!【[点击这里]】领取!

  • ① Python所有方向的学习路线图,清楚各个方向要学什么东西
  • ② 100多节Python课程视频,涵盖必备基础、爬虫和数据分析
  • ③ 100多个Python实战案例,学习不再是只会理论
  • ④ 华为出品独家Python漫画教程,手机也能学习

可以扫描下方二维码领取【保证100%免费在这里插入图片描述

标签:19,name,示例,Python,代码,pet,函数参数,参数,print
From: https://blog.csdn.net/2401_88349668/article/details/143450482

相关文章

  • Python安装与配置pycharmIDE汉化集活完整教程!
    【一】Python解释器下载【运行环境】【1】Python官网包含编程资料、学习路线图、源代码、软件安装包等!【[点击这里]】![https://www.python.org](官网进不去的可以点击点击领取,100%免费!安装包)【2】Python各版本解释器官网【二】Windows系统安装Python解释器【1】......
  • Python使用GDI进行绘制的各种方式 - 幽络源
    介绍:在这篇文章中,我们将深入探讨使用Python的GDI(图形设备接口)进行绘图的各种方式。本文将涵盖以下内容:绘制像素点绘制线条绘制实心矩形绘制空心矩形绘制文字像素点绘制以下代码运行后将会在屏幕500,100的位置绘制一个像素点importwin32guiimportwin32api#获取屏......
  • python之字符串总结
     字符串(str)对于字符串的学习,我整理了网上的一些资料,希望可以帮助到各位!!!概述由多个字母,数字,特殊字符组成的有限序列字符串的定义:可以使用一对单引号或者双引号,也可以一对三个单引号或者一对三个双引号定义字符串。注意:没有单符号的数据类型'a'"a"s1='......
  • 学霸带你游戏化 Python 编程知识轻松上手
    Python基础与游戏开发包在游戏开发的世界里,Python以其简单易用的特性而备受推崇。无论是独立游戏还是大型项目,Python都能在开发过程中发挥重要作用。通过了解Python的基础知识,开发者不仅能提升编程能力,还能更好地应对游戏设计中的各种挑战。接下来,我们将深入探讨Python......
  • python+flask框架的校园订餐管理系统的设计与实现(开题+程序+论文) 计算机毕业设计
    本系统(程序+源码+数据库+调试部署+开发环境)带论文文档1万字以上,文末可获取,系统界面在最后面。系统程序文件列表开题报告内容选题背景随着信息技术的飞速发展和高校生活节奏的加快,校园订餐管理系统已成为提升校园生活质量和效率的重要工具。当前,国内外对于订餐系统的研究主......
  • python+flask框架的校园表白墙前端视频8(开题+程序+论文) 计算机毕业设计
    本系统(程序+源码+数据库+调试部署+开发环境)带论文文档1万字以上,文末可获取,系统界面在最后面。系统程序文件列表开题报告内容选题背景在校园生活中,学生间的情感交流与互动是校园文化的重要组成部分。近年来,随着社交媒体和互联网技术的发展,线上表白墙逐渐成为大学生表达情感......
  • python+flask框架的校园表白墙服务端视频8(开题+程序+论文) 计算机毕业设计
    本系统(程序+源码+数据库+调试部署+开发环境)带论文文档1万字以上,文末可获取,系统界面在最后面。系统程序文件列表开题报告内容选题背景随着互联网的快速发展,校园生活日益数字化和便捷化。在校园社交领域,表白墙作为一种独特的社交形式,深受广大学生喜爱。然而,关于校园表白墙服......
  • python+flask框架的校友拼车微信小程序服务端8(开题+程序+论文) 计算机毕业设计
    本系统(程序+源码+数据库+调试部署+开发环境)带论文文档1万字以上,文末可获取,系统界面在最后面。系统程序文件列表开题报告内容选题背景随着移动互联网技术的迅猛发展,人们的生活方式发生了翻天覆地的变化,其中出行方式的多样化尤为显著。拼车作为一种环保、经济的出行方式,越来......
  • 升级python版本后遇到的问题
    错误信息提示虚拟环境报错:删除venv文件后,重启pycharm,再次添加虚拟环境即可 升级python版本后MobileBy报错,python3.11升级为python3.12.3把 fromappium.webdriver.common.mobilebyimportMobileBy改为fromappium.webdriver.common.appiumbyimportAppiumBy即可 Fil......
  • 使用wxpython开发跨平台桌面应用,实现程序托盘图标和界面最小化及恢复处理4j
    在前面随笔《基于wxpython的跨平台桌面应用系统开发》介绍了一些关于wxpython开发跨平台桌面应用的总体效果,开发桌面应用,会有很多界面细节需要逐一处理,本篇随笔继续深入该主题,对开发跨平台桌面应用的一些实现细节继续深入研究并总结,介绍程序托盘图标和界面最小化及恢复处理。1、......