详解Python传入参数的几种方法

Python传入参数的方法有:位置参数、默认参数、可变参数、关键字参数、和命名关键字参数、以及各种参数调用的组合

写在前面

Python唯一支持的参数传递方式是『共享传参』(call by sharing)

多数面向对象语言都采用这一模式,包括Ruby、Smalltalk和Java(Java的引用类型是这样,基本类型按值传递)

共享传参是指函数的各个形式参数获得实参中各个引用的副本;也就是说,函数内部的形参是实参的别名(alias)

这种方案的结果是,函数可能会修改作为参数传入的可变对象,但是无法修改那些对象的标识(即不能把一个对象替换为另一个对象)

位置参数

位置参数是最简单的传入参数的方式,在其它的语言中也常常被使用

演示一:

def func(a, b):
  print(a+b)

func(1, 2) #3

演示二:

def power(x, n):
  s = 1
  while(n > 0):
    n -= 1
    s *= n
  return s

power(2, 3) #8

默认参数

默认参数就是在调用函数的时候使用一些包含默认值的参数

def power(x, n=2):
  s = 1
  while(n > 0):
    n -= 1
    s *= n
  reutrn s

power(3)  #9
power(2, 3) #8

定义默认参数要牢记一点:默认参数必须指向不变对象!

#以下这个函数如果被多次调用会在默认添加多个END字符串
def add_end(l = []):
  l.append('END')
  return l
#为了避免这个问题,应该把传入的默认参数设置为不可变的
def add_end(l = None):
  l = []
  l.append('END')
  return l

可变参数

可变参数就是允许在调用参数的时候传入多个(≥0个)参数(类似于列表、字典)

#这才是可变参数,虽然在使用上和列表没有区别,但是参数nums接收到的是一个tuple(这些参数在传入时被自动组组装为一个元祖)
def calc(*nums):
  sum = 0
  for n in nums:
    sum += n
  return sum

>>> calc(1,2,3)
7

>>> my_ls = [1,2,3]
>>> calc(*my_ls)
7

关键字参数

可变参数允许传入0个~多个参数,而关键字参数允许在调用时以字典形式传入0个或多个参数(注意区别,一个是字典一个是列表);在传递参数时用等号(=)连接键和值

#用两个星号表示关键字参数
def person_info(name, age, **kw):
  print("name", name, "age", age, "other", kw)

>>> person_info("Xiaoming", 12)
name Xiaoming age 12 other{}
>>> person_info("Dahuang", 35, city = "Beijing")
name Dahuang age 35 other {'city':'Beijing'}

命名关键字参数

命名关键字参数在关键字参数的基础上限制传入的的关键字的变量名

和普通关键字参数不同,命名关键字参数需要一个用来区分的分隔符*,它后面的参数被认为是命名关键字参数

#这里星号分割符后面的city、job是命名关键字参数
person_info(name, age, *, city, job):
  print(name, age, city, job)

>>> person_info("Alex", 17, city = "Beijing", job = "Engineer")
Alex 17 Beijing Engineer  #看来这里不再被自动组装为字典

不过也有例外,如果参数中已经有一个可变参数的话,前面讲的星号分割符就不要写了(其实星号是写给Python解释器看的,如果一个星号也没有的话就无法区分命名关键字参数和位置参数了,而如果有一个星号即使来自变长参数就可以区分开来)

#args是变长参数,而city和job是命名关键字参数
person_info(name, age, *args, city, job):
  print(name, age, args, city)

>>> person_info("Liqiang", 43, "balabala", city = "Wuhan", job = "Coder")
Liqiang 43 balabala Wuhan Coder

参数组合

总结一下,在Python中一种可以使用5中传递参数的方式(位置参数、默认参数、变长参数、关键字参数、命名关键字参数)

注意,这些参数在书写时要遵循一定的顺序即:位置参数、默认参数、变长参数、关键字参数、命名关键字参数(和本文的行文顺序一致)

这里简单举两个栗子

def f1(a, b, c=0, *args, **kw):
  print("a = ", a, "b = ", b, "args = ", args, "kw = ",kw)
def f2(a, b, c=0, *, d, **kw):
  print("a = ", a, "b = ", b, "c = ", c, "d = ", d, "kw = ", kw)

>>> f1(1, 2)
a = 1 b = 2 c = 0 args =() kw = {}
>>> f1(1, 2, c=3)
a = 1 b = 2 c = 3 args = () kw = {}
>>> f1(1, 2, 3, 'a', 'b')
a = 1 b = 2 c = 3 args = ('a', 'b') kw = {}
>>> f1(1, 2, 3, 'a', 'b', x = 99)
a = 1 b = 2 c = 3 args = ('a', 'b') kw = {'x':99}
>>> f2(1, 2, d = 99, ext = None)
a = 1 b =2 c = 0 d = 99 kw = {'ext':None}

写在后面

关于Python参数传递,有以下几点提请注意:

1)参数的传递是通过自动将对象赋值给本地变量名来实现的
函数参数在实际中只是Python赋值的另一个实例而已,因为引用可以是以指针的形式来实现的,所有的参数实际上都是通过指针进行传递的,作为参数被传递的对象从来不自动拷贝

2)在函数内部的参数名的赋值不会影响调用者
在函数运行时,在函数头部的参数名时一个新的、本地的变量名,这个变量名是在函数的本地作用域内的,函数参数名和调用者作用域中的变量是没有区别的

3)改变函数的可变对象参数的值也许会对调用者有影响
换句话说,因为参数是简单地赋值给传入的对象,函数就能够就地改变传入的可变对象,因此其结果会影响调用者;可变参数对函数来说可以做输入和输出的

Python的通过赋值进行传递的机制与C++的引用参数选项不完全相同,但是实际中,它与C语言的参数传递模型相当类似:

1)不可变参数“通过值”进行传递
像整数和字符串这样的对象是不可变对象,它们通过对象引用而不是拷贝进行传递的,但是因为无论如何都不可能在原处改变不可变对象,实际的效果就很像创建了一份拷贝

2)可变对象是通过“指针”进行传递的
列表和字典这样的对象也是通过对象引用进行传递的,这一点与C语言使用指针传递数组很相似,可变对象能够在函数内部进行原处的改变,这一点和C数组很像

总而言之,理解Python的变量、函数的关键就是理解『绑定』的概念——绑定就是绑定对象,理解了这一点就好办了

以上所述是小编给大家介绍的Python传入参数的几种方法详解整合,希望对大家有所帮助,如果大家有任何疑问请给我留言,小编会及时回复大家的。在此也非常感谢大家对我们网站的支持!

(0)

相关推荐

  • python3利用ctypes传入一个字符串类型的列表方法

    c语言里:c_p.c #include <stdio.h> void get_str_list(int n, char *b[2]) { printf("in c start"); for(int i=0;i<n;i++) { printf("%s", *(b+i)); printf("\n"); } printf("in c end"); } 编译为动态库的命令: gcc -o hello1.so -sha

  • python通过urllib2获取带有中文参数url内容的方法

    本文实例讲述了python通过urllib2获取带有中文参数url内容的方法.分享给大家供大家参考.具体如下: 对于中文的参数如果不进行编码的话,python的urllib2直接处理会报错,我们可以先将中文转换成utf-8编码,然后使用urllib2.quote方法对参数进行url编码后传递. content = u'你好 jb51.net' content = content.encode('utf-8') content = urllib2.quote(content) api_url =

  • python中sys.argv参数用法实例分析

    本文实例讲述了python中sys.argv参数用法.分享给大家供大家参考.具体分析如下: 在学python的过程中,一直弄不明白sys.argv[]的意思,虽知道是表示命令行参数,但还是有些稀里糊涂的感觉. 今天又好好学习了一把,总算是大彻大悟了. Sys.argv[]是用来获取命令行参数的,sys.argv[0]表示代码本身文件路径,所以参数从1开始,以下两个例子说明: 1.使用sys.argv[]的一简单实例 import sys,os os.system(sys.argv[1]) 这个例

  • Python函数中定义参数的四种方式

    Python中函数参数的定义主要有四种方式: 1. F(arg1,arg2,-) 这是最常见的定义方式,一个函数可以定义任意个参数,每个参数间用逗号分割,用这种方式定义的函数在调用的的时候也必须在函数名后的小括号里提供个数相等 的值(实际参数),而且顺序必须相同,也就是说在这种调用方式中,形参和实参的个数必须一致,而且必须一一对应,也就是说第一个形参对应这第一个实参.例如: 复制代码 代码如下: def a(x,y):print x,y 调用该函数,a(1,2)则x取1,y取2,形参与实参相对应

  • 在Python中将函数作为另一个函数的参数传入并调用的方法

    在Python中,函数本身也是对象,所以可以将函数作为参数传入另一函数并进行调用 在旧版本中,可以使用apply(function, *args, **kwargs)进行调用,但是在新版本中已经移除,以function(*args, **kwargs)进行替代,所以也不应该再使用apply方法 示例代码: def func_a(func, *args, **kwargs): print(func(*args, **kwargs)) def func_b(*args): return args i

  • python传递参数方式小结

    本文实例总结了python传递参数方式.分享给大家供大家参考.具体分析如下: 当形参如*arg时表示传入数组,当形参如**args时表示传入字典. def myprint(*commends,**map): for comm in commends: print comm for key in map.keys(): print key,map[key] myprint("hello","word",username="tian",name=&q

  • Python函数参数类型*、**的区别

    刚开始学习python,python相对于java确实要简洁易用得多.内存回收类似hotspot的可达性分析, 不可变对象也如同java得Integer类型,with函数类似新版本C++的特性,总体来说理解起来比较轻松.只是函数部分参数的"*"与"**",闭包等问题,着实令人迷糊了一把,弄清概念后写下此文记录下来,也希望本文能够帮助其他初学者. 所以本文是一篇学习笔记,着重于使用的细节和理解上,首先分别介绍了函数各种参数类型在调用和声明时的区别,及其在混用时需要注意

  • python实现读取命令行参数的方法

    本文实例讲述了python读取命令行参数的方法.分享给大家供大家参考.具体分析如下: 如果想对python脚本传参数,python中对应的argc, argv(c语言的命令行参数)是什么呢? 需要模块:sys 参数个数:len(sys.argv) 脚本名:    sys.argv[0] 参数1:     sys.argv[1] 参数2:     sys.argv[2] test.py: import sys print "脚本名:", sys.argv[0] for i in rang

  • 详细介绍Python函数中的默认参数

    import datetime as dt def log_time(message, time=None): if time is None: time=dt.datetime.now() print("{0}: {1}".format(time.isoformat(), message)) 最近我在一段Python代码中发现了一个因为错误的使用默认参数而产生的非常恶心的bug.如果您已经知道关于默认参数的全部内容了,只是想嘲笑一下我这可笑的错误,请直接跳到本文末尾.哎,这段代码是我

  • Python自定义函数的创建、调用和函数的参数详解

    函数是组织好的,可重复使用的,用来实现单一,或相关联功能的代码段.函数能提高应用的模块性,和代码的重复利用率.你已经知道Python提供了许多内建函数,比如print().但你也可以自己创见函数,这被叫做用户自定义函数.一.定义一个函数你可以定义一个由自己想要功能的函数,以下是简单的规则: 1.函数代码块以def关键词开头,后接函数标识符名称和圆括号().2.任何传入参数和自变量必须放在圆括号中间.圆括号之间可以用于定义参数.3.函数的第一行语句可以选择性地使用文档字符串-用于存放函数说明.4.

随机推荐