python怎么引入数学函数_python计算函数值

前言

上一篇文章中介绍了Python定义函数参数和传参的实现,详情可查阅:Python编程:函数参数定义与传递方式。本期内容主要详细介绍如何定义函数输入参数以及实战规则。老规矩,辅助加深理解的示例代码,比便于实操。

闲话少叙,开始正文——记得点赞 + 关注@传新视界 ,前进不迷路 ^_^

python怎么引入数学函数_python计算函数值

本文内容主要涉及如下几个主题方法,文章有点长,请收藏以便查阅。

函数参数即为函数的输入,可分类为五组。

位置或关键字参数:同时允许位置和关键字参数;

可变位置参数:在元组中收集任意数量的位置参数;

可变关键字参数:在字典中收集任意数量的关键字参数;

仅限位置参数:只能作为位置参数传递;

仅限关键字参数:只能作为关键字参数传递。

到目前为止,我们所看到的例子中,看到的所有参数都是普通的位置参数或关键字参数。也已经了解了如何将它们作为位置参数和关键字参数传递。关于它们没有太多要说的了,所以我们要来看看其他类别。在此之前,先来看看可选参数。

1 可选参数

除了我们在这里看到的类别之外,参数还可以分为必选项和可选项。可选参数有默认值,其值在函数定义中指定。语法是格式为:name=value。示例如下:

prints: 1 4 88 func(b=5, a=7, c=9) prints: 42 4 9 func(42, 43, 44) # prints: 42, 43, 44

这里,a是必需传递参数项,而b的默认值是4,c的默认值是88,两者是可选项。重要的是要注意,除了只有关键字的形参外,必需型形参必须始终位于函数定义中所有可选形参的左侧。试着在上面的例子中删除c的默认值,看看会发生什么。

2 不定量位置参数

有时,可能不希望为函数指定位置参数的确切数量,而Python通过使用可变位置参数提供了实现这一点的能力。让我们来看一个非常常见的用例,minimum()函数。

这是一个计算其输入值最小值的函数,代码如下:

print(type(n)) mn = n for value in n[1:]: if value < mn: mn = value print(mn) minimum(1, 3, -7, 9) n = () - prints: nothing

如上所见,当我们定义一个带有星号*的形参时,我们是在告诉Python,当函数被调用时,这个形参将收集数量不定的位置实参。在函数中,n是一个元组。可取消代码中的注释print(type(n))行,然后运行程序并看看输出。

注意,一个函数最多只能有一个不定量位置参数——有更多的位置参数是没有意义的。Python将无法决定如何划分它们之间的参数。您也无法为变量位置参数指定默认值。默认值总是一个空元组。

提示:

是否注意到代码中是如何用一个简单的if n:检查n是否为空的?这是因为在Python中,集合对象在非空时求值为True,否则为False。元组、集合、列表、字典等等都是如此。

另一件需要注意的事情是,当调用不带参数的函数时,可能想抛出一个错误,而不是静默地什么都不做。在这种情况下,我们不关心如何使这个函数健壮,而是要理解可变量位置参数。

另外,是否注意到,定义不定量位置形参的语法与可迭代解包的语法非常相似?这并非巧合。毕竟,这两个特征互为镜像。它们也经常一起使用,因为不定量位置形参让你不必担心解包的可迭代对象的长度是否与函数定义中的形参数量相匹配。

3 不定量关键字参数

不定量关键字参数(Variable keyword parameters)非常类似于不定量位置参数。唯一的区别是语法(**而不是*)和它们以字典形式被收集的事实:

prints {'a': 1, 'b': 42} func() prints {'a': 1, 'b': 46, 'c': 99}

如上所示,在函数定义的参数名称前添加**告诉Python使用该名称来收集数量不定的关键字参数。与不定量位置参数的情况一样,每个函数最多只能有一个可变关键字参数,并且不能指定默认值。

就像可变量位置参数类似于可迭代解包一样,可变关键字参数类似于字典解包。字典解包也经常用于将参数传递给具有可变量关键字形参的函数。

为什么能够传递可变数量的关键字参数如此重要,目前可能还不清楚,那么通过如何使用这一能力的示例,你将能更真实的理解其重要性。

我们定义一个连接到数据库的函数:我们希望通过不带参数地调用这个函数来连接到默认数据库。还希望通过向函数传递适当的参数来连接到任何其他数据库。在你继续读下去之前,自己试着花几分钟自己想出一个解决方案:

39;host': options.get('host', '127.0.0.1'), 'port': options.get('port', 5432), 'user': options.get('user', ''), 'pwd': options.get('pwd', ''), } print(conn_params) db.connect(**conn_params) connect() connect(host='127.0.0.42', port=5433) connect(port=5431, user='admin', pwd='super')

注意,在函数中,我们可以准备一个连接参数字典(conn_params)使用默认值作为回退,其允许在函数调用时提供以覆盖它们。有更好的方法可以用更少的代码行来实现这一点,但我们现在不关心这一点。运行上述代码会得到以下结果:

{'a': 1, 'b': 46, 'c': 99}

{'host': '127.0.0.1', 'port': 5432, 'user': '', 'pwd': ''}

{'host': '127.0.0.42', 'port': 5433, 'user': '', 'pwd': ''}

{'host': '127.0.0.1', 'port': 5431, 'user': 'admin', 'pwd': 'super'}

注意函数调用和输出之间的对应关系,以及如何根据传递给函数的内容重写默认值。

4 仅限位置参数

从Python 3.8开始,PEP 570 (https://www.python.org/dev/peps/pep-0570/)引入了仅限位置的参数。有一种新的函数参数语法,/,表示一组函数形参必须在位置上指定,不能作为关键字参数传递。让我们看一个简单的例子:

prints: 1 2 3 func(1, 2, c=3) # prints 1 2 3

在上面的例子中,我们定义了一个函数func(),它指定了三个参数:a、b和c。函数签名中的/表示a和b必须按位置传递,也就是说,不能通过关键字传递。

示例中的最后两行显示,我们可以按位置传递所有三个参数来调用函数,或者可以按关键字传递c。这两种情况都可以正常工作,因为c定义在函数签名中的/之后。如果我们试图通过通过关键字传递a或b来调用函数,像这样:

func(1, b=2, c=3)

这将产生如下类似回溯跟踪信息:

Traceback (most recent call last):

File "……", line 9, in <module>

func(1, b=2, c=3)

TypeError: func() got some positional-only arguments passed as keyword arguments: 'b'

前面的例子告诉我们,Python现在反馈给我们调用func()的方式,其意思是:通过关键字传递了参数b,但不允许这样做。

仅限位置参数也可以是可选的,如下所示:

prints 4 5 func(3) # prints 3 2

通过一些从官方文档中借来的例子来看看这个特性给该语言带来了什么。一个优点是能够完全模拟现有C编码函数的行为:

def divmod(a, b, /): "模拟内建函数 divmod()" return (a // b, a % b)

另一个重要的用例是在形参名没有啥有意义的帮助的情况下排除关键字实参:

len(obj='hello')

在上面的例子中,obj关键字参数降低了可读性。此外,如果我们希望重构len函数的内部结构,并将obj重命名为the_object(或任何其他名称),更改保证不会破坏任何客户端代码,因为不会有任何对len()函数的调用,会涉及到现在已经过时的obj参数名称。

最后,使用仅限位置形参意味着/左边的任何值都可以在不定量关键字实参中使用,如下例所示:

def func_name(name, /, **kwargs): print(name) print(kwargs) func_name('Positional-only name', name='Name in **kwargs') Positional-only name 39;name': 'Name in **kwargs'}

在函数签名中保留参数名以便在**kwargs中使用的能力可以生成更简单、更清晰的代码。

现在来研究一下仅限位置类似版:仅限关键字参数。

5 仅限关键字参数

Python 3引入了仅限关键字的参数。我们只简要地研究它们,因为它们的用例并不常见。有两种方法可以指定它们,要么在不定量位置参数之后,要么在不定的*之后。来看两个例子。代码如下:

prints: (1, 2, 3) 7 kwo(c=4) kwo(1, 2) TypeError: kwo() missing 1 required keyword-only argument: 'c' def kwo2(a, b=42, *, c): print(a, b, c) kwo2(3, b=7, c=99) prints: 3 42 13 此行出问题——无效于法,并有如下错误 39;c'

正如预期的那样,函数kwo()接受数量可变的位置参数(a)和一个只有关键字的关键字c。调用的结果很简单,你可以取消对第三个调用的注释,以查看Python返回什么错误。

同样的情况也适用于函数kwo2(),它与kwo的不同之处在于,它接受一个位置参数a、一个关键字参数b和一个只有关键字的参数c。你可以取消对第三个调用的注释,以查看产生的错误。

现在应已知道了如何指定不同类型的输入参数,接下来看看如何在函数定义中组合它们。

6 组合输入参数

可以在同一个函数中组合不同的参数类型(事实上,这样做通常非常有用)。就像在同一个函数调用中组合不同类型的实参一样,在顺序上有一些限制:

仅限位置的参数放在前面,然后跟随一个斜杠“/”。

普通参数在任何仅限位置参数之后。

不定量位置参数在正常参数之后。

只有关键字参数在不定量位置参数之后。

不定量关键字参数总是排在最后。

对于仅限位置参数和普通参数,任何必需的参数必须在任何可选参数之前定义。这意味着,如果你有一个可选的仅限位置参数,那么所有常规参数也必须是可选的。该规则不影响仅限关键字的参数。

如果没有例子,这些规则可能会有点难以理解,所以来看几个示例:

39;a, b, c:', a, b, c) print('args:', args) print('kwargs:', kwargs) func(1, 2, 3, 5, 7, 9, A='a', B='b')

注意函数定义中参数的顺序。执行该程序会得到以下结果:

a, b, c: 1 2 3

args: (5, 7, 9)

kwargs: {'A': 'a', 'B': 'b'}

现在再来看一个只有关键字参数的例子:

39;a, b, c:', a, b, c) print('d, e:', d, e) print('args:', args) print('kwargs:', kwargs) allparams(1, 2, 3, 4, 5, 6, e=7, f=9, g=10)

注意,在函数声明中有仅限位置形参和仅限关键字形参:a仅限位置形参,而d和e仅限关键字形参。他们是在*args可变量位置参数之后,如果它们紧跟在单个*的后面,也会是一样的(在这种情况下,将没有任何可变位置参数)。运行程序会得到以下结果:

a, b, c: 1 2 3

d, e: 256 7

args: (4, 5, 6)

kwargs: {'f': 9, 'g': 10}

另一件需要注意的事情是我们为可变量位置参数和关键字参数命名。你可以自由选择不同的名称,但请注意,args和kwargs是这些参数的常规名称,至少在一般情况下是这样。

7 更多的签名示例

为了简要回顾一下使用仅限位置和关键字说明符的函数签名,下面是一些进一步的示例。省略不定量位置和关键字参数,为简洁起见,我们只剩下以下语法:

def xxxFuncName(positional_only_parameters, /, positional_or_keyword_parameters, *, keyword_only_parameters): # 函数体 pass

首先,我们有仅限位置的参数,然后是位置或关键字参数,最后是仅限关键字参数。

其他一些有效签名如下:

def xxxFuncName(p1, p2, /, p_or_kw, *, kw):

def xxxFuncName(p1, p2=None, /, p_or_kw=None, *, kw):

def xxxFuncName(p1, p2=None, /, *, kw):

def xxxFuncName(p1, p2=None, /):

def xxxFuncName(p1, p2, /, p_or_kw):

def xxxFuncName(p1, p2, /):

以上均为有效签名,下列为无效签名:

def xxxFuncName(p1, p2=None, /, p_or_kw, *, kw):

def xxxFuncName(p1=None, p2, /, p_or_kw=None, *, kw):

def xxxFuncName(p1=None, p2, /):

你可以在官方文档中阅读语法规范:

https://docs.python.org/3/reference/compound_stmts.html#functiondefinitions

提示:在这一点上,要很好的理解与掌握,一个有用的练习方法是实现上述示例签名中的任何一个,打印出这些参数的值,就像我们在前面的练习中所做的那样,并以不同的方式传递参数。

8 避免陷阱!可变默认值

要注意的一件事是,在Python中,默认值是在定义时创建的;因此,根据默认值的可变性,对同一函数的后续调用可能会有不同的行为。让我们看一个例子:

39;39; * 12) a.append(len(a)) 影响b的默认值 func() func() func()

两个参数都有可变的默认值。这意味着,如果执行中影响了这些对象,任何修改都将停留在后续的函数调用中。看看你是否能理解这些调用的输出:

{}

{1: 1}

[0, 1]

{1: 1, 2: 2}

是不是很搞事?虽然这种行为一开始看起来很奇怪,但它实际上是有意义的,而且非常方便——例如,当使用“记忆”技术时,就有了天生之才的傲娇。更有趣的是,在调用之间,我们引入了一个不使用默认值的函数,比如:

39;B': 1}) func()

运行代码输出内容如下所示:

{}

[1, 2, 3]

{'B': 1}

{1: 1}

这个输出告诉我们,即使使用其他值调用函数,默认值也会被保留。我想到的一个问题是,如何每次都获得一个新的空值?惯例是这样的:

干些使用a的工作 ...

注意,通过使用前面的技术,如果调用函数时没有传递a,我们总是得到一个全新的空列表。

本文小结

本文详细介绍了函数的输入参数分类、示例和调用,都是围绕如下主题展开:

位置或关键字参数:同时允许位置和关键字参数;

可变位置参数:在元组中收集任意数量的位置参数;

可变关键字参数:在字典中收集任意数量的关键字参数;

仅限位置参数:只能作为位置参数传递;

仅限关键字参数:只能作为关键字参数传递。

希望这一篇文章让你再也不用担心函数的定义和输入参数的定义了。本篇就写到这里了下一篇就是时候看看硬币的另一面——函数输出参数了(返回值)。敬请关注吧,再见。

记得点个赞,关注@传新视界,转发出去啊,分享给更多的朋友。

本文【python怎么引入数学函数_python计算函数值】由作者: 外键 提供,本站不拥有所有权,只提供储存服务,如有侵权,联系删除!
本文链接:https://www.cuoshuo.com/blog/4137.html

(0)
上一篇 2023-03-09 08:29:02
下一篇 2023-03-09 08:36:31

相关推荐

  • 最新主流国外搜索引擎

    我们大家一般知道的搜索引擎应该是,百度,谷歌,bing,360,搜狗,可能对于其他的搜索引擎了解的不多,其实百度在国内是霸主地位,但是它在世界搜索引擎占据的份额怎么样呢?这篇文章我们一起来了解下世界上其他的搜索引擎。 1,google.com 谷歌的地位就不用多说了,世界上除了特殊的几个国家,基本上谷歌都占据了垄断地位的,目前谷歌在全世界的搜索引擎份额达到了…

    2023-03-15
    300
  • 命令提示符高级故障排除怎么操作

    今天给大家带来一点干货,那就是如何进入win10系统的高级启动选项。这时肯定就有人问了:我为什么要进入?进入高级启动选项有什么用?要知道,“高级启动选项”可以在高级疑难解答模式下启动Windows。 而简单来说,高级启动选项菜单是个引导菜单,我们可以通过它设置启动方式,进行系统还原、系统恢复等等的操作,以便在启动或运行出现问题时进行故障排除、诊断和修复。说到…

    2023-03-10
    200
  • web推送服务,微信服务号推送次数

    被折叠的订阅号图文打开率已经锐减至5%上下,服务号和订阅号合并的消息也在坊间流传,有一部分人为了提高图文打开率并获得更多更高的接口与权限,悄悄地把自己的订阅号升级为服务号,可服务号一个自然月只能推四次消息难免成为某些人心中的痛。今天遥望燕园要放个大招,教你突破服务号一个自然月仅能推送四次消息的限制。当然了,所谓的突破不是真正意义上的突破,但这个突破的意义还是…

    2023-03-20
    000
  • linux版本中属于稳定版

    我们为程序员和开发人员总结了 2022 年最好用的 10 款 Linux 发行版,以便他们开展日常工作和个人项目。 由于工作和项目需要,程序员和开发人员会用到各种工具和应用,包括代码编辑器、编译器、插件以及数据库等等。若对现代开发人员的工作流程做一番整理,一般流程如下: 创建代码仓库 编程 调试 测试 部署 上述工作流程需要用到各种各样的工具,一份标准的工具…

    2023-03-09
    700
  • awk命令取出某一行某一列(awk取第一行第一列)

    awk是一个强大的文本分析工具,相对于grep的查找,sed的编辑,awk在对数据分析并生成报告时,显得尤为强大。 简单来说awk就是把文件逐行地读入,以空格为默认分隔符将每行切片,切开的部分再进行各种分析处理。 awk有三个不同的版本:awk、nawk和gawk,未作特别说明,一般指gawk,gawk是awk的GNU版本。 之所以叫awk是因为其取了三位创…

    2023-03-14
    400
  • python中switch语句用法_python中的switch语句

    python没有switch-case语句,官方文档介绍可以用if-elseif-elseif代替。 同时也用其他的解决方案,比较简单的就是利用字典来实现同样的功能。写一个字典,每个key对应的值是一个方法。 如switch = {“valueA”:functionA,”valueB”:functionB,&#…

    2023-03-09
    700
  • linux必学的60个命令解释_linux系统一般用来干嘛

    公众号【传智播客博学谷】回复关键词:前端 PS Java(100G) Python(80G) 大数据 区块链 测试 PPT JS(40g+300教程) HTML 简历 领取相关学习资料! 公众号【传智播客博学谷】回复关键词:前端 PS Java(100G) Python(80G) 大数据 区块链 测试 PPT JS(40g+300教程) HTML 简历 领取…

    2023-03-14
    100
  • excelif函数怎么写多个条件_if公式如何加两个条件

    今天我们继续来学习if条件在公式中的输入,上节介绍了三个及以上条件的嵌套使用,这里作者来讲解一下多条件并列在公式中的写法。 如下图所示,要计算某品种酒的储藏品质,数据表设置两个并列条件,分别为: 条件一、储藏年份在四星及以上星级。 条件二、品种为浓香型或酱香型; 当满足这两个条件时,其储藏品质为优质,若满足其一或都不满足则储藏品质为普通。 通过上述描述,很明…

    2023-03-14
    300
  • vector嵌套vector用法 vector中函数用法

    一:介绍 vector是C++标准模板库,是一个容器,底层是数组,为连续内存。 命名空间为std,所属头文件为<vector> 注意:不是<vector.h> vector存储数据时,会分配一个存储空间,如果继续存储,该分配的空间已满,就会分配一块更大的内存,把原来的数据复制过来,继续存储,这些性能也会一定程度上会有损耗 二:常用操作…

    2023-03-15
    300
  • dropdownlist怎么清空

    下拉列表,又称下拉框,是一个可切换列表,其中包含多个选项,一次只能选择一个选项。 当你需要从多个答案中选中某一个时,可以采用此部件。比如国家的选择/地区的选择等。 添加,删除和重新排序Droplist选项 9DropList.png 元件添加:直接从左侧元件库上拖入; 下拉列表的编辑:直接双击Droplist; 选项的添加:点击左侧上方添加按钮(上图中第一个…

    2023-03-20
    000

发表回复

登录后才能评论
返回顶部
错说博客上线啦!