参数类型

Python函数的参数类型一共有五种,分别是:

POSITIONAL_OR_KEYWORD(位置参数或关键字参数)

VAR_POSITIONAL(可变参数)

KEYWORD_ONLY(关键字参数)

VAR_KEYWORD(可变关键字参数)

POSITIONAL_ONLY(位置参数)

下面用举几个例子解释一下这5个参数类型的含义:

POSITIONAL_OR_KEYWORD如其名所见,既可以用位置传参,也可以用关键字传参,并且他没有任何*的声明

>>> def foo(name):

... print(name)

...

>>> foo("hello")

hello

>>> foo(name="hello")

hello

VAR_POSITIONAL是可变参数,通过*来声明,它会把接收到的值存入一个元组

>>> def foo(*args):

... print(args)

...

>>> foo(1, 2, 3, 4, 5)

(1, 2, 3, 4, 5)

KEYWORD_ONLY只能通过关键字传参,这种参数会在VAR_POSITIONAL参数类型的后面,而且不带**前缀,如同语义,只能通过指定关键字来传参,不可以用位置传参

>>> def foo(n1, *, n2):

... print(n1, n2)

...

>>> foo("hello", n2="world")

hello world

VAR_KEYWORD是可变关键字参数,通过前缀**来声明,这种参数类型可以接收0个或多个参数,并存入一个字典

>>> def foo(**kwargs):

... for key, value in kwargs.items():

... print("%s=%s" % (key, value))

...

>>> foo(a=1, b=2, c=3)

a=1

b=2

c=3

POSITIONAL_ONLY是第五个参数类型,但是它已经不重要了,因为高版本的Python无法创建一个POSITIONAL_ONLY类型的参数,但是有些使用C语言实现且不接收关键字参数的函数(如divmod)支持

从下面的例子,我们可以看到,新定义的foo函数,每个参数都对应到上面的一个类型

>>> def foo(name, *args, middle=None, **kwargs):

... print("name:", name)

... print("args:", args)

... print("middle:", middle)

... print("kwargs:", kwargs)

...

>>> foo("hello", 1, 2, 3, middle="world", a=1, b=2, c=3)

name: hello

args: (1, 2, 3)

middle: world

kwargs: {'a': 1, 'b': 2, 'c': 3}

>>> my_foo = {"name": "hello", "middle": "world", "a": "1", "b": "2", "c": "3"}

>>> foo(**my_foo)

name: hello

args: ()

middle: world

kwargs: {'a': '1', 'b': '2', 'c': '3'}

>>> from inspect import signature

>>> sig = signature(foo)

>>> for name, param in sig.parameters.items():

... print(param.kind, ":", name, '=', param.default)

...

POSITIONAL_OR_KEYWORD : name =

VAR_POSITIONAL : args =

KEYWORD_ONLY : middle = None

VAR_KEYWORD : kwargs =

参数绑定

将函数的参数绑定到一个字典上

>>> def foo(name, *args, middle=None, **kwargs):

... print("name:", name)

... print("args:", args)

... print("middle:", middle)

... print("kwargs:", kwargs)

...

>>> my_foo = {"name": "hello", "middle": "world", "a": "1", "b": "2", "c": "3"}

>>> from inspect import signature

>>> sig = signature(foo)

>>> bound_args = sig.bind(**my_foo)

>>> for name, value in bound_args.arguments.items():

... print(name, '=', value)

...

name = hello

middle = world

kwargs = {'a': '1', 'b': '2', 'c': '3'}

>>> del my_foo["name"]

>>> bound_args = sig.bind(**my_foo)

Traceback (most recent call last):

...

TypeError: missing a required argument: 'name'

在inspect模块的帮助下,展示了Python数据模型把实参绑定给函数调用的形参的机制,这与解释器使用的机制相同,当我们删除字典中的name,执行时会报错缺少name参数。

再者,我们使用operator模块进行参数绑定

>>> from operator import methodcaller

>>> s = "The time has come"

>>> upcase = methodcaller("upper")

>>> upcase(s)

'THE TIME HAS COME'

>>> hiphenate = methodcaller("replace", " ", "-")

>>> hiphenate(s)

'The-time-has-come'

如上,methodcaller创建的函数会在对象上调用参数指定的方法,我们可以自己建立一个对象并生成自己的方法,再用methodcaller调用

class Person:

def __init__(self, name):

self.name = name

def say(self, text):

print(self.name, 'say:', text)

p = Person("John")

person_say = methodcaller("say", "hello")

person_say(p)

最后会打印:

John say: hello

使用function.partial冻结参数

function.partial这个高阶函数用于部分应用函数,部分应用是指,基于一个函数创建一个新的可调用对象,把原函数的某些参数固定

>>> from operator import mul

>>> from functools import partial

>>> triple = partial(mul, 3)

>>> triple(7)

21

>>> list(map(triple, range(1, 10)))

[3, 6, 9, 12, 15, 18, 21, 24, 27]

如上,我们使用mul创建了triple函数,把第一个参数固定为3,然后返回一个可调用的对象,再传入不同的参数

python中函数的不定长参数

例1: #定义一个含有不定长参数的函数,本例第三个参数*args def sum_nums(a,b,*args): print('_'*30) print(a) print(b) print(args ...

对Python中函数参数类型及排序问题,三个方面的总结

Python中函数的参数问题有点复杂,主要是因为参数类型问题导致的情况比较多,下面来分析一下. 参数类型:缺省参数,关键字参数,不定长位置参数,不定长关键字参数. 其实总共可以分为 位置参数和关键字参 ...

python中函数的参数

函数参数(一) 思考一个问题,如下: 现在需要定义一个函数,这个函数能够完成2个数的加法运算,并且把结果打印出来,该怎样设计?下面的代码可以吗?有什么缺陷吗? def add2num(): a = 1 ...

Python中函数的参数传递与可变长参数

转自旭东的博客原文 Python中函数的参数传递与可变长参数 Python中传递参数有以下几种类型: (1)像C++一样的默认缺省函数 (2)根据参数名传参数 (3)可变长度参数 示例如下: (1)默 ...

python 中函数的参数

一.python中的函数参数形式 python中函数一般有四种表现形式: 1.def function(arg1, arg2, arg3...) 这种是python中最常见的一中函数参数定义形式,函数 ...

python中函数的参数解析

python中函数的各种参数梳理: 1.形参:函数定义时传入的参数 2.实参:函数调用时传入的参数 (有形参必传实参,形参里自身特点可不传的,可传可不传) 3.缺省参数:不传为默认值,传了会覆盖(下面 ...

(转)python中函数参数中如果带有默认参数list的特殊情况

在python中函数参数中如果带有默认参数list遇到问题 先看一段代码 1 2 3 4 5 6 7 8 9 def f(x,l=[]):     for i in range(x):         ...

python中函数参数的引用方式

值传递和引用传递时C++中的概念,在python中函数参数的传递是变量指向的对象的物理内存地址!!! python不允许程序员选择采用传值还是传引用.Python参数传递采用的肯定是“传对象引用”的方 ...

Python中函数的参数-arguments

归纳起来,Python中函数的定义形式和调用形式主要有如下几种形式: # 函数的定义形式 def func(name) # 匹配positional参数或者keyword参数 def func(nam ...

随机推荐

JDBC使用事务实例

package qddx.JDBC; import java.sql.*; public class useTransaction { public static void main(String[] ...

jquery 集合操作

修剪字符串 $.trim(value) 功能: 删除传入的字符串开头和结尾的空白 [空白]匹配js正则中的\s,也就是包括空白,换行,回车,制表符,换页以及Unicode字符\u00A0 返回值: 返 ...

UITabBarController的使用和坑

本人apem 说到UITabBarController, 最首要的坑就是tabbar的图片不显示的问题 1. tabbar上的图片一定要2套以上, 例如一个uitabbaritem的image是 se ...

python之对指定目录文件夹的批量重命名

python之对指定目录文件夹的批量重命名 import os,shutil,string dir = "/Users/lee0oo0/Documents/python/test" ...

明明已经执行Log.i,偏偏打不出日志

Android内打日志用的当然是Log.i(tag,string),调试时的日志输出可以很快的反映一些问题,方便我们跟进. 但是如果连日志都打不出来了怎么办呢,我今天就遇到了比较坑的问题.项目里别的日 ...

DB2 Unload 的时候遇到B37-04

B37-04的问题是每个Mainframer首先会遇到的问题,在Unload的时候最大的可能性是Extend次数到16次了,这时候只要加大primary或secondary就可以了,我最常用的是pri ...

【转】Android设置虚线、圆角、渐变

Android虚线圆角渐变 有图又真相,先上图再说. 点击效果: 设置虚线: <?xml  version="1.0" encoding="utf-8" ...

What&&num;39&semi;s this&quest;(js)

What's this? 由于运行期绑定的特性,JavaScript 中的 this 含义非常多,它可以是全局对象.当前对象或者任意对象,这完全取决于函数的调用方式 随着函数使用场合的不同,this的 ...

Tomcat 或JBOSS java&period;lang&period;ArrayIndexOutOfBoundsException&colon; 8192 解决方案【转】

错误信息: 2017-1-17 10:09:39 org.apache.catalina.core.StandardWrapperValve invoke 严重: Servlet.service() ...

pyspark实现自动提示以及代码高亮

pyspark实现自动提示以及代码高亮 起因 打开pyspark发现啥提示都没有,太不友好了啊,然后忍不住谷歌了一下,发现了这篇文章,内容如下: 1.pip install ptpython; 2.e ...

html绑定带有形参的函数,Python中函数参数类型和参数绑定相关推荐

  1. python中函数的参数

    函数参数(一) 思考一个问题,如下: 现在需要定义一个函数,这个函数能够完成2个数的加法运算,并且把结果打印出来,该怎样设计?下面的代码可以吗?有什么缺陷吗? def add2num():a = 11 ...

  2. Python中函数的参数传递方式

    Python中函数的参数传递方式 .普通的参数传递 >>> def add(a,b):return a+b >>> print add(1,2) 3 >> ...

  3. python中怎么调用函数_浅谈Python中函数的定义及其调用方法

    一.函数的定义及其应用 所谓函数,就是把具有独立功能的代码块组织成为一个小模块,在需要的时候调用函数的使用包含两个步骤 1.定义函数–封装独立的功能 2.调用函数–享受封装的成果 函数的作用:在开发时 ...

  4. 不显示参数名_第51p,万能参数与返回值,Python中函数的返回值

    大家好,我是杨数Tos,这是<从零基础到大神>系列课程的第51篇文章,第三阶段的课程:Python进阶知识:详细讲解Python中的函数(四)====>函数的参数与返回值(下篇). ...

  5. python函数定义及调用-浅谈Python中函数的定义及其调用方法

    一.函数的定义及其应用 所谓函数,就是把具有独立功能的代码块组织成为一个小模块,在需要的时候调用函数的使用包含两个步骤 1.定义函数�C封装独立的功能 2.调用函数�C享受封装的成果 函数的作用:在开 ...

  6. python中函数的使用

    python中函数的使用 函数:一个带有名字的代码块,用于执行某些特定的任务.例如:当某些代码需要多次被重复执行时,就可以将代码封装为一个函数.当需要使用函数中的代码时,直接调用即可. 1.函数的使用 ...

  7. 如何理解python中的函数_如何理解“python中函数是一等公民”?

    python.js.scala等支持函数式编程的语言中,是如何体现"函数是一等公民(first class)"的?而在c/c++.java等静态语言中的一等公民又是什么?如何体现的 ...

  8. python中可变参数args传入函数时储存的类型是_[转载]Python中函数的参数定义和可变参数*args与**args...

    Python中函数的参数定义和可变参数 *args与**args区别 刚学用Python的时候,特别是看一些库的源码时,经常会看到func(*args, **kwargs)这样的函数定义,这个*和** ...

  9. python中函数参数传递的三种方式_python中函数参数传递的几种方法

    转自  http://www.douban.com/note/13413855/ Python中函数参数的传递是通过"赋值"来传递的.但这条规则只回答了函数参数传递的"战 ...

最新文章

  1. 在普通PC上安装XENSERVER 6.2
  2. 三代测序(SMRT Sequencing)
  3. 通过卫星图像预测区域内降雨范围和降雨量
  4. python 双边滤波与高斯滤波
  5. Java中switch都可以支持哪些数据类型
  6. 【转】 Android - LayoutInflate用法
  7. 第三次学JAVA再学不好就吃翔(part42)--内部类概述
  8. 前端学习(2228):react之状态三
  9. 人工智能丰收时代,传统营销企业如何应对?
  10. javascript比较日期
  11. STM32/STM8选型手册
  12. GAOT工具箱(遗传算法)的应用
  13. 课程设计 计算机公共基础,基于Moodle的大学计算机公共基础课程设计.pdf
  14. 50个C/C++面试题
  15. MSP430F5529 多路PWM输出控制舵机和电机
  16. 用python把图片换成蓝底_详解Python给照片换底色(蓝底换红底)
  17. js 清除对象里的属性值为空的属性
  18. Java File、Paths、Path的意外错误:file.exists() 结果错误
  19. LaTex: 多种方法实现图片复杂排列
  20. 知到网课大学生心理健康教育考试试题|真题题库(含答案)

热门文章

  1. 云计算介绍 tcp/ip协议介绍及配置
  2. 计算机科学与技术论文提纲,学分有关论文范例,与计算机科学与技术系相关毕业论文提纲范文...
  3. Unity内嵌网页插件
  4. centos7 trac安装
  5. 【题解】老虎的数字游戏
  6. 千里之行始于足下,Python编写进度条
  7. 科技云报道:元宇宙,会是云计算的下一个新战场吗?
  8. 织梦DEDECMS零基础学会如何做网站
  9. Batch Copy files and Replace content accordingly
  10. 定时器软件RH Timer for Mac了解一下