文档章节

Python传入参数的几种方法

每天学Python
 每天学Python
发布于 01/20 14:35
字数 1933
阅读 248
收藏 0

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

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

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

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

位置参数

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

演示一:

在学习过程中有什么不懂得可以加我的
python学习扣扣qun,784758214
群里有不错的学习视频教程、开发工具与电子书籍。
与你分享python企业当下人才需求及怎么从零基础学习好python,和学习什么内容
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个)参数(类似于列表、字典)

#传入一个列表,严格地说这不是可变参数
def calc(l):
sum = 0
for n in l:
sum += n
return sum
>>> calc([1,2,3])
7
#这才是可变参数,虽然在使用上和列表没有区别,但是参数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个或多个参数(注意区别,一个是字典一个是列表);在传递参数时用等号(=)连接键和值

在学习过程中有什么不懂得可以加我的
python学习扣扣qun,784758214
群里有不错的学习视频教程、开发工具与电子书籍。
与你分享python企业当下人才需求及怎么从零基础学习好python,和学习什么内容
#用两个星号表示关键字参数
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解释器看的,如果一个星号也没有的话就无法区分命名关键字参数和位置参数了,而如果有一个星号即使来自变长参数就可以区分开来)

#Python学习交流QQ群:857662006 
#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
博文 65
码字总数 95713
作品 0
广州
私信 提问
加载中

评论(0)

命令行运行Python脚本时传入参数的三种方式

三种常用的方式 如果在运行python脚本时需要传入一些参数,例如与,可以使用如下三种方式。 python script.py 0,1,2 10 python script.py -gpus=0,1,2 --batch-size=10 python script.py -g...

yzy121403725
2018/06/27
0
0
Python 4 种不同的存取文件骚操作

最近开始学习tensorflow框架,选修课让任选一种框架实现mnist手写数字的识别分类。小詹也就随着大流选择了 tf 框架,跟着教程边学边做,小詹用了不同的神经网络实现了识别分类,其中有一个步...

技术小能手
2018/06/20
0
0
Python里面这些点,据说80%的新手都会一脸懵逼

Python虽然语法简单,通俗易懂,但是再简单它也是一门语言,就像一棵大树,总有一些树枝是弯弯绕绕的,让新手看完之后一脸懵逼,今天我们就来说说这几个点,反正我学的时候是很困惑的! 01.函...

糖宝lsh
2018/10/14
59
1
Python自学笔记之函数1——调用函数

调用函数 Python的内置函数很多,可至其管网查看文档:https://docs.python.org/2/library/functions.html 在知道函数名的情况下也可以在命令行用help()查看帮助信息。例如Python中求绝对值的...

twobeings
2015/03/19
130
0
理解 Python 的 Dataclasses(一)

如果你正在阅读本文,那么你已经意识到了 Python 3.7 以及它所包含的新特性。就我个人而言,我对 感到非常兴奋,因为我等了它一段时间了。 本系列包含两部分: Dataclass 特点概述 在下一篇文...

02%
2018/09/02
0
0

没有更多内容

加载失败,请刷新页面

加载更多

0228 我的潘多拉

我的潘多拉 从一个故事说起。<br />从前,有个Java程序员非常喜欢写程序,喜欢研究源码,读英文文档。但是它在一家小公司里工作,公司的技术栈很陈旧。<br /> <br />单个系统代码中含有很多的...

李福春carter
46分钟前
18
0
OSChina 周六乱弹 —— 屁会不会传染病毒

Osc乱弹歌单(2020)请戳(这里) 【今日歌曲】 @薛定谔的兄弟 :分享洛神有语创建的歌单「我喜欢的音乐」: 《ハレハレヤ(朗朗晴天)》- 猫瑾 手机党少年们想听歌,请使劲儿戳(这里) @空格...

小小编辑
59分钟前
53
1
两个值得注意的问题

对成员变量的操作只能放在方法中,方法可以对成员变量和方法体中自己定义的局部 变量进行操作.在定义类的成员变量时可以同时赋予初值,如 class A { int a=12; float b=12.56f; } 但是不可以这...

咔啡
今天
27
0
第三章 分布式服务框架的选择

1.大项目工程且多人维护的弊端 (1)项目团队协同成本高,业务响应越来越慢 (2)应用复杂度已超出人的认知负载(向杂乱的电线一样) (3)错误难于隔离(一个模块出错,整个系统挂掉) (4...

zxx901221
今天
68
0
eclipse 上传jar到远程仓库

使用maven的项目中,有时需要把本地的项目打成jar包上传到mevan仓库。 操作如下: 前提:pom文件中配置好远程库的地址,否则会报错 一、将maven 中的settings文件配置好用户名和密码,如下:...

文文1
昨天
63
0

没有更多内容

加载失败,请刷新页面

加载更多

返回顶部
顶部