返回顶部
首页 > 资讯 > 后端开发 > Python >Python参数类型以及常见的坑
  • 367
分享到

Python参数类型以及常见的坑

常见参数类型 2023-01-31 06:01:30 367人浏览 八月长安

Python 官方文档:入门教程 => 点击学习

摘要

导语   由于之前遇到过几次有关于参数类型的坑,以及经常容易把一些参数类型搞混淆,现在做一下有关参数类型的总结记录以及对之前踩坑经历的分析。 参数类型 首先我们列举一下有关于python的参数类型,以及实际上的运用和原理。 位置参数

导语

  由于之前遇到过几次有关于参数类型的坑,以及经常容易把一些参数类型搞混淆,现在做一下有关参数类型的总结记录以及对之前踩坑经历的分析。

参数类型

首先我们列举一下有关于python的参数类型,以及实际上的运用和原理。

  • 位置参数(必选参数)
  • 默认参数
  • 可变参数
  • 关键字参数

位置参数(必选参数)

首先是位置参数,同时也被称作必选参数,位置参数很好理解,只要记住这点:

  • 在函数定义时直接给定的此参数名称,调用时按照参数的位置顺序,依次赋予参数值。

示例:

def person_info(name, age):
    print("My name is %s, I am %s years old" % (name, age))

person_info("zhangsan", "49")    
# name,age都是位置参数,按照位置顺序,函数中依次接收参数值。

默认参数

默认参数,默认参数存在许多便利的地方,但是同时也存在许多坑,等到后面我们再去仔细分析下为什么存在这些坑,以下几点我们需要注意的:

  • 可以为一个或者多个参数指定默认值,当调用函数时可以不用传入该参数值,大大降低函数调用的难度。
  • 当需要用传入的参数值代替默认参数的默认值时,可以按照参数位置顺序传入,同时也可以指定参数名传入。

示例:

def person_info(name, age, sex='man'):
    print("My name is %s, I am %s years old, I am %s" % (name, age, sex))

person_info('zhangsan', '15')
person_info('lisi', '15', 'women')
person_info('lisi', '20', sex='women')

可变参数

可变参数,顾名思义就是传入的参数数量是可变的:

  • 可变参数在实际中,传入的数量可以是任意多个,但也可以没有。
  • 而可变参数会在传入函数内部时,是一个tuple的形式。

示例:

def add(*numbers):
    sum = 0
    for i in numbers:
        sum+=i
    return sum

print(add(1,3,4,2,1,4,1,3)) 

numbers=[2,3,4,1,5]
add(*numbers)
# 当传入的参数为list时,会将list中所有的元素作为可变参数,传进去

关键字参数

可变参数传入0个或者任意个参数时,这些可变参数会在函数调用时自动组装成一个tuple。而关键字参数也允许你传入0个或者任意个含参数名的参数,这些关键字参数会函数内部自动组装为一个dict。调用函数时,可以只传入必选参数。

  • 扩展函数的功能,**kwargs

示例:

def person_info(**kw):
    for key,value in kw.items():
        print(key, value)

person_info(name='zhangsan', age=15)
person = {'name': 'zhangsan', 'age': 13}
person_info(**person)

命名关键字参数

对于关键字参数,函数的调用者可以传入任意不受限制的关键字参数。但是针对到底传入了哪些参数,就需要通过函数内部分析检查。所以命名关键字参数就是限制传入的参数的名字,只能传我已命名关键字参数。

  • 命名关键字参数需要一个特殊分隔符*,分隔符后面的参数会被视为命名关键字参数。
  • 当函数中已经存在一个可变参数,后面跟着的命名关键字参数就不需要一个*特殊分隔符——“”**。
  • 命名关键参数可以有默认值,从而简化调用。
  • 命名关键参数必须传入一个参数名,这和位置参数不同。如果没有传入参数名,调用将会报错。

示例:

def person_info(name, *, age, sex):
    print(name, age, sex)

def person_info2(name, *args, age, sex):
    for i in args:
        print(i)
    print(name, age, sex)

person_info('zhangsan', age=12, sex='man')
person_info2('zhangsan', 'sksks', 'ssk', age=13, sex='man')  

数组合调用规则

Python定义函数过程中,可以用位置参数、默认参数、可变参数、关键字参数、命名关键字参数。这五种参数都可以通过组合使用。需要注意的是:

  • 这五种参数定义的顺序必须是:位置参数、默认参数、可变参数、命名关键字参数、关键字参数。

位置参数和默认参数组合

def Person(name, age=20):
    print(name,age)

Person('zhangsan')
Person('zhangsan', 20)        

位置参数、默认参数、可变参数组合

def Person(name, age=20, *args):
    for i in args:
        print(i)
    print(name, age)

Person('zhangsan')
Person('zhangsan', 22, "Beijing")
Person('zhangsan', age=22, 'Shanghai')    

位置参数、默认参数、可变参数、命名关键字参数组合

def Person(name, age=20, *args, city, **kwargs):
    for i in args:
        print(i)
    for key,value in kwargs.items():
        print(key, value)
    print(name, age, city)

Person('zhangsan', age=12, 'Author', city='Shanghai', company='Shanghai Software')        

关于参数定义的一些坑

默认参数陷阱

关于默认参数陷阱的问题,我们先来看一看一个示例:

def Book(book, book_list=[]):
    print(id(book_list))
    book_list.append(book)
    for book in book_list:
        print(book)
    print(id(book_list))    

test = Book("First One")      

输出的结果:
Python参数类型以及常见的坑

这个输出的结果应该是意料之中,现在我们这时候再调用Book()方法,看看会发生什么:
Python参数类型以及常见的坑

  这时候输出结果,竟然把之前的First one都输出,看了他们的id,发现都是同一块内存地址,这时候就开始纳闷了,那么来找找出现这种状况的原因。
经过查阅官方资料发现,这是一段Python官方文档给出的解释:
Important warning: The default value is evaluated only once. This makes a difference when the default is a mutable object such as a list, dictionary, or instances of most classes. For example, the following function accumulates the arguments passed to it on subsequent calls:
  我们来看看解释分析下,Python官方文档给出的理由就是Python对默认值只计算一次,对于可变对象,在后续调用的情况下会累积传递给他们。而list、dict等这种都属于可变对象。
  那么对于这种默认值陷阱,我们是该如何避免造成一些不必要的麻烦呢?大致有两种解决方法:

  • 避免使用可变对象作为默认值。
  • 在参数定义的时候可以使用None对象作为占位符。

对于第二种方法:

def Book(book, book_list=None):
    print(book_list)
    if book_list is None:
        book_list = []
    book_list.append(book)
    for book in book_list:
        print(book)
    print(id(book_list))  

test1 = Book('First one')
test2 = Book('Second one')   

测试结果:
Python参数类型以及常见的坑

慎用变长参数

   前面已经介绍过了,Python是支持可变长度的参数列表,可以在函数定义参数时使用*args和**kwargs两个特殊的语法来实现。
  那为什么要说慎用变长参数,我总结了一下有以下几个原因:

  • 使用过于灵活。比如在我上面有关不同类型参数组合使用的示例中,在位置参数和默认参数在的情况下,还有可变参数、关键字参数、命名关键字参数。这就很容易是的这个函数的签名不够清晰,调用者需要花费时间去了解你这个方法该如何调用。所以这就很容易使得团队开发中效率低效。
  • 另外一个原因,如果一个函数的列表过于长,虽然可以通过使用*args, **kwargs来简化函数,但同时也意味这个函数或许有更好的实现方式,有重构的必要。

  说完了要慎用,在说说看我们常用的变长参数的使用场景:

  • 为函数添加一个装饰器。
  • 如果参数的数目不确定的时候,可以考虑使用变长参数。比如读取一些配置文件中的配置项时。
  • 用来实现函数的多态,或者在继承情况下子类需要调用父类的某些方法。

总结

   关于的Python参数类型就写到这里了,刚开始学Python的时候,经常被函数定义的参数类型搞懵,后面看了一些教程,自己在写一些脚本的时候遇到的一些坑,并且在看一些大牛分析背后的原理,后面感觉收获良多。后面干脆想把自己学习过程遇到的东西都整理一下,做个记录,加深理解。
下面是我参考的一些博客文章:
https://www.liaoxuefeng.com/wiki/1016959663602400/1017261630425888
Http://cenalulu.GitHub.io/python/default-mutable-arguments/
https://www.cnblogs.com/Clonglegs/p/9564873.html
https://blog.csdn.net/u014745194/article/details/70158926

--结束END--

本文标题: Python参数类型以及常见的坑

本文链接: https://lsjlt.com/news/189939.html(转载时请注明来源链接)

有问题或投稿请发送至: 邮箱/279061341@qq.com    QQ/279061341

猜你喜欢
  • Python参数类型以及常见的坑
    导语   由于之前遇到过几次有关于参数类型的坑,以及经常容易把一些参数类型搞混淆,现在做一下有关参数类型的总结记录以及对之前踩坑经历的分析。 参数类型 首先我们列举一下有关于Python的参数类型,以及实际上的运用和原理。 位置参数...
    99+
    2023-01-31
    常见 参数 类型
  • python-常见数据类型及其方法
    1.None: 表示空(无任何功能,专门用于提供空值) 2.整形(int) 3.布尔类型(bool) 只有两个结果:True/False: 0/''/[]/()/{}/set() 转布尔时为Fals...
    99+
    2023-01-31
    数据类型 常见 方法
  • nginx 常见参数以及重定向参数配置
    nginx 各参数翻译,作用$arg_PARAMETER #这个变量包含GET请求中,如果有变量PARAMETER时的值。$args #这个变量等于请求行中(GET请求)的参数,例如foo=123&bar=blahblah;$bin...
    99+
    2023-06-05
  • Python数据类型指南:掌握常见数据类型及其运用
    Python是一种简单而强大的编程语言,广泛用于数据分析和科学计算。要成功使用Python进行数据分析,了解不同的数据类型及其应用至关重要。本文将介绍常用的Python数据类型,并提供具体的代码示例。 数字类型(Numbers)...
    99+
    2024-01-20
    Python 应用 数据类型
  • C#简单认识TransactionScope,以及常见的事务类型
    TransactionScope是C#中用于管理事务的类,它提供了一种简单的方式来创建和管理数据库事务。事务是一系列操作的逻辑单元,...
    99+
    2023-09-14
    C#
  • Python---限定函数参数的类型及默
    python作为一门动态语言,在使用变量之前是不需要进行定义,而是通过动态绑定的方法将变量绑定为某种类型。这样做为我们使用变量时提供了方便,但有时也给我们使用变量时造成了一定的困扰,例如在使用变量时不知道变量的类型,使用函数时不知...
    99+
    2023-01-31
    函数 参数 类型
  • python常见错误类型
    Python标准异常总结 AssertionError 断言语句(assert)失败 AttributeError 尝试访问未知的对象属性 EOFError 用户输入文件末尾标志EOF(Ctrl+d) Floating...
    99+
    2023-01-31
    错误 常见 类型
  • PHP中常见的数组类型及其应用
    PHP是一种广泛应用的服务器端脚本语言,用于开发Web应用程序。在PHP中,数组是一种非常常见和重要的数据类型,可以用来存储多个值。PHP提供了多种数组类型,每种类型都有不同的特点和用...
    99+
    2024-03-13
    php数组 数组类型 应用示例 iphone 键值对
  • python函数参数类型及其顺序
    根据inspect模块官文文档中关于函数参数类型的相关说明,python函数参数共有五种类型,按顺序分别为:POSITIONAL_ONLY、POSITIONAL_OR_KEYWORD、VAR_POSITIONAL、KEYWORD_ONLY...
    99+
    2023-01-30
    函数 顺序 参数
  • Python常见异常类型处理
    目录1.Python语法错误 2.Python运行时错误 前言: 开发人员在编写程序时,难免会遇到错误,有的是编写人员疏忽造成的语法错误,有的是程序内部隐含逻辑问题造成的数据错误,还...
    99+
    2024-04-02
  • Python中常见的错误类型及解决方案
    Python中常见的错误类型及解决方案在使用Python进行编程的过程中,我们经常会遇到各种各样的错误。这些错误可能是因为我们的代码有误,也可能是由于运行环境或依赖库的问题。了解这些错误类型及其解决方案对于我们提高编程效率和调试能力非常重要...
    99+
    2023-10-22
    语法错误 逻辑错误 解决方案: 错误类型: 异常错误
  • Redis安装启动及常见数据类型
    Redis 简介 Redis 是我们在互联网应用中使用最广泛的一个 NoSQL 数据库,基于 C 开发的键值对存储数据库。 Redis 这个名字是 Remote Dictionary...
    99+
    2024-04-02
  • 13种常见的网络攻击类型以及如何预防
    1. DOS/DDoS 攻击:预防方法包括使用防火墙和入侵检测系统来过滤恶意流量,以及使用负载均衡和流量分发器来分散攻击流量。2. ...
    99+
    2023-09-22
    网络攻击
  • C++ 函数返回值类型的常见类型
    c++++ 函数返回类型包括:void(无返回值)、基本类型(整数、浮点数、字符和布尔值)、指针、引用、类和结构。选择时,应考虑功能、效率和接口。如计算阶乘的 factorial 函数,...
    99+
    2024-04-12
    函数 返回值 c++
  • Python开发中常见的数据类型问题及解决策略
    Python开发中常见的数据类型问题及解决策略概述:在Python开发过程中,处理数据是一个非常常见的任务。然而,由于数据的多样性和复杂性,很容易出现一些数据类型相关的问题。本文将介绍一些常见的数据类型问题,并提供相应的解决策略和代码示例。...
    99+
    2023-10-22
    策略 数据类型 问题
  • 介绍常见的Python数据类型转换函数
    Python中常用的数据类型转换函数介绍 在Python编程语言中,数据类型转换是一项常见且重要的操作。通过数据类型转换,我们可以将一个数据对象从一种类型转换为另一种类型,使得我们能够更灵活地处理不同类型的数据。本文将介绍Pyt...
    99+
    2024-01-20
    str() float() int()
  • 深入了解Python中常见的数据类型
    Python数据类型详解:探索Python中的常见数据类型 引言:在Python编程语言中,数据类型是非常重要的概念。了解数据类型的特性以及如何正确使用它们,可以在编写Python程序时提高效率,减少错误。本文将详细探索Pyth...
    99+
    2024-01-20
    Python编程 常见数据类型
  • Python常见的BUG类型有哪些
    今天小编给大家分享一下Python常见的BUG类型有哪些的相关知识点,内容详细,逻辑清晰,相信大部分人都还太了解这方面的知识,所以分享这篇文章给大家参考一下,希望大家阅读完这篇文章后有所收获,下面我们一起来了解一下吧。错误类型 1:语法错误...
    99+
    2023-06-27
  • Python常见类型转换的小结
    目录一:常见类型的概念二:类型转换1,二进制,八进制,十进制,十六进制转换2,数值字符串转换3,字符串和字节byte转换4,报文数据包和其他类型的互转4.1 bin十六进制...
    99+
    2023-02-21
    Python常见类型转换 Python 类型转换
  • Python异常类型以及处理方法汇总
    目录前言1 异常类型1.1 Python内置异常1.2 requests模块的相关异常1.3 用户自定义异常2. 异常捕获2.1 捕获所有异常2.2 捕...
    99+
    2024-04-02
软考高级职称资格查询
编程网,编程工程师的家园,是目前国内优秀的开源技术社区之一,形成了由开源软件库、代码分享、资讯、协作翻译、讨论区和博客等几大频道内容,为IT开发者提供了一个发现、使用、并交流开源技术的平台。
  • 官方手机版

  • 微信公众号

  • 商务合作